【问题标题】:Is my understanding of interpreter and compiler correct?我对解释器和编译器的理解正确吗?
【发布时间】:2011-07-24 00:14:36
【问题描述】:

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

  1. 我认为编译器只进行从源代码到二进制的翻译 代码,而解释器不仅负责翻译工作,而且 也执行编译后生成的内容。
  2. 解释器总是有一部分需要编译吗?
  3. 编译器是否总是不执行它生成的二进制代码?

很抱歉提出愚蠢的问题。谢谢和问候!

【问题讨论】:

    标签: compiler-construction terminology interpreter


    【解决方案1】:
    1. 你对编译器是对的,但对解释器是错的。口译员不必翻译任何东西。它只是读取一段代码并“解释”它 - 执行它所读取的内容。例如读取1 + 2,然后执行函数sum(1, 2)

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

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

    【讨论】:

      【解决方案2】:

      编译器将源语言翻译成某种东西,包括字节码或更简单的语言——它不一定是机器码,它可能会转储人类可读的表示。如果源语言和输出语言的抽象级别大致相同,则有些人更喜欢“转换器”之类的术语,但它们也是编译器。

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

      所以你在#1 中对编译器的定义不够广泛,而解释器的定义实际上是编译器和解释器的组合(你不应该受到责备,这是许多语言普遍采用的一种非常常见的方法 - 但错误地 -称为“解释”)。 #2 是错误的,因为解释器不输出代码(这将成为编译器),而 #3 是正确的(您可以将其与输出代码的解释器挂钩,但这仍然是一个不同的程序)。

      【讨论】:

      • 嗯,你所说的“编译器”其实就是“翻译器”。编译器是将源代码翻译成机器代码的翻译器。
      • @xappymah:这确实是同义词。但正如答案所说,编译器的输出格式不受限制。事实上,有一大堆编译器的输出甚至不接近机器代码。
      • 好吧,好吧。这只是关于术语的问题 :) 我更喜欢区分这些术语,因为当您同时使用翻译器和编译器时它会变得非常混乱。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多