编译语言与解释型语言

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

我的大部分编程经验都是使用CPython(动态的,解释的)和Java(静态的,编译的)。但是,我知道还有其他种类的解释和编译语言。除了可执行文件可以从用编译语言编写的程序中分发之外,每种类型的类型是否有任何优点/缺点?我经常听到人们争辩说解释型语言可以交互式使用,但我相信编译语言也可以具有交互式实现,对吗?


答案 1

编译语言是程序一旦编译,就用目标计算机的指令表示的语言。例如,源代码中的加法“+”操作可以直接转换为机器代码中的“ADD”指令。

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

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

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

  • 通过使用目标计算机的本机代码提高性能
  • 有机会在编译阶段应用非常强大的优化

以下是解释型语言的优点:

  • 更容易实现(编写好的编译器非常困难!!)
  • 无需运行编译阶段:可以直接“动态”执行代码
  • 可以更方便的动态语言

请注意,诸如字节码编译之类的现代技术增加了一些额外的复杂性 - 这里发生的事情是编译器针对的是与底层硬件不同的“虚拟机”。然后,可以在稍后阶段再次编译这些虚拟机指令以获取本机代码(例如,由Java JVM JIT编译器完成)。


答案 2

一种语言本身既不是编译的,也不是解释的,只有语言的特定实现才是。Java就是一个很好的例子。有一个基于字节码的平台(JVM),一个本机编译器(gcj)和一个用于Java超集(bsh)的interpeter。那么现在的Java是什么呢?字节码编译、本机编译还是解释?

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

因此,通常按“编译”和“解释”对语言进行分类没有多大意义。