口译员/编译器如何工作


Answers:


61

编译器

编译器是要编写的第一种翻译程序。这个想法很简单:编写程序,然后将其交给编译器进行翻译。然后,您运行结果。

口译员

解释器也是一种程序,可以将高级语言翻译为低级语言,但在程序运行时即会执行。您使用文本编辑器或类似工具编写程序,然后指示解释器运行程序。它每次只占用一行程序,并在运行之前翻译每一行:它先翻译并运行第一行,然后再翻译并运行第二行,依此类推。

编译器特点:

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

口译员特点:

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

1
所以C#同时使用编译器和解释器?
开发人员2010年

9
那是不对的。两种语言都可以编译和解释。
马修·H

@Matt H:是的,如果您还计算运行时间,那将是正确的;因为运行时会解释编译的程序集。从C#的角度来看,它首先被编译然后执行。
2012年

1
@Aniket不,对目标代码不进行任何解释。如果将程序编译为机器可以理解的内容,则不需要解释器。此外,问题的关键在于编译器产生的目标代码与Java编译器产生的中间代码(例如字节码)之间的差异,中间代码每次运行时都会由真正的解释器解释。
2014年

1
口译员逐行工作通常是不正确的。绝大多数口译员没有。解释器生成低级代码并不是普遍正确的:有些解释器会遍历AST(不生成代码),有些解释器会生成字节码,然后再解释该字节码,然后将JIT编译为机器码。
sepp2k

33

什么是翻译?

一个的S - >Ť译者接受源语言表达小号代码,并将其转换到另一个(目标)语言表达T.等效代码

译员示例:

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

什么是口译员?

一个小号解释接受语言表达小号代码,并立即执行该代码。它通过一次获取,分析和执行一条指令来工作。

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

  • 解释程序比执行本机代码慢得多
  • 解释高级语言要慢大约100倍
  • 解释中间级(例如JVM字节码)语言要慢大约10倍
  • 如果重复调用一条指令,则会对其进行重复分析-非常耗时!
  • 无需编译代码

差异性

行为

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

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

性能

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

解释性编译器

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

解释性编译器将快速翻译与适度的快速执行结合在一起,但前提是:

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

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


4
“解释器一次只执行一条指令的源代码,但不翻译源代码”(取自diff标题)我认为解释器一次翻译并执行两个动作,而不仅仅是按照您的解释执行。除了这个解释之外,清楚而完美的+1。
JAVA 2014年

20

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

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

替代文字
(来源:answers.com

一般而言,口译员的表现代价高昂。


几乎所有的解释器都执行编译的字节码,而某些(模拟器)则执行编译的机器码。如果要解释的指令与获取开销相比比较简单,则解释仅是“性能昂贵”。
user207421'6

C#和VB呢?它们属于您图表的哪一部分?
可变

18

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

在此处输入图片说明

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

口译翻译一个语句转换成机器语言,执行它,并进入到下一个语句。

例如:编译器将立即给出几乎所有错误,但解释器将运行直到您写错指令为止

口译/编译器如何工作?

在此处输入图片说明

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

资源


“一次一行”是不正确的。大多数解释器将代码预编译为p代码,然后一次执行一条p代码指令。
user207421

口译员不会“翻译字节码”。他们执行它。有些基本实现执行字节代码,而不是源代码。
user207421

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

语言示例

口译

  • 蟒蛇
  • 红宝石
  • 的PHP
  • JAVA(全能)
  • 佩尔
  • [R
  • 电源外壳

已编译

  • C
  • C ++
  • C#
  • 物镜
  • 迅速
  • Fortran

大多数编译器不生成汇编语言。链接并不意味着更多的内存。存在源代码解释器。解释了C#,或者确实编译和解释了Java和C#。C和C ++存在于解释版本中,Fortran也是如此。
user207421

0

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

编译器通过编译源代码来生成目标代码

然后目标代码然后输入并给出输出

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

解释器使用源程序将输入映射为输出

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

参考-《编译器:原理,技巧和工具》(Aho aka the Dragon book)


0

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

直观地说:

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

  • 解释器是伪装成的或模拟计算机直接读取和执行源代码。


-1

看看PLAI书,这是我发现的有关动态语言实现的最佳入门:

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

本书以在Scheme(dr.Racket)中为动态语言编写解释器为中心,使用它您可以编写自己的任何语言的解释器,并从中添加有关OOP的一些技巧。

和SmallTalk和SOM:简单对象机:

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

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


1
这个答案的90%只是广告。
user207421
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.