编译语言与口译语言

问题

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

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


#1 热门回答(387 赞)

编译语言是程序一旦编译就在目标机器的指令中表达的语言。例如,源代码中的附加""操作可以直接转换为机器代码中的"ADD"指令。

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

你可以使用编译语言以解释语言执行任何操作,反之亦然 - 它们都是图灵完备的。然而,两者都具有实现和使用的优点和缺点。

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

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

以下是解释语言的优点:

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

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


#2 热门回答(86 赞)

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

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

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


#3 热门回答(45 赞)

从以往的**开始思考:**爆炸

曾几何时,很久以前,那里住着计算翻译和编译器。随之而来的是各种各样的大惊小怪。一般认为,时间是这样的:

  • 口译员:快速开发(编辑和运行)。执行起来很慢,因为每次执行时都必须将每个语句解释为机器代码(想想这对循环执行数千次意味着什么)。
  • 编译器:开发缓慢(编辑,编译,链接和运行。编译/链接步骤可能需要很长时间)。快速执行。整个程序已经在本机机器代码中。

解释程序和编译程序之间存在一个或两个数量级的运行时性能差异。其他区别点,例如代码的运行时可变性,也有一些兴趣,但主要区别在于运行时性能问题。

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

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