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

时间:2010-04-17 04:44:03

标签: java javascript programming-languages

在阅读了关于这个主题的一些材料之后,我仍然不确定编译语言和解释语言之间的区别是什么。我被告知这是Java和JavaScript之间的差异之一。请有人帮我理解吗?

7 个答案:

答案 0 :(得分:152)

  

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

该语言的区别在于 ;它位于实现

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

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

  • 在解释的实现中,原始程序被翻译成其他内容。另一个名为“解释器”的程序然后检查“别的东西”并执行所要求的任何动作。根据语言及其实现,有各种形式的“别的东西”。从更受欢迎到不受欢迎,“别的东西”可能是

    • 虚拟机的二进制指令,通常称为字节码,如Lua,Python,Ruby,Smalltalk和许多其他系统中所做的那样(该方法在20世纪70年代由UCSD P系统和UCSD Pascal)

    • 原始程序的树状表示,例如抽象语法树,就像为许多原型或教育口译员所做的那样

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

    • 源程序的字符,如MINT和TRAC中所做的那样

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

答案 1 :(得分:53)

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

  

为什么通过文本?正如this answer正确指出的那样,解释/编译是关于语言的具体实现,而不是语言 per SE 。虽然像“C是一种编译语言”这样的语句通常是真的,但没有什么可以阻止某人编写C语言解释器。实际上,interpreters for C do exist

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

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

另一种方式是解释的 语言 代码逐步转换为机器指令而< / em>程序正在执行,而已编译的 语言 代码已在程序执行之前被翻译

答案 2 :(得分:10)

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

编译器语言

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

翻译语言:

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

答案 3 :(得分:4)

通常,编译器会读取更高级别的语言计算机代码,并将其转换为p代码或本机代码。解释器直接从p代码或解释代码(如Basic或Lisp)运行。通常,编译的代码运行得更快,更紧凑,并且已经发现所有语法错误和许多非法引用错误。解释的代码仅在应用程序尝试解释受影响的代码后才发现此类错误。解释代码通常适用于简单的应用程序,这些应用程序只能使用一次或最多使用一次,甚至可能用于原型设计。编译代码更适合严肃的应用程序。编译器首先接受整个程序,检查错误,编译它然后执行它。然而,解释器逐行执行此操作,因此需要一行,检查错误,然后执行它。

如果您需要更多信息,只需谷歌“编译器和口译员之间的区别”。

答案 4 :(得分:2)

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

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

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

要解释源代码,请在其上运行一个程序,立即生成定义的行为,而不生成中间文件。例如,当您的Web浏览器加载stackoverflow.com时,它会解释一堆javascript(您可以通过查看页面源查看)并生成许多这些页面具有的好效果 - 例如,upvoting或小通知程序顶部的酒吧。

答案 5 :(得分:1)

解释语言在运行时根据shell脚本中的指令执行,编译语言是编译语言(更改为汇编语言,CPU可以理解),然后像c ++一样执行。

答案 6 :(得分:0)

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

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

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

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

X Y 编译器是程序 (或一台机器,或者一般来说只是某种机制) 将任何程序 p 从某种语言 X 转换为 某种语言 Y 的语义上等效的程序 p',其方式是使用 Y p' >将产生与使用 X 解释器解释 p 相同的结果,并具有相同的效果。

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

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

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

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

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