编译语言和解释语言的区别?

ami*_*ine 9 computer-science interpreter programming-languages compilation

编译和解释语言的相对优势和弱点是什么?为什么?

tem*_*def 32

这两种方法都没有明显的优势 - 如果一种方法总是更好,那么我们可能会开始在任何地方使用它!

一般来说,编译器具有以下优点:

  1. 因为他们可以看到所有的代码的前期,它们可以执行许多分析和生成代码,使代码的最后版本时优化的执行不是仅仅解释每一行单独更快.

  2. 编译器通常可以生成低级代码,这些代码在表内的内存查找方面执行等级的高级概念,如"动态调度"或"继承".这意味着生成的程序需要记住有关原始代码的较少信息,从而降低生成程序的内存使用量.

  3. 编译代码通常比解释代码更快,因为执行的指令通常仅用于程序本身,而不是程序本身加上解释器的开销.

一般来说,编译器有以下缺点:

  1. 某些语言功能(如动态类型)很难有效编译,因为编译器无法预测在程序实际运行之前会发生什么.这意味着编译器可能无法生成非常好的代码.
  2. 编译器通常需要很长的"启动"时间,因为执行所有分析的成本.这意味着在类似Web浏览器的设置中,快速加载代码很重要,编译器可能会因为优化不会多次运行的短代码而变慢.

一般来说,口译员具有以下优势:

  1. 因为他们可以按照编写的方式读取代码,而不必执行昂贵的操作来生成或优化代码,所以它们的启动速度往往比编译器快.

  2. 因为解释器可以看到程序在运行时所做的事情,所以解释器可以使用编译器可能无法看到的许多动态优化.

一般来说,口译员有以下缺点:

  1. 解释器通常具有比编译器更高的内存使用率,因为解释器需要在运行时保留有关程序的更多信息.

  2. 解释器通常在解释器的代码中花费一些CPU时间,这可能会减慢正在运行的程序.

由于解释器和编译器具有互补的优点和缺点,因此语言运行时将两者的元素组合起来变得越来越普遍.Java的JVM就是一个很好的例子 - Java代码本身是经过编译的,最初它被解释了.然后,JVM可以发现,我们运行很多次的代码,直接编译成机器代码,这意味着"热"的代码编译得到的好处,而"冷"的代码没有.JVM还可以执行许多动态优化,例如内联缓存,以便以编译器通常不具备的方式加速性能.

许多现代JavaScript实现使用类似的技巧.大多数JavaScript代码很短,并没有那么多,所以他们通常开始使用解释器.但是,如果很明显代码重复运行,许多JS引擎将编译代码 - 或者至少编译它的一部分 - 并使用标准技术对其进行优化.最终结果是代码在启动时很快(对于快速加载网页很有用),但运行得越快就越快.

最后一个细节是不编译或解释语言.通常,C代码是经过编译的,但是有可用的C解释器可以更容易地调试或可视化正在运行的代码(它们通常用于介绍性编程类 - 或者至少,它们曾经是用过的.)JavaScript用于在一些JS引擎开始编译之前,我们会将其视为一种解释语言.一些Python实现纯粹是解释器,但您可以获得生成本机代码的Python编译器.现在,有些语言比其他语言更容易编译或解释,但没有什么能阻止你为任何特定的编程语言编写或解释.例如,有一个名为Futamura投影的理论结果表明,任何可以解释的东西都可以被编译.

  • 这个答案与learncpp.com上的[编译器与解释器的优点的良好比较](https://www.learncpp.com/cpp-tutorial/introduction-to-programming-languages/)相关联.当然这个问题可能会产生很多基于意见的答案,但这个答案似乎并不在其中.如果我有3k代表,我会对原始问题替换('哪个更好'与'之间有什么区别')进行一些轻微编辑并投票重新开启. (5认同)