【问题标题】:Relation between REPL, interpreter and compilerREPL、解释器和编译器之间的关系
【发布时间】:2011-07-23 23:45:22
【问题描述】:

来自Wikipedia

REPL 通常被误称为 口译员。这是用词不当——很多 使用的编程语言 编译(包括字节码 编译)具有 REPL,例如 Common Lisp 和 Python。

来自a reply to this post

交互式解释器使用 REPL。一个 口译员不需要 一。例如,您可以运行 Python, 在非交互模式下(在文件上) 它不会使用 read-eval-print 循环。

我想知道 REPL [del] 是否总是存在 [/del] 仅存在 用于解释器?*是否说编译器也存在 REPL?如果是的话,怎么样?

感谢和问候!

解释器是指编译后立即执行的解释器。

【问题讨论】:

    标签: compiler-construction interpreter read-eval-print-loop


    【解决方案1】:

    这可能不是一个好的答案,只是一些注释,

    • IE 6.0 中的 JavaScript 不附带 REPL。

    • 编译器的 REPL 也可能看起来像解释器,如果可以一次性解析语言,则只能转发。编译器可能会在每条编译语句后插入断点,执行直到到达断点,然后返回给用户,等待下一个输入行,然后重复。最后,所有输入行都被编译并执行。

    【讨论】:

    • 谢谢!那么在第二种情况下,带有 REPL 的编译器总是解释器吗?
    • @Tim:编译器不是解释器,无论它是否用于构建 REPL。
    • @Tim,不,例如 SBCL 中根本没有解释器,只有编译器,但仍然有一个像样的 REPL。
    • @delnan:谢谢!解释器是否定义为编译后立即执行?我是这么想的。
    • @Tim:我认为不是,第二种情况,编译器不解释,它只是编译,让CPU做解释,所以它不是解释器。
    【解决方案2】:

    不知道你问的是常用词还是别的什么。

    在任何情况下,REPL 都是 Read Eval Print Loop(参见第一个字母)。 如果您有一个解释器不阅读您的程序或不评估它(即“理解”您希望它做什么并执行它)或不在任何地方打印结果,这有什么好处?

    如果您什么都看不到,它也听不到您的声音,它也不会做您想做的事,或者您只有 1 次尝试,您也可以在桌子上放一块石头而不是电脑。

    也许会有一些有趣的玩弄文字的反对意见,比如“如果它只改变一个显示的图标,它真的是在打印吗?”等等:-) 或者“如果不是从键盘读取,它真的在读取吗?”。 愚蠢的纯粹哲学,真的。

    确实,某些系统的反应会有所不同,具体取决于您是从键盘还是从文件中读取它们。我不确定它的用途是什么,但我想当他实际在键盘上打字时,你可以为人类提供帮助(即命令完成等)。

    也许有些人在从文件中读取时不接受超过 1 个表达式?

    我想知道 REPL 是否总是为解释器而存在?

    我猜这是“解释器”定义的问题。如果你把它理解为(在务实的意义上)“按照我的吩咐去做的事情”,不。如果它不听,你怎么告诉它?

    *是否说编译器也存在 REPL?如果是的话,怎么样?

    是的,当然。所有的 LISP 系统都是这样的。 他们感觉就像一个解释器,但随着时间的推移,随着系统学习你如何表达自己并了解哪些变化和哪些没有变化,并且只是将没有变化的部分编译为机器代码,它们会变得神奇地更快。

    Java 现在也这样做了,你的 VM 会话持续的时间越长,它就越能发现如何让事情变得更快,如果你停止改变事情,它最终会以机器代码运行整个程序。

    解释器/编译器的整个人为区分是偶然的,也就是说,由于当时的资源限制。

    【讨论】:

    • 谢谢!解释器是否定义为编译后立即执行?我是这么想的。
    • 解释器/编译器的区别真的不存在,它只是像金字塔或人们仍然用脚测量事物的旧时代的产物。简单的口译员只需阅读您想要的内容,然后立即执行。随着时间的推移,人们对等待感到厌烦,因此它被扩展为只记住答案,所以它不会每次都坐在那里从头开始思考。有些人最终立即停止做任何事情,只编译所有内容,有些人两者都做,有些人根据负载的情况(有多忙)进行切换。
    • 假设你给一个 C 编译器 "int x = 5+2;"如果它将其解释为“创建一个程序,该程序将在执行时取 5 并添加 2 并将结果存储在变量 x [这是一个整数,duh]”中,那将是非常奇怪的。甚至 C 也解释了实际发生的事情。它将创建一个程序,该程序将在执行时将值 7 存储到 x 中。甚至它会创建一个程序,该程序的变量 x 在可执行映像中的值为 7,并且在您运行它时它不会做任何与此相关的事情。在 C++ 中,任何计算。如果值可用,可以在编译时完成。
    【解决方案3】:

    REPL 代表读取-评估-打印-循环。解释器和编译器都可用于执行eval 位 - 要么让解释器实例在后台运行并为其提供输入,要么使用编译器增量编译(当然,这需要更多的工作和编译器编写者进行了一些合作,但这是可能的,正如无数实例所显示的那样——尽管您通常只编译为字节码)。其余的主要是 I/O 和一些胶水,以保持所有先前输入的定义可用于下一个命令。

    【讨论】:

      最近更新 更多