compilation - 编译语言和解释语言之间的区别?

标签 compilation programming-languages computer-science interpreter

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

最佳答案

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

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

  • 因为他们可以预先查看所有代码,所以在生成代码时可以执行许多分析和优化,这些代码使最终版本的代码执行比单独解释每一行更快。
  • 编译器通常可以生成低级代码,这些低级代码在表内的内存查找方面执行与“动态调度”或“继承”之类的高级概念等效的操作。这意味着生成的程序需要记住的原始代码信息更少,从而降低了所生成程序的内存使用量。
  • 编译后的代码通常比解释后的代码快,因为执行的指令通常仅针对程序本身,而不是针对程序本身加上解释器的开销。

  • 一般来说,编译器具有以下缺点:
  • 一些语言功能(例如动态类型)很难高效地编译,因为编译器在程序真正运行之前无法预测会发生什么。这意味着编译器可能不会生成非常好的代码。
  • 编译器通常需要很长的“启动”时间,这是因为进行所有分析的成本很高。这意味着,在诸如Web浏览器之类的必须快速加载代码的设置中,编译器可能会变慢,因为它们会优化不会多次运行的短代码。

  • 一般来说,口译员具有以下优点:
  • 因为它们可以按编写的方式读取代码,并且不必执行昂贵的操作即可生成或优化代码,所以它们的启动速度通常比编译器快。
  • 因为解释器可以在程序运行时看到其功能,所以解释器可以使用编译器可能看不到的许多动态优化。

  • 一般来说,口译员有以下缺点:
  • 解释器通常比编译器具有更高的内存使用量,因为解释器需要在运行时保留有关程序的更多信息。
  • 解释器通常在解释器的代码内花费一些CPU时间,这可能会降低正在运行的程序的速度。

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

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

    最后一个细节是不对语言进行编译或解释。通常,C代码是经过编译的,但是有可用的C解释器使调试或可视化正在运行的代码变得更容易(它们经常在入门编程类中使用,或者至少在以前是使用。)在某些JS引擎开始编译它之前,它被认为是一种解释语言。一些Python实现纯粹是解释器,但是您可以获取生成本机代码的Python编译器。现在,某些语言比其他语言更容易编译或解释,但是没有什么阻止您为任何特定编程语言制作编译器或解释器。有一个称为Futamura projections的理论结果表明,例如,任何可以解释的内容都可以编译。

    关于compilation - 编译语言和解释语言之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38491212/

    相关文章:

    windows - Windows XP 默认安装了哪些编程语言

    programming-languages - 是否有任何关于作为第一语言更容易学习功能/声明式或命令式编程的研究?

    .net - 在 VS2010 中为 .NET 4 和 Silverlight 4 交叉编译而不复制文件

    linux - bash 上的 GAMESS 配置脚本错误 : syntax error near $<

    Swift 测试链接器错误

    programming-languages - 这是什么编程语言?

    javascript - Javascript 将未声明的函数用作对象的能力如何帮助在计算机之间划分任务?

    computer-science - 列出涵盖典型 CS 本科生主题的书籍 list

    algorithm - 什么是矩阵的带存储?

    c# - 是否有可以将 excel VBA 代码移植或编译到 C# 的工具?