Prolog:编译或解释语言或两者兼而有之?

Prolog: a compiled or interpreted language or both?

有 prolog 的编译器,但其他网站说该语言本身是一种解释型语言。如果序言真的是一种解释语言,我很困惑。有人可以澄清一下这种语言到底是什么吗?编译型语言还是解释型语言?

大多数实现在 Prolog VM 上编译为字节码和 运行。实现使用具有不同设计选择和权衡的自己的 VM。

GNU-Prolog 开始是作为 C "transpiler" 的 Prolog,现在它被编译成本地代码。

您还有 Logtalk(OOP with Prolog),据我所知,它将 Logtalk 源代码重写为 Prolog。它可以使用一整套 Prolog 实现作为后端,因此它可以用作 Prolog 实现之间的兼容层。

这个问题实在无法回答;您应该阅读您感兴趣的每个 Prolog 实现的文档。然而,您可以获得的最佳答案是特定的 Prolog 实现是如何做到的。 Prolog 语言就是这样:一种编程语言,而不是 运行time 或 VM 或编译器等等。

为了回答这个问题,让我们确定一些定义。

编译语言是一种将源代码文件转换为一种形式(二进制、字节码等)以供独立执行或转换为库以与其他程序链接的语言。构造是固定的,无法修改。

解释型语言是一种将构造转换为可以在转换后执行的形式的语言。每个转换后的构造通常会放入一个存储中,供以后的构造引用。

现在很多编程语言既可以编译又可以解释,没有规定说编程语言只能是其中之一。

在早期,大多数编程语言都是其中之一,例如C++ - 编译,BASIC - 解释。

现在回答你的问题:

Prolog: a compiled or interpreted language or both?

Prolog 语言既可以编译又可以解释,所以答案都是。

您在不同站点看到不同答案的原因是您询问的是语言,将 Prolog 语言视为一个抽象概念,但查看具体实现,将网站视为指代具体实施。所以有些实体做其中之一,有些则两者都做。

在过去的几年里,在我看来,共识正在变成,如果你有一个主要的编程语言,它必须有一个编译器来生成高效的代码和一个使用解释器来快速开发结构的 REPL .

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

有趣的是,Prolog 是我使用的第一种兼具两者的语言,那是在 1980 年代。

如果您阅读 ISO/IEC 13211 Information technology -- Programming languages -- Prolog -- Part 1: General core 它指出:

The language originates from work in the early 1970s by Robert A. Kowalski while at Edinburgh University (and ever since at Imperial College, London) and Alain Colmerauer at the University of Aix-Marseilles in France. Their efforts led in 1972 to the use of formal logic as the basis for a programming language. Kowalski’s research provided the theoretical framework, while Colmerauer’s gave rise to the programming language Prolog. Colmerauer and his team then built the first interpreter, and David Warren at the AI Department, University of Edinburgh, produced the first compiler.