【发布时间】:2011-07-24 00:14:36
【问题描述】:
我想知道我的理解是否 关于解释器和编译器是 正确:
- 我认为编译器只进行从源代码到二进制的翻译 代码,而解释器不仅负责翻译工作,而且 也执行编译后生成的内容。
- 解释器总是有一部分需要编译吗?
- 编译器是否总是不执行它生成的二进制代码?
很抱歉提出愚蠢的问题。谢谢和问候!
【问题讨论】:
标签: compiler-construction terminology interpreter
我想知道我的理解是否 关于解释器和编译器是 正确:
很抱歉提出愚蠢的问题。谢谢和问候!
【问题讨论】:
标签: compiler-construction terminology interpreter
你对编译器是对的,但对解释器是错的。口译员不必翻译任何东西。它只是读取一段代码并“解释”它 - 执行它所读取的内容。例如读取1 + 2,然后执行函数sum(1, 2)。
没有。解释器可能仅出于优化目的使用编译(就像在使用 JIT 编译的 HotSpot JVM 中完成的那样)。
好吧,编译器的工作是“编译”——将源代码转换为二进制代码。就这样。所以你的问题的答案 - 是的。这不是它的工作。
【讨论】:
编译器将源语言翻译成某种东西,包括字节码或更简单的语言——它不一定是机器码,它可能会转储人类可读的表示。如果源语言和输出语言的抽象级别大致相同,则有些人更喜欢“转换器”之类的术语,但它们也是编译器。
另一方面,解释器不输出代码。它只是从源代码构建内部数据结构,类似于编译器在代码生成之前所做的 - 只是不使用另一种语言创建另一个等效程序,而是立即执行该程序。请注意,执行字节码的(不是 JIT 编译的)虚拟机也是解释器。所以 CPython 不是 Python 的解释器,而是从 Python 到 CPython 字节码的编译器——以及那个字节码的解释器。
所以你在#1 中对编译器的定义不够广泛,而解释器的定义实际上是编译器和解释器的组合(你不应该受到责备,这是许多语言普遍采用的一种非常常见的方法 - 但错误地 -称为“解释”)。 #2 是错误的,因为解释器不输出代码(这将成为编译器),而 #3 是正确的(您可以将其与输出代码的解释器挂钩,但这仍然是一个不同的程序)。
【讨论】:
编译器将输入语言翻译成输出语言。输出语言不必是二进制代码,例如您可以像 GWT 一样将 Java 编译为 Javascript。解释器通过将源语言中的概念直接映射到操作来直接执行源语言。源语言不必是文本,例如Java 字节码解释器。解释器通常有一个解析步骤,其中它将源代码的物理表示转换为内部可执行表示。这与编译不同,因为内部表示是源的直接表示,例如语法树,而不是转换(优化)的等价物。
【讨论】: