REPL,解释器和编译器之间的关系

时间:2011-03-27 17:46:43

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

来自Wikipedia

  

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

来自a reply to this post

  

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

我想知道解释器的REPL [del]是否始终存在[/ del] 只存在?维基百科是否说REPL也存在于编译器中?如果是,那怎么样?

谢谢和问候!

通过解释器,我的意思是在编译后立即执行。

3 个答案:

答案 0 :(得分:3)

我不确定您是否要求使用常用的词语或其他内容。

在任何情况下,REPL都是Read Eval Print Loop(参见第一个字母)。 如果你有一个不能阅读你的程序或没有对它进行评估的翻译(即“理解”你想做什么和做什么)或者不在任何地方打印结果,那有什么用呢?

如果你根本看不到任何东西,它就听不到你想要的东西,或者你只有1次尝试,你也可以在桌子上放一块石头而不是电脑。 / p>

也许可能会有一些有趣的单词反对意见,例如“如果只更改显示的图标,是否真的打印?”这样:-) 或者“如果它不是从键盘上读取,它真的在读吗?”。 傻纯粹的哲学,真的。

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

从文件中读取时,有些人可能不接受超过1个表达式?

  

我想知道REPL是否总是存在于翻译中?

我想这是一个关于“翻译”定义的问题。如果你的意思是(在语用意义上)“做我告诉它要做的事情”,不。如果它不听,你会怎么说呢?

  

维基百科是否说REPL也存在于编译器中?如果是,那怎么样?

是的,当然。所有LISP系统都是这样的。 他们觉得自己就像一个翻译,但随着时间的推移,随着系统学会了你自己如何表达自己并了解了什么是变化,什么没有变化,并且只是编译了不会改变机器代码的东西,它们会变得神奇地变得更快。

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

解释器/编译器的整个人为区别在于意外,也就是说,由于当天的资源限制。

答案 1 :(得分:1)

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

  • IE 6.0中的JavaScript没有附带REPL。

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

答案 2 :(得分:1)

REPL代表Read-Eval-Print-Loop。解释器和编译器都可用于执行eval位 - 要么在后台运行解释器的实例并将其输入,要么使用编译器逐步编译(授予,这需要更多)来自编译器编写者的工作和一些合作,但是有可能,正如无数个实例所示 - 你通常只编译为字节码)。其余的主要是I / O和一些粘合剂,以保留所有先前输入的定义可用于下一个命令。