编译语言和解释语言的区别?
Difference between compiled and interpreted languages?
编译型和解释型语言的相对优势和劣势是什么?
这两种方法都没有明显的优势 - 如果一种方法总是更好,我们很可能会开始在任何地方使用它!
一般来说,编译器具有以下优势:
因为他们可以预先看到所有代码,所以他们可以在生成代码时执行大量分析和优化,从而使最终版本的代码执行速度比单独解释每一行代码更快。
编译器通常可以生成低级代码,这些代码在表内的内存查找方面执行与 "dynamic dispatch" 或 "inheritance" 等高级思想等效的代码。这意味着生成的程序需要记住的有关原始代码的信息更少,从而降低了生成程序的内存使用量。
- 编译代码通常比解释代码快,因为执行的指令通常只针对程序本身,而不是程序本身加上解释器的开销。
一般来说,编译器有以下缺点:
- 某些语言特性(例如动态类型)很难高效编译,因为编译器无法预测程序实际运行之前会发生什么 运行。这意味着编译器可能不会生成非常好的代码。
- 编译器通常需要很长的 "start-up" 时间,因为他们进行所有分析的成本很高。这意味着在像 Web 浏览器这样快速加载代码很重要的设置中,编译器可能会变慢,因为它们会优化不会 运行 很多次的短代码。
一般来说,口译员有以下优点:
因为它们可以读取编写的代码并且不必执行昂贵的操作来生成或优化代码,所以它们的启动速度往往比编译器快。
因为解释器可以看到程序在 运行ning 时执行的操作,所以解释器可以使用编译器可能看不到的许多动态优化。
一般来说,口译员有以下缺点:
解释器的内存使用率通常比编译器高,因为解释器需要在 运行 时保留更多有关程序的可用信息。
解释器通常会在解释器的代码中花费一些 CPU 时间,这会减慢程序 运行.
由于解释器和编译器具有互补的优点和缺点,因此语言 运行 将两者的元素结合起来变得越来越普遍。 Java 的 JVM 就是一个很好的例子——Java 代码本身被编译,并且最初被解释。然后,JVM 可以多次找到 运行 的代码,并将其直接编译为机器代码,这意味着 "hot" 代码获得编译的好处,而 "cold" 代码则没有。 JVM 还可以执行许多动态优化,例如内联缓存,以编译器通常不会采用的方式提高性能。
许多现代 Java脚本实现使用类似的技巧。大多数 Java 脚本代码都很短,并没有做太多事情,因此它们通常从使用解释器开始。但是,如果很明显代码被重复 运行 ,许多 JS 引擎将编译代码 - 或者至少编译它的一些片段 - 并使用标准技术对其进行优化。最终结果是代码在启动时速度很快(对于快速加载网页很有用),但它变得越快 运行s。
最后一个细节是 语言 不编译或解释。通常,C 代码是经过编译的,但是有可用的 C 解释器可以更轻松地调试或可视化正在编译的代码 运行(它们通常用于介绍性编程 类 - 或者至少,它们曾经是。)Java在一些 JS 引擎开始编译它之前,脚本曾经被认为是一种解释性语言。一些 Python 实现是纯粹的解释器,但您可以获得生成本机代码的 Python 编译器。现在,有些语言比其他语言更容易编译或解释,但是没有什么能阻止您为任何特定的编程语言制作编译器或解释器。例如,有一个名为 Futamura projections 的理论结果表明,任何可以解释的东西都可以编译。
因为启动时间更便宜,而且您可以按原样阅读口译程序,所以对于口译员来说,这对我来说是轻而易举的事
编译型和解释型语言的相对优势和劣势是什么?
这两种方法都没有明显的优势 - 如果一种方法总是更好,我们很可能会开始在任何地方使用它!
一般来说,编译器具有以下优势:
因为他们可以预先看到所有代码,所以他们可以在生成代码时执行大量分析和优化,从而使最终版本的代码执行速度比单独解释每一行代码更快。
编译器通常可以生成低级代码,这些代码在表内的内存查找方面执行与 "dynamic dispatch" 或 "inheritance" 等高级思想等效的代码。这意味着生成的程序需要记住的有关原始代码的信息更少,从而降低了生成程序的内存使用量。
- 编译代码通常比解释代码快,因为执行的指令通常只针对程序本身,而不是程序本身加上解释器的开销。
一般来说,编译器有以下缺点:
- 某些语言特性(例如动态类型)很难高效编译,因为编译器无法预测程序实际运行之前会发生什么 运行。这意味着编译器可能不会生成非常好的代码。
- 编译器通常需要很长的 "start-up" 时间,因为他们进行所有分析的成本很高。这意味着在像 Web 浏览器这样快速加载代码很重要的设置中,编译器可能会变慢,因为它们会优化不会 运行 很多次的短代码。
一般来说,口译员有以下优点:
因为它们可以读取编写的代码并且不必执行昂贵的操作来生成或优化代码,所以它们的启动速度往往比编译器快。
因为解释器可以看到程序在 运行ning 时执行的操作,所以解释器可以使用编译器可能看不到的许多动态优化。
一般来说,口译员有以下缺点:
解释器的内存使用率通常比编译器高,因为解释器需要在 运行 时保留更多有关程序的可用信息。
解释器通常会在解释器的代码中花费一些 CPU 时间,这会减慢程序 运行.
由于解释器和编译器具有互补的优点和缺点,因此语言 运行 将两者的元素结合起来变得越来越普遍。 Java 的 JVM 就是一个很好的例子——Java 代码本身被编译,并且最初被解释。然后,JVM 可以多次找到 运行 的代码,并将其直接编译为机器代码,这意味着 "hot" 代码获得编译的好处,而 "cold" 代码则没有。 JVM 还可以执行许多动态优化,例如内联缓存,以编译器通常不会采用的方式提高性能。
许多现代 Java脚本实现使用类似的技巧。大多数 Java 脚本代码都很短,并没有做太多事情,因此它们通常从使用解释器开始。但是,如果很明显代码被重复 运行 ,许多 JS 引擎将编译代码 - 或者至少编译它的一些片段 - 并使用标准技术对其进行优化。最终结果是代码在启动时速度很快(对于快速加载网页很有用),但它变得越快 运行s。
最后一个细节是 语言 不编译或解释。通常,C 代码是经过编译的,但是有可用的 C 解释器可以更轻松地调试或可视化正在编译的代码 运行(它们通常用于介绍性编程 类 - 或者至少,它们曾经是。)Java在一些 JS 引擎开始编译它之前,脚本曾经被认为是一种解释性语言。一些 Python 实现是纯粹的解释器,但您可以获得生成本机代码的 Python 编译器。现在,有些语言比其他语言更容易编译或解释,但是没有什么能阻止您为任何特定的编程语言制作编译器或解释器。例如,有一个名为 Futamura projections 的理论结果表明,任何可以解释的东西都可以编译。
因为启动时间更便宜,而且您可以按原样阅读口译程序,所以对于口译员来说,这对我来说是轻而易举的事