【问题标题】:Difference between compiled and interpreted languages?编译语言和解释语言的区别?
【发布时间】:2016-11-24 06:39:49
【问题描述】:

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

【问题讨论】:

  • 但我的问题不同,我寻找使用解释器和编译器背后的直觉是什么

标签: compilation programming-languages computer-science interpreter


【解决方案1】:

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

一般而言,编译器具有以下优点:

  1. 由于他们可以预先查看所有代码,因此他们可以在生成代码时执行大量分析和优化,从而使最终版本的代码执行速度比单独解释每一行代码更快。

  2. 编译器通常可以生成低级代码,这些代码在表内的内存查找方面执行类似于“动态分派”或“继承”等高级概念的功能。这意味着生成的程序需要记住的原始代码信息更少,从而降低了生成程序的内存使用率。

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

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

  1. 某些语言特性(例如动态类型)很难高效编译,因为编译器在程序实际运行之前无法预测会发生什么。这意味着编译器可能不会生成非常好的代码。
  2. 编译器通常有很长的“启动”时间,因为它们进行所有分析的成本很高。这意味着在网络浏览器等需要快速加载代码的设置中,编译器可能会更慢,因为它们会优化不会多次运行的短代码。

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

  1. 由于它们可以按原样读取代码并且不必执行昂贵的操作来生成或优化代码,因此它们的启动速度往往比编译器快。

  2. 因为解释器可以看到程序在运行时做了什么,所以解释器可以使用一些编译器可能看不到的动态优化。

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

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

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

由于解释器和编译器具有互补的优势和劣势,语言运行时将两者的元素结合起来变得越来越普遍。 Java 的 JVM 就是一个很好的例子——Java 代码本身是被编译的,并且最初是被解释的。然后,JVM 可以找到运行了很多次的代码并将其直接编译为机器代码,这意味着“热”代码可以获得编译的好处,而“冷”代码则没有。 JVM 还可以执行一些动态优化,例如内联缓存,以编译器通常不具备的方式提高性能。

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

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

【讨论】:

  • 此答案链接为 learncpp.com 上的 "A good comparison of the advantages of compilers vs interpreters"。当然,这个问题可能会产生许多基于意见的答案,但这个问题似乎不在其中。如果我有 3k 代表,我会对原始问题进行一些细微的修改,替换('which is better' with 'what is the difference between')并投票重新开放。
【解决方案2】:

因为启动时间更便宜,而且您可以按原样阅读解释器程序,这让我对解释器毫不费力

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
猜你喜欢
  • 2011-02-09
  • 2011-03-16
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多