编译与解释语言

我试图更好地了解这种差异。 我在网上找到了很多解释,但它们倾向于抽象的差异而不是实际的含义。

我的大部分编程经验都与CPython(动态,解释)和Java(静态,编译)有关。 但是,我知道还有其他种类的解释和编译语言。 除了可执行文件可以从编译语言编写的程序分发这一事实之外,每种类型都有哪些优点/缺点? 通常情况下,我听到有人认为解释性语言可以交互使用,但我相信编译语言也可以具有交互式实现,是正确的吗?


编译后的语言是程序一经编译就在目标机器的指令中表达的语言。 例如,可以将源代码中的“+”操作直接转换为机器代码中的“ADD”指令。

解释型语言是指目标机器不直接执行指令,而是由其他程序(通常使用本机语言编写)读取和执行的语言。 例如,解释器在运行时会识别相同的“+”操作,然后它会用适当的参数调用它自己的“add(a,b)”函数,然后执行机器码“ADD”指令。

你可以用编译语言做解释语言中的任何事情,反之亦然 - 它们都是图灵完整的。 然而,两者在实施和使用上都有优点和缺点。

我将完全概括(纯粹主义者原谅我!),但是,粗略地说,这里是编译语言的优点:

  • 通过直接使用目标机器的本地代码来提高性能
  • 在编译阶段有机会应用相当强大的优化
  • 这里是解释型语言的优点:

  • 更容易实现(编写好的编译器非常困难!!)
  • 无需运行编译阶段:可以直接“即时”执行代码
  • 对于动态语言可以更方便
  • 请注意,诸如字节码编译等现代技术增加了一些额外的复杂性 - 这里发生的事情是编译器针对的是与底层硬件不同的“虚拟机”。 然后可以在稍后阶段再次编译这些虚拟机指令以获取本地代码(例如,由Java JVM JIT编译器完成)。


    语言本身既不被编译也不被解释,只是语言的特定实现。 Java是一个完美的例子。 有一个基于字节码的平台(JVM),一个本地编译器(gcj)和一个Java超集(bsh)的插入程序。 那么Java现在是什么? 字节码编译,本地编译或解释?

    其他编译和解释的语言是Scala,Haskell或Ocaml。 这些语言中的每一种都有一个交互式解释器,以及一个用于字节码或本机机器码的编译器。

    所以通常用“编译”和“解释”来分类语言没有多大意义。


    开始思考: 从过去的爆炸

    曾几何时,很久以前,在计算机翻译和编译器领域居住过。 随之而来的是各种各样的事情。 当时的一般意见大致如下:

  • 口译员:快速开发(编辑和运行)。 执行速度慢,因为每次执行语句时都必须将其解释为机器代码(想想循环执行数千次的含义)。
  • 编译器:开发速度慢(编辑,编译,链接和运行,编译/链接步骤可能需要很长时间)。 快速执行。 整个程序已经在本机机器码中。
  • 解释程序和编译程序之间存在一个或两个数量级的运行时性能差异。 其他区别点,例如代码的运行时可变性,也有一些兴趣,但主要区别围绕运行时性能问题。

    今天的景观已经发展到这样的程度,编译/解释的区别几乎无关紧要。 许多编译语言都会调用不完全基于机器代码的运行时服务。 而且,大多数解释型语言在执行之前都被“编译”为字节码。 从执行速度的角度来看,字节代码解释器可以非常有效并且可以与一些编译器生成的代码相媲美。

    经典的区别在于编译器生成本地机器代码,解释器使用某种运行时系统即时读取源代码和生成的机器代码。 今天,很少有传统的解释器被留下 - 几乎所有的编译器都会编译成字节码(或其他半编译状态),然后在虚拟“机器”上运行。

    链接地址: http://www.djcxy.com/p/52555.html

    上一篇: Compiled vs. Interpreted Languages

    下一篇: Difference between a bytecode parsed instruction and machine language?