编译和解释语言的相对优势和劣势是什么?为什么呢?
答案 0 :(得分:26)
这两种方法都没有明显的优势 - 如果一种方法总是更好,那么我们可能会开始在任何地方使用它!
一般而言,编译器具有以下优点:
因为他们可以预先看到所有代码,所以他们可以在生成代码时执行大量分析和优化,使代码的最终版本执行得更快,而不是单独解释每一行。
编译器通常可以生成低级代码,执行相当于高级别的想法,例如"动态调度"或者"继承"在表内的内存查找方面。这意味着生成的程序需要记住有关原始代码的较少信息,从而降低生成程序的内存使用量。
一般来说,编译器有以下缺点:
一般而言,口译员具有以下优势:
因为他们可以按照书面形式阅读代码而不必执行昂贵的操作来生成或优化代码,所以它们的启动速度往往比编译器快。
由于解释器可以看到程序在运行时的作用,因此解释器可以使用编译器可能无法看到的大量动态优化。
一般来说,口译员有以下缺点:
解释器通常具有比编译器更高的内存使用率,因为解释器需要在运行时保留有关程序的更多信息。
解释器通常会在解释器的代码中花费一些CPU时间,这会降低正在运行的程序的速度。
由于口译员和编制者具有互补的优点和缺点,因此语言运行时将两者的要素结合起来变得越来越普遍。 Java的JVM就是一个很好的例子 - Java代码本身是经过编译的,最初是由它来解释的。然后,JVM可以找到运行很多次的代码,并将其直接编译为机器代码,这意味着" hot"代码获得了编译的好处,同时"冷和#34;代码没有。 JVM还可以执行许多动态优化,例如内联缓存,以便以编译器通常不会采用的方式加快性能。
许多现代JavaScript实现都使用类似的技巧。大多数JavaScript代码都很简短,并没有那么多,所以他们通常使用解释器。但是,如果很明显代码重复运行,许多JS引擎将编译代码 - 或者至少编译它的一部分 - 并使用标准技术对其进行优化。最终的结果是代码在启动时很快(对于快速加载网页很有用),但运行得越快就越快。
最后一个细节是 languages 未编译或解释。通常,C代码是经过编译的,但是有一些C语言解释器可以更容易地调试或可视化正在运行的代码(它们通常用于介绍性编程类 - 或者至少,它们曾经用过在某些JS引擎开始编译之前,JavaScript曾经被认为是一种解释型语言。一些Python实现纯粹是解释器,但您可以获得生成本机代码的Python编译器。现在,有些语言比其他语言更容易更容易编译或解释,但是没有什么能阻止你为任何特定的编程语言制作编译器或解释器。例如,有Futamura projections的理论结果表明可以编译任何可以解释的内容。