4

来自维基百科

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

来自对这个帖子的回复

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

我想知道 REPL [del] 是否总是存在 [/del]为解释器而存在?维基百科是否说编译器也存在 REPL?如果有,情况如何?

谢谢并恭祝安康!

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

4

3 回答 3

4

我不确定您是在询问常用词还是其他词。

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

如果您根本看不到任何东西并且它不会听到您的声音,它无论如何都不会做您想做的事情,或者您只尝试了 1 次,您也可以在桌子上放一块石头而不是电脑。

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

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

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

我想知道 REPL 是否总是存在于解释器中?

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

维基百科是否说编译器也存在 REPL?如果有,情况如何?

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

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

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

于 2011-03-27T18:19:31.167 回答
1

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

  • IE 6.0 中的 JavaScript 不附带 REPL。

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

于 2011-03-27T18:18:52.400 回答
1

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

于 2011-03-27T18:31:50.367 回答