编译语言和解释语言之间有什么区别?


118

在阅读了有关该主题的一些材料后,我仍然不确定编译语言和解释语言之间的区别。有人告诉我,这是Java和JavaScript之间的区别之一。有人可以帮我理解吗?

Answers:


165

编译语言和解释语言之间有什么区别?

区别在于语言。它在执行中

从我的系统中得到了答案,这是一个答案:

  • 在编译的实现中,原始程序被转换为本机指令,这些指令直接由硬件执行。

  • 在一个解释的实现中,原始程序被翻译成其他东西。另一个程序称为“解释器”,然后检查“其他”并执行需要的任何操作。根据语言及其实现,“其他”的形式多种多样。从较流行到较不流行,“其他”可能是

    • 虚拟机的二进制指令,通常称为字节码,在Lua,Python,Ruby,Smalltalk和许多其他系统中也是如此(该方法在1970年代由UCSD P-system和UCSD Pascal普及了)

    • 原始程序的树状表示形式,例如抽象语法树,许多原型或教育性解释程序都采用这种形式

    • 源程序的标记化表示,类似于Tcl

    • 源程序的字符,就像在MINT和TRAC中所做的一样

使问题复杂化的一件事是可以将字节码转换(编译)为本地机器指令。因此,成功的解释实现可能最终会获得编译器。如果编译器在后台动态运行,则通常称为即时编译器或JIT编译器。JIT已针对Java,JavaScript,Lua开发,我敢说许多其他语言。到那时,您可以有一个混合实现,其中解释一些代码并编译一些代码。


7
主席先生,我有以下问题1.“其他”用哪种语言写?2.在JavaScript的上下文中,“其他”在浏览器之间是否有所不同?3.说,我的脚本在Google Chrome和Internet Explorer中运行,两个浏览器对它的解释是否相同?
JavaHopper

@Norman,这是一个很棒的解释。但是,我仍然有一些困惑。在编译的实现中,原始程序将转换为本机指令。怎么会?例如,我以为C会在编译后产生汇编代码,无论如何,仍然需要由本机汇编程序将其汇编为基础机器的机器代码。那么,在解释语言的情况下,与VM(python或JVM等)的功能有何不同?
qre0ct

58

Java和JavaScript是证明这种差异的一个非常糟糕的例子,因为它们都是解释语言。Java (已解释)和C(或C ++)(已编译)可能是一个更好的示例。

为什么删除线文字?正如这个答案正确指出的那样,解释/编译是关于一种语言的具体实现,而不是关于语言本身。尽管“ C是一种编译语言”这样的语句通常是正确的,但没有什么可以阻止某人编写C语言解释器。实际上,确实存在C的解释器

基本上,编译后的代码可以由计算机的CPU直接执行。也就是说,可执行代码以CPU的“本机”语言(汇编语言)指定。

但是,必须在运行时将解释语言的代码从任何格式转换为CPU机器指令。该翻译由口译员完成。

把它的另一种方式是,解释语言代码翻译成机器指令一步一步的同时,正在执行的程序,而编译语言有代码已经被翻译之前执行程序。


8
是Java解释的吗?来自维基百科:“ Java应用程序通常被编译为字节码(类文件),无论计算机的体系结构如何,它都可以在任何Java虚拟机(JVM)上运行。”
Personman'4

6
@Personman在技术上仍被“解释”为JVM在执行代码,而不是OS本身。可以说,现代OS的复杂性使得这种区别在大多数情况下基本上无关紧要,这确实是一种语义上的区别。您在谈论运行该应用程序的操作系统与运行该代码的应用程序的操作系统之间的区别。
GrayWizardx

5
我想你的意思是类文件本身是由Java VM解释的。那是合理的,但是java源代码确实被编译为Java VM字节码。您可以构建一台物理Java机器,该机器不需要VM将其解释为另一种体系结构的机器代码。因此,说Java已编译似乎更准确。尽管如此,这仍然是区分混淆和任意性的一个很好的例子。毕竟,编译后的C由CPU解释,对吧?
Personman 2010年

13
Java是编译语言或解释语言的一个非常糟糕的示例,因为它本质上兼而有之。如果要进行比较,我会选择C和Lisp以避免混淆。
比尔蜥蜴

7
@stakx-实际上,Java字节码通常也由JIT编译器编译为本地代码。获得纯解释器行为的唯一方法是在启动JVM时显式关闭JIT编译器。
斯蒂芬·C

15

这是编译器语言与解释器语言之间的基本区别。

编译语言

  • 将整个程序作为单个输入,并将其转换为存储在文件中的目标代码。
  • 生成中间目标代码
  • 例如:C,C ++
  • 编译程序运行得更快,因为编译是在执行之前完成的。
  • 内存需求更多是由于目标代码的创建。
  • 编译整个程序后显示错误
  • 源代码---编译器---机器代码---输出

口译语言:

  • 将单个指令作为单个输入并执行指令。
  • 没有生成中间目标代码
  • 例如:Perl,Python,Matlab
  • 解释的程序运行较慢,因为编译和执行是同时进行的。
  • 内存需求较少。
  • 每条指令都会显示错误。
  • 源代码---解释器---输出

5

通常,编译器读取高级语言的计算机代码,并将其转换为p代码或本机代码。解释器直接从p代码或诸如Basic或Lisp之类的解释代码运行。通常,编译后的代码运行速度更快,更紧凑,并且已经发现了所有语法错误和许多非法引用错误。解释后的代码仅在应用程序尝试解释受影响的代码后才发现此类错误。解释性代码通常对于仅将使用一次或最多使用两次,甚至可能用于原型制作的简单应用程序也很有用。编译后的代码更适合于严重的应用程序。编译器首先接收整个程序,检查是否有错误,然后编译并执行。解释器逐行执行此操作,因此需要一行,检查是否有错误,

如果您需要更多信息,只需Google以获取“编译器和解释器之间的差异”。


3
嗯,不知道在前两个语句之外您还能从中得到什么。从技术上讲,几代人使用许多解释语言都是正确的,但是根据平台和对细节的关注,有可能使解释代码的执行与某些活动接近或相同。
GrayWizardx

请记住,像Java,C#和JavaScript这样的语言几乎在当今的整个编程世界中泛滥,因此说“编译后的代码更适合严肃的应用程序”将是不公平的。
西西尔(Sisir)

2

这是一个非常模糊的区别,实际上通常不是语言本身的属性,而是您用来执行该语言代码的程序的属性。

但是,大多数语言主要以一种形式或另一种形式使用,是的,Java本质上总是被编译,而javascript本质上总是被解释。

编译源代码是在其上运行一个程序,该程序会生成一个二进制可执行文件,该文件在运行时具有源代码定义的行为。例如,javac将人类阅读的.java文件编译为机器可读的.class文件。

要解释源代码,请在其上运行一个程序,该程序会立即产生已定义的行为,而不会生成中间文件。例如,当您的网络浏览器加载stackoverflow.com时,它会解释一堆JavaScript(您可以通过查看页面源代码来查看它们),并产生许多这些页面具有的良好效果-例如,投票或小通知者横穿顶部。


虽然Java首先将其转换为字节码,但只有在执行JVM时才将其转换为机器码。说它是编译的而不是解释的是正确的吗?
西西尔(Sisir)

1
我想您可以肯定地说Java字节码是经过解释的,但是没有人编写Java字节码。Java本身通常被编译为字节码。
人,

2

解释语言是在运行时根据外壳脚本中的说明执行的,而编译语言是一种被编译(转换为汇编语言,CPU可以理解的语言),然后像在c ++中那样执行的语言。


0

正如其他人所说,编译解释是特定于编程语言的实现的。它们不是语言固有的。例如,有C解释器。

但是,我们可以(并且实际上可以)根据最常见的(有时是规范的)实现对编程语言进行分类。例如,我们说C已编译。

首先,我们必须定义无歧义的解释器和编译器:

语言X解释器是一个程序(或机器,或一般来说,只是某种某种机制),它执行用语言X编写的任何程序p,从而执行效果并评估X规范所规定的结果。

编译器Xý是一个程序(或一台机器,或只是某种一般机制的),该转换的任何程序p部分语言X成语义等同程序P”在一些语言Ý以这样的方式在解释p '与用于解释ÿ会产生相同的结果,并且具有相同的效果解释p与解释器X

注意,从程序员的角度来看,CPU是它们各自的本地机器语言的机器解释器。

现在,我们可以根据编程语言最常见的实现方式将编程语言分为三类:

  • 硬编译语言:当程序完全编译为机器语言时。唯一使用的解释器是CPU。示例:通常,要使用C运行程序,会将源代码编译为机器语言,然后由CPU执行。
  • 解释的语言:没有将原始程序的任何部分编译为机器语言的情况。换句话说,不会生成新的机器代码。仅执行现有的机器代码。也必须使用CPU以外的解释器(通常是程序)。示例:在Python的规范实现中,源代码首先被编译为Python字节码,然后该字节码由CPython(Python字节码的解释器程序)执行。
  • 软编译语言:当使用非CPU的解释器时,原始程序的一部分也可能被编译为机器语言。在Java的情况下,首先将源代码编译为字节码,然后再由Java解释器解释字节码和/或由JIT编译器进一步编译字节码。

有时,软编译和硬编译语言是指简单编译,因此C#,Java,C,C ++被称为已编译。

在这种分类中,JavaScript曾经是一种解释语言,但是那是很多年前的事。如今,在大多数主要的JavaScript实现中,它都是JIT编译为本地机器语言的,所以我可以说它属于软编译语言。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.