【问题标题】:Prolog: a compiled or interpreted language or both?Prolog:编译或解释语言或两者兼而有之?
【发布时间】:2016-09-22 11:09:47
【问题描述】:

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

【问题讨论】:

  • 当然取决于 Prolog 的实现
  • 语言本身只是一种语言:你可以编译、解释、阅读、解析、翻译成其他语言等等......

标签: prolog programming-languages compiled interpreted-language


【解决方案1】:

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

GNU-Prolog 最初是作为 Prolog 到 C 的“转译器”,现在它被编译为本机代码。

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

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

【讨论】:

  • 你是对的。 W.r.t. Logtalk,它的编译器是一个三阶段编译器,第三阶段和最后一个阶段是在生成的中间 Prolog 文件上调用后端 Prolog 编译器。当然,这里发生的情况取决于所选的后端 Prolog 编译器。这不是一种不常见的方法(例如早期的 C++ 和 Cfront)。
【解决方案2】:

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

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

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

现在很多编程语言都可以编译和解释,没有规定说一种编程语言只能是其中的一种。

在早期,大多数编程语言都是其中一种,例如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 在爱丁堡大学期间(从那时起就在帝国理工 College, London) 和伦敦大学的 Alain Colmerauer 法国艾克斯-马赛。他们的努力导致在 1972 年使用 形式逻辑作为编程语言的基础。科瓦尔斯基 研究提供了理论框架,而 Colmerauer 给出了 上升到编程语言Prolog。 Colmerauer 和他的团队当时 建立了第一个解释器,以及 AI 部门的 David Warren, 爱丁堡大学,生产了第一个编译器。

【讨论】:

    猜你喜欢
    • 2011-10-16
    • 2011-06-17
    • 2015-10-14
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    相关资源
    最近更新 更多