解释器/编译器是如何工作的

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

编译器

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

口译

解释器也是一种将高级语言翻译成低级语言的程序,但是在程序运行的时候就是这样做的。 您使用文本编辑器或类似的东西编写程序,然后指示解释器运行程序。 它将程序一行一行,并在运行之前翻译每一行:翻译第一行并运行它,然后翻译第二行并运行它。

编译器特性:

  • 花费大量的时间来分析和处理程序
  • 生成的可执行文件是某种forms的特定于机器的二进制代码
  • 计算机硬件解释(执行)结果代码
  • 程序执行速度很快

口译员特点:

  • 花在分析和处理程序上的时间相对较less
  • 生成的代码是某种中间代码
  • 生成的代码被另一个程序解释
  • 程序执行相对较慢

什么是翻译?

S→T翻译器接受以源语言S表示的代码,并将其翻译成以另一(目标)语言T表示的等效代码。

翻译的例子:

  • 编译器 – 将高级代码转换为低级代码,例如Java – > JVM
  • 汇编 – 将汇编语言代码翻译成机器码,例如x86as – > x86
  • 高级翻译器 – 将代码从一个PL转换到另一个,例如Java – > C
  • 反编译器 – 将低级代码转换为高级代码,例如Java JVM字节码 – > Java

什么是翻译?

S解释程序接受以S语言表示的代码,并立即执行该代码。 它通过一次获取,分析和执行一条指令来工作。

当用户以交互方式input指令(认为是Python)并希望在input下一条指令之前获取输出时,效果非常好。 当程序仅执行一次或需要便携时也是有用的。

  • 解释一个程序比执行本地机器码慢得多
  • 解释一个高级语言慢100倍
  • 解释一个中间级别(比如JVM字节码)的语言慢10倍
  • 如果一个指令被重复调用,它将被反复分析 – 耗时!
  • 不需要编译代码

差异

行为

  • 编译器将源代码翻译成机器码,但不执行源码或目标码。

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

性能

  • 编译器需要相当长的时间才能将源程序翻译成本机机器码,但后续执行速度很快
  • 解释器立即开始执行源程序,但执行速度很慢

解释编译器

解释性编译器是编译器和解释器之间的一个很好的折衷。 它将源程序翻译成虚拟机代码,然后解释。

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

  • 虚拟机代码低于源语言,但高于本地机器代码
  • VM指令具有简单的格式(可以通过解释器快速分析)

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

编译器 ,将源代码以一种计算机语言转换为另一种。

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

替代文字http://content.answers.com/main/content/img/CDE/COMPILE.GIF

一般翻译是性能成本高昂的。

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

在这里输入图像描述

编译器在运行之前转换整个程序。

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

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

在这里输入图像描述

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

资源

差异与他们如何工作

问: 编译器和解释器用于什么?

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

所以我们得出一个编译器/解释器的工作是将高级代码翻译成机器代码。

但两者都有不同的翻译方式代码差异:

编译:

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

解释器:具有所谓字节码forms的中间语言,源代码首先被转换为字节码,这个过程可以称为编译。 字节码不能在主机上运行,​​它需要一个程序,实际上这个程序是从操作系统的angular度来看的,把字节码解释给主机,这个程序叫做解释器,想起java。 有些语言,比如Python,用单一的语言编译和解释工作。

对比

口译

  • 分析源代码需要的时间较less,但整体执行时间较慢。
  • 没有中间目标代码生成,因此是有效的内存
  • 继续翻译程序直到遇到第一个错误,在这种情况下停止。 因此debugging很容易。

编译器

  • 分析源代码需要大量的时间,但整体执行时间相对较快。
  • 生成进一步需要链接的中间对象代码,因此需要更多的内存。
  • 只有扫描完整个程序后才会生成错误信息。 因此debugging比较困难。

语言示例

解读

  • python
  • ruby
  • PHP
  • JAVA(全能)
  • Perl的
  • [R
  • 电源shell

编译

  • C
  • C ++
  • C#
  • Objective-C的
  • 迅速
  • Fortran语言

编译器 – 编译器是将编程语言(源语言)的源代码转换(翻译)为另一种计算机语言(目标语言)的计算机程序。 在大多数情况下,编译器用于将源代码转换为可执行程序,即将代码从高级编程语言转换为低级(或低级)语言,主要是汇编或机器代码。

解释器 – 解释器是执行用编程语言编写的指令的计算机程序。 它可以直接执行源代码,也可以将源代码转换为更高效的表示forms并执行此代码

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

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

本书的核心是在Scheme(dr.Racket)中为dynamic语言编写解释器,使用它可以为任何语言编写自己的解释器,并在OOP中添加一些提示

和SmallTalk和SOM:简单对象机器:

  • 虚拟教学和研究机器
  • 一个最小的Smalltalk虚拟机的教学和研究
  • Smalltalk-80:语言及其实现

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

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