Prolog:一种编译语言、解释语言还是两者兼备?

8

有编译器可以编译Prolog,但其他网站称该语言本身是一种解释性语言。我对Prolog是否真的是解释性语言感到困惑。请问有人能澄清这个语言究竟是什么?它是编译型语言还是解释型语言?


3
当然,这取决于Prolog实现。 - user1812457
5
语言本身只是一种语言:你可以编译它,解释它,阅读它,解析它,将其翻译成其他语言等等... - mat
2个回答

9
大多数实现都编译成字节码并在Prolog虚拟机上运行。不同的实现使用其自己的虚拟机,具有不同的设计选择和权衡。GNU-Prolog最初是Prolog到C的“转换器”,现在已经编译为本地代码。还有Logtalk(带有Prolog的OOP),据我所知,它会重新编写Logtalk源代码以适应Prolog。它可以使用一系列Prolog实现作为后端,因此可以用作Prolog实现之间的兼容性层。这个问题真的无法回答;您应该阅读您感兴趣的每个Prolog实现的文档。然而,您能够得到的最好答案是特定Prolog实现的答案。Prolog语言只是一个编程语言,不是运行时、虚拟机或编译器等。

6
你是正确的。关于Logtalk,它的编译器是一个三阶段编译器,第三个也是最后一个阶段是在生成的中间Prolog文件上调用后端Prolog编译器。当然,这取决于所选择的后端Prolog编译器。这不是一种罕见的方法(例如早期的C++和Cfront)。 - Paulo Moura

9
为了回答这个问题,让我们先明确一些定义。
编译型语言是将源代码文件转换成可独立执行的形式(二进制、字节码等),或者转换成库以与其他程序链接。构造固定,不能修改。
解释型语言是将构造转换成可执行形式。每个转换后的构造通常会被放入一个存储区,以便后续构造引用。
现在许多编程语言既可以编译也可以解释,没有规定编程语言只能是其中之一。
在早期,大多数编程语言都是编译型或解释型的,例如C++——编译型,BASIC——解释型。
现在来回答你的问题:
Prolog:编译型语言、解释型语言还是两者兼备?
Prolog语言可编译,也可解释,因此答案是两者兼备。
不同网站给出不同答案的原因在于你正在询问语言本身,把Prolog语言看作一个抽象概念,但具体实现则指的是具体实现。因此,有些实体只进行编译或解释,而有些则两者兼备。
在我看来,过去几年中,普遍认为,如果你有一个主要的编程语言,它必须具备编译器来生成高效的代码和 REPL,使用解释器进行快速构建开发。

通常的趋势是使用 REPL 开发和测试基本的编程结构,然后将它们移动到源代码文件中,以编译构建库。然后从 REPL 引用这些库;反复操作。

有趣的是,Prolog 是我使用的第一种同时具备这两个功能的语言,那还是在 1980 年代。

如果您阅读 ISO/IEC 13211 Information technology -- Programming languages -- Prolog -- Part 1: General core,它会说明:

这种语言起源于1970年代初期,当时Robert A. Kowalski在爱丁堡大学(后来在伦敦帝国学院)和Alain Colmerauer在法国Aix-Marseilles大学工作。他们的努力导致了在1972年将形式逻辑作为一种编程语言的基础。Kowalski的研究提供了理论框架,而Colmerauer则创造了编程语言Prolog。Colmerauer及其团队随后建立了第一个解释器,爱丁堡大学AI部门的David Warren制作了第一个编译器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接