解释器/编译器如何工作

时间:2010-03-04 06:24:38

标签: compiler-construction interpreter

解释器/编译器如何工作?解释器和编译器之间有什么区别。

8 个答案:

答案 0 :(得分:54)

<强>编译器

编译器是第一种 翻译程序写。该  想法很简单:你写的程序,  然后把它交给编译器  翻译它。然后你运行 结果

<强>口译

口译员也是一个程序  将高级语言翻译成  一个低级别的,但它在那个  程序运行的那一刻。你写  该程序使用文本编辑器或  类似的东西,然后指示  运行程序的解释器。它 拿一个程序,一次一行, 并在之前翻译每一行 运行它:它翻译第一个 行并运行它,然后翻译 第二行并运行它等。

编译器特性:

  • 花了很多时间分析和 处理程序
  • 生成的可执行文件是某种形式 特定于机器的二进制代码
  • 计算机硬件解释 (执行)生成的代码
  • 程序执行很快

口译员特征:

  • 花费的时间相对较少 分析和处理程序
  • 结果代码是某种形式 中间代码
  • 生成的代码由解释 另一个程序
  • 程序执行相对较慢

答案 1 :(得分:30)

什么是翻译?

  

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

翻译人员的例子:

  • 编译器 - 将高级代码转换为低级代码,例如: Java - &gt; JVM
  • 汇编程序 - 将汇编语言代码转换为机器代码,例如 x86as - &gt; 86
  • 高级翻译员 - 将代码从一个PL转换为另一个PL,例如 Java - &gt; ç
  • 反编译器 - 将低级代码转换为高级代码,例如 Java JVM字节码 - &gt;爪哇

什么是口译员?

  

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

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

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

差异

<强>行为

  • 编译器将源代码转换为机器代码,但不执行源代码或目标代码。

  • 解释器一次执行一条指令的源代码,但不翻译源代码。

<强>性能

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

解释性编译器

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

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

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

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

答案 2 :(得分:19)

Compiler,将源代码转换为另一种计算机语言。

Interpreter,直接执行源代码(通常在自己的虚拟机内)。

alt text http://content.answers.com/main/content/img/CDE/COMPILE.GIF

一般来说,口译费用很高。

答案 3 :(得分:16)

  

解释器和编译器有什么区别?

enter image description here

编译器首先扫描整个程序,然后将其转换为将由计算机处理器执行的机器代码。

口译员将一个语句翻译成机器语言,执行它,然后进入下一个语句。

例如:编译器会立即给出几乎所有的错误,但解释器会一直运行,直到你写错了指令

  

解释器/编译器如何工作?

enter image description here

  • 与提前翻译成机器语言的编译语言不同(右)。
  • 解释语言在运行时翻译。
  • dBASE和BASIC 解释器(中)翻译原始源代码。
  • Java和Visual Basic(左)解释器翻译字节码,这是一种从原始源代码编译的中间语言。

Source

答案 4 :(得分:7)

差异与他们的工作方式

问: 编译器和口译员的用途是什么?

答:大多数程序都是用高级语言编写的(c#,java ...)。高级语言包含可理解的单词和短语。另一方面,计算机(当我写这篇文章的时候)理解的机器代码是0和1只是二进制/机器代码。因此,我们需要将高级代码转换为源代码,即(机器代码/二进制)。因此,转换这个词。

因此,我们得出结论,编译器/解释器的工作是将高级代码转换为机器代码。

但两者都有不同的“翻译”代码的方式

差异:

编译器:

  

将源代码转换为某种中间形式。对于静态语言,编译器通常将源代码转换为程序集(通常不会存储到磁盘),然后调用汇编程序将程序集转换为二进制代码,通常将其存储为目标文件(.o或.obj后缀)通常),然后调用链接器将目标文件链接到二进制可执行文件。此外,通常将编译,组装,链接的整个过程称为编译。所以你可以把gcc称为编译器,但它实际上调用cc1,它是要编译的编译器,因为它是要汇编的汇编器,ld是要链接的链接器。

解释器:

  

语言有一个中间所谓的字节码形式,源代码首先转换为字节码,这个过程可以称为编译,javac就是一个例子。   字节码不能在主机上运行,​​它需要一个程序,这实际上是从OS的角度来看,将字节码解释为主机,这个程序叫做解释器,想想java。某些语言(如python)使用单个

进行编译和解释

- 来自:https://www.quora.com/What-are-the-differences-between-a-compiler-an-interpreter-and-an-assembler-Provide-examples

<强>比较

  

解释

     
      
  • 分析源代码所需的时间较少,但整体执行时间较慢。
  •   
  • 没有生成中间对象代码,因此内存有效。
  •   
  • 继续翻译程序,直到遇到第一个错误,在这种情况下它会停止。因此调试很容易。
  •   
     

编译器

     
      
  • 分析源代码需要花费大量时间,但整体执行时间相对较快。
  •   
  • 生成进一步需要链接的中间对象代码,因此需要更多内存。
  •   
  • 仅在扫描整个程序后生成错误消息。因此调试比较困难。
  •   

- 来自:https://www.programiz.com/article/difference-compiler-interpreter

语言示例

<强>被解释的

  • Python
  • Ruby
  • PHP
  • JAVA(全能)
  • Perl
  • - [R
  • Powershell的

已编译

  • C
  • C ++
  • C#
  • 目标C
  • SWIFT
  • Fortran

答案 5 :(得分:0)

编译器 - 编译器将源语言翻译为目标语言。然后目标语言接受输入并给出输出。

Compiler produces a target code by compiling source code

then target code then takes input and gives output

解释器 - 解释器不是生成目标代码,而是直接将输入与源代码一起输出并提供输出。

Interpreter maps input to output using the source program

然后编译器生成的机器语言目标程序比将输入映射到输出的解释器快得多。但是,由于解释器逐行执行源程序,因此它提供了比编译器更好的错误诊断。

参考 - Compilers: Principles, Techniques, and Tools by Aho又名龙书

答案 6 :(得分:0)

  

解释器和编译器之间有什么区别。

直接直观地说:

  • 编译器将人类可读的源代码转换为计算机可以读取和执行的机器代码。

  • 口译员是假装或模拟计算机直接阅读和执行源代码。

答案 7 :(得分:-1)

看看 PLAI 一书,这是我发现的dymanic语言实现的最佳介绍:

编程语言:应用和解释 (c) Shriram Krishnamurthi

本书的主要内容是在Scheme(dr.Racket)中为动态语言编写解释器,使用它可以为任何语言编写自己的解释器,并添加一些关于OOP的提示

和SmallTalk和SOM:简单对象机:

所有现代解释器都包含内部编译器:将高级元素编译为低级但可移植字节代码,或使用JIT将机器代码编译到RAM中。

PS:如果有人想在Python上编写SmallTalk系统,请注意我。