编译器与口译员

时间:2012-04-15 11:16:38

标签: architecture compiler-construction operating-system interpreter

所以,让我看看我是否清楚地说明了这一点。

  1. 当我们说编译器和解释器之间的差异是解释器将高级指令转换为中间形式,然后执行。 [我认为编译器还将高级指令转换为中间形式,但此时它会生成目标代码而不是执行它,对吧?]

  2. 解释器一次读取一条指令或行的源代码,将此行转换为机器代码并执行它。 [解释器本身不会将代码转换为机器代码,它使用ist自己的预编译函数来评估指令(在解析之后)。例如。在高级语言中添加表达式将使用先前已编译的解释器添加函数进行评估,对吗?]

4 个答案:

答案 0 :(得分:3)

关键区别在于:解释器在运行时处理源代码。它不会将源代码转换为机器代码,它只是使用自己的代码来完成源指向的内容。编译器将源代码转换为可以直接运行的机器代码。

并非所有编译器都与执行过程分开。例如,大多数Java运行时都包含一个“JIT编译器”,可以根据需要在运行时编译Java代码。

你可以介入两者之间的东西。本质上,可以首先使用类似于编译的过程将源代码转换为更小且更易于解释的内容。然后可以解释此编译输出。 (例如,第一遍可以转换,比如'if'到53,'else'到54,'for'到55,依此类推 - 这将使解释器不必处理代码中的可变长度字符串实际上并不处理字符串。)

答案 1 :(得分:1)

我同意第一个,虽然解释器一次只能在一行上工作(它可以根据对整个代码的了解进行优化)。

我认为第二个稍微偏离:编译器确实创建了“机器代码”(对于JVM,它可以是字节代码)。解释器根据输入(与编译器相同)执行自己程序的一部分,执行部分执行输入中描述的计算(而不是执行计算以计算所需的机器代码)。

可以模糊两者之间的界限,因为编译器可以生成将在执行时解释的代码(根据编译时不可用的因素提供运行时优化)

答案 2 :(得分:0)

你是对的(1)。

Ad(2),解释器不需要一次读取一条指令的源代码,因为在解释包含循环的代码时,这太昂贵了。更有可能的是,它读取整个表达式,语句,函数甚至源文件,将它们转换为中间格式并对其进行评估。

请注意,编译器和解释器都不需要在任何时候生成机器代码;许多编程语言,包括Java,Python,以及像Prolog这样的旧编程语言,通常被编译为虚拟机字节码。在Python和Prolog中,“解释器”通常是组合的字节码编译器/字节码解释器。

我所知道的编译和解释的最佳介绍是SICP的第4章和第5章,它首先讨论一个非常简单的解释器并迭代地改进它,直到它成为一个成熟的编译器。

答案 3 :(得分:0)

什么是翻译?

  

S - > T translator 接受用源语言S表示的代码,并将其翻译成用另一种(目标)语言T表示的等效代码。

翻译人员的例子:

  • 编译器 - 将高级代码转换为低级代码,即 Java - > JVM
  • 汇编程序 - 将汇编语言代码转换为机器代码,即 x86as - > 86
  • 高级翻译器 - 将代码从一个PL转换为另一个PL,即 Java - > ç
  • 反编译器 - 将低级代码转换为高级代码,即 JVM - >爪哇

什么是口译员?

  

S解释器接受用语言S表示的代码,并立即执行该代码。它的工作原理是一次读取,分析和执行一条指令。

当用户以交互方式输入指令(想想Python)并希望在输入下一条指令之前获取输出时,这很好。当程序只执行一次或需要可移植时也很有用。

  • 解释程序比执行本机机器代码要慢得多
    • 解释高级语言的速度要慢100倍
    • 解释中级(如JVM代码)语言的速度要慢10倍
  • 如果重复调用指令,将重复进行分析 - 耗时!
  • 无需编译代码

差异

<强>行为

  • 编译器将源代码转换为机器代码,但不执行源代码或目标代码。
  • 解释器一次执行一条指令的源代码,但不翻译源代码。

<强>性能

  • 编译器需要很长时间才能将源程序转换为本机机器代码,但后续执行很快
  • 解释器立即开始执行源程序,但执行速度很慢

解释性编译器

解释性编译器是编译器和解释器之间的良好折衷。它将源程序转换为虚拟机代码,然后进行解释。

解释编译器将快速翻译与适度快速执行相结合,前提是:

  • VM代码低于源语言,但高于本机代码
  • VM指令格式简单(可由解释器快速分析)

示例:JDK为Java提供了解释性编译器


  

<强> Source