我对解释器和编译器的理解是否正确?

时间:2011-03-27 18:36:45

标签: compiler-construction terminology interpreter

我想知道我是否理解     关于解释器和编译器是     正确的:

  1. 我认为编译器只能从源代码转换为二进制代码 代码,而翻译不仅翻译工作,而且 也执行编译后生成的内容。
  2. 解释器是否总是有编译的部分?
  3. 编译器是否始终不执行它生成的二进制代码?
  4. 很抱歉提出愚蠢的问题。谢谢和问候!

3 个答案:

答案 0 :(得分:1)

  1. 你对编译器是正确的,但对于解释器是错误的。口译员不必翻译任何内容。它只是读取一段代码并“解释”它 - 执行它已读取的内容。例如,它读取1 + 2然后执行函数sum(1, 2)

  2. 没有。解释器可能仅为了优化目的而使用编译(就像在使用JIT编译的HotSpot JVM中完成的那样)。

  3. 好吧,编译器的工作是“编译” - 将源代码翻译成二进制代码。就这样。所以你的问题的答案 - 是的。这不是它的工作。

答案 1 :(得分:1)

编译器从源语言转换为某些 else,包括字节码或更简单的语言 - 它不必是机器代码,它可能非常倾覆人类可读的表示。如果源语言和输出语言处于大致相同的抽象级别,则有些人更喜欢“转换器”这样的术语,但这些也是编译器。

另一方面,解释器不输出代码。它只是从源代码构建内部数据结构,类似于编译器在代码生成之前所做的事情 - 只是不用另一种语言创建另一个等效程序,但立即执行程序。请注意,执行字节码的(不是JIT编译)虚拟机也是解释器。所以CPython不是Python的解释器,而是从Python到CPython字节码的编译器 - 以及该字节码的解释器。

所以你在#1中对编译器的定义不够广泛,而解释器的定义实际上是编译器和解释器的组合(你不应该责怪,这是一种非常常见的方法,通常采用多种语言 - 但是错误地 - 被称为“解释”)。 #2是错误的,因为解释器不输出代码(这将构成编译器),而#3是正确的(你可以用输出代码的解释器连接它,但那仍然是一个不同的程序)。

答案 2 :(得分:1)

编译器将输入语言转换为输出语言。输出语言不必是二进制代码,例如你可以像Java一样将Java编译成Javascript。解释器直接通过将源语言中的概念映射到操作来直接执行源语言。源语言不必是文本,例如Java字节码解释器。解释器通常具有解析步骤,其中它将源代码的物理表示转换为内部可执行表示。这与编译的不同之处在于内部表示是源的直接表示,例如,语法树而不是转换(优化)的等价物。