【发布时间】:2016-11-24 06:39:49
【问题描述】:
编译语言和解释语言的相对优势和劣势是什么?
【问题讨论】:
-
但我的问题不同,我寻找使用解释器和编译器背后的直觉是什么
标签: compilation programming-languages computer-science interpreter
编译语言和解释语言的相对优势和劣势是什么?
【问题讨论】:
标签: compilation programming-languages computer-science interpreter
这两种方法都没有明显的优势 - 如果一种方法总是更好,我们很可能会开始在任何地方使用它!
一般而言,编译器具有以下优点:
由于他们可以预先查看所有代码,因此他们可以在生成代码时执行大量分析和优化,从而使最终版本的代码执行速度比单独解释每一行代码更快。
编译器通常可以生成低级代码,这些代码在表内的内存查找方面执行类似于“动态分派”或“继承”等高级概念的功能。这意味着生成的程序需要记住的原始代码信息更少,从而降低了生成程序的内存使用率。
一般来说,编译器有以下缺点:
一般来说,口译员有以下优势:
由于它们可以按原样读取代码并且不必执行昂贵的操作来生成或优化代码,因此它们的启动速度往往比编译器快。
因为解释器可以看到程序在运行时做了什么,所以解释器可以使用一些编译器可能看不到的动态优化。
一般来说,口译员有以下缺点:
解释器的内存使用量通常比编译器高,因为解释器需要在运行时保留有关程序可用的更多信息。
解释器通常会在解释器的代码中花费一些 CPU 时间,这会减慢正在运行的程序。
由于解释器和编译器具有互补的优势和劣势,语言运行时将两者的元素结合起来变得越来越普遍。 Java 的 JVM 就是一个很好的例子——Java 代码本身是被编译的,并且最初是被解释的。然后,JVM 可以找到运行了很多次的代码并将其直接编译为机器代码,这意味着“热”代码可以获得编译的好处,而“冷”代码则没有。 JVM 还可以执行一些动态优化,例如内联缓存,以编译器通常不具备的方式提高性能。
许多现代 JavaScript 实现都使用类似的技巧。大多数 JavaScript 代码都很短,而且功能不多,因此它们通常从使用解释器开始。但是,如果很明显代码在重复运行,许多 JS 引擎将编译代码 - 或者至少编译代码的一部分 - 并使用标准技术对其进行优化。最终结果是代码在启动时很快(对于快速加载网页很有用),但运行得越多越快。
最后一个细节是 语言 没有被编译或解释。通常,C 代码是经过编译的,但有可用的 C 解释器可以更轻松地调试或可视化正在运行的代码(它们经常用于介绍性编程课程 - 或者至少,它们曾经是。)在一些 JS 引擎开始编译它之前,它被认为是一种解释性语言。一些 Python 实现纯粹是解释器,但您可以获得生成本机代码的 Python 编译器。现在,有些语言比其他语言更容易编译或解释,但没有什么能阻止你为任何特定的编程语言制作编译器或解释器。例如,有一个名为Futamura projections 的理论结果表明,任何可以解释的东西都可以编译。
【讨论】:
因为启动时间更便宜,而且您可以按原样阅读解释器程序,这让我对解释器毫不费力
【讨论】: