编译器和解释器的确切区别是什么?

9

这是可以通过谷歌搜索查找的东西。 - Raj
8
我们应该对新手更友善。我认为在这里提出这样的问题没有任何问题。 - pavanlimo
1
嗯...也许吧。但在那之前,我会继续说“友善”。 :) - pavanlimo
@pavan,友好并不意味着允许低质量的问题涌入网站。我们可以礼貌地向新手解释SO的惯例或指向SO搜索框(至少前几次是这样的)。 - Péter Török
@Peter,没错。我认为你指出重复的评论是恰当的。 - pavanlimo
显示剩余2条评论
2个回答

9

来自维基百科:

  • 编译器:编译器是一种计算机程序(或一组程序),它将用编程语言编写的源代码(源语言)转换为另一种计算机语言(目标语言),通常具有称为目标代码的二进制形式。
  • 解释器:解释器是一种编程语言,其中程序由解释器程序“间接”执行(“解释”)。这可以与被转换为机器代码然后由主机CPU“直接”执行的编译语言相对比。

6

编译器

编译器生成机器相关的汇编代码,然后可以将其汇编和链接到适当的机器操作码中,以使程序能够执行。此过程只能在构建时运行。

解释器

解释器生成机器无关的代码,然后可以即时编译为汇编代码(例如即时编译)。此过程可以在构建时和/或运行时执行。

希望这有所帮助!


很少有翻译器会生成机器代码。除非机器代码将被持久化和重用(在这种情况下进行转换的是编译器),大多数翻译器都会找出需要完成的任务,然后直接执行它,而不首先生成任何机器代码。唯一情况下解释器通常会生成机器代码是像8080的IN / OUT指令之类的需要硬编码地址的情况。为了处理“OUT 100,5”指令,解释器会在某个固定位置存储“OUT 64h”和“RET”指令,使用A加载5并调用该位置。 - supercat
@supercat,您能否更详细地解释一下“大多数解释器会先弄清楚需要执行的操作,然后直接执行而不生成任何机器代码”的部分?解释器如何在不生成机器代码的情况下执行代码? - Trident
@Trident:通常,它们使用类似于巨大的if/else和/或switch语句的等效语句。例如,替换关键字为范围在128-255之间的标记但保留程序文本其他部分的MS-BASIC解释器将说:“如果(语句的第一个字节是标记)使用开关选择操作。否则,扫描直到找到一个=,记录第一次看到的前两个字符以及是否看到了$。然后评估跟在=之后的任何内容作为表达式,并将其存储到=之前识别的变量中。 - supercat
那么程序中剩下的部分怎么处理呢? - Trident
我的基本问题实际上与JIT编译器有关。JIT有两个作用:1. 直接执行字节码。2. 它还保存一些组件的机器代码,以期将来重用。我理解了编译部分。但是我不明白JIT如何在不将其编译为机器代码的情况下执行字节码。 - Trident
互联网上有太多的垃圾信息,我认为我找到了答案——JIT只编译在运行时被调用的方法。这些方法在第一次被调用时被编译,然后存储在缓存中。当再次调用相同的方法时,从缓存中使用已编译的代码进行执行。 - Trident

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接