解释器/编译器是如何工作的
解释器/编译器如何工作? 解释器和编译器有什么区别?
编译器
编译器是第一种要编写的翻译程序。 这个想法很简单:你编写程序,然后把它交给编译器来翻译它。 然后你运行结果。
口译
解释器也是一种将高级语言翻译成低级语言的程序,但是在程序运行的时候就是这样做的。 您使用文本编辑器或类似的东西编写程序,然后指示解释器运行程序。 它将程序一行一行,并在运行之前翻译每一行:翻译第一行并运行它,然后翻译第二行并运行它。
编译器特性:
- 花费大量的时间来分析和处理程序
- 生成的可执行文件是某种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
- [首页] https://cs.brown.edu/~sk/Publications/Books/ProgLangs/2007-04-26/
- [html] http://cs.brown.edu/courses/cs173/2012/book/
- [pdf] courses/cs173/2012/book/book.pdf
本书的核心是在Scheme(dr.Racket)中为dynamic语言编写解释器,使用它可以为任何语言编写自己的解释器,并在OOP中添加一些提示
和SmallTalk和SOM:简单对象机器:
- 虚拟教学和研究机器
- 一个最小的Smalltalk虚拟机的教学和研究
- Smalltalk-80:语言及其实现
所有现代的解释器都包括编译器内部:将高级元素编译成低级但可移植的字节码 ,或使用JIT将机器码编译到RAM中。
PS:如果有人想在Python上编写SmallTalk系统,请注意我。