在阅读了有关该主题的一些材料后,我仍然不确定编译语言和解释语言之间的区别是什么。有人告诉我这是 Java 和 JavaScript 之间的区别之一。有人可以帮助我理解它吗?
编译语言和解释语言有什么区别?
区别不在于语言。它正在实施中。
从我的系统中得到这个,这里有一个答案:
在编译实现中,原始程序被翻译成本地机器指令,由硬件直接执行。
在解释的实现中,原始程序被翻译成别的东西。另一个程序,称为“解释器”,然后检查“其他东西”并执行任何需要的操作。根据语言及其实现,“其他”有多种形式。从更流行到不太流行,“其他东西”可能是虚拟机的二进制指令,通常称为字节码,就像在 Lua、Python、Ruby、Smalltalk 和许多其他系统中所做的那样(这种方法在 1970 年代由UCSD P-system 和 UCSD Pascal) 原始程序的树状表示,例如抽象语法树,就像许多原型或教育解释器所做的那样 源程序的标记化表示,类似于 Tcl源程序,就像在 MINT 和 TRAC 中所做的那样
虚拟机的二进制指令,通常称为字节码,就像在 Lua、Python、Ruby、Smalltalk 和许多其他系统中所做的那样(该方法在 1970 年代被 UCSD P 系统和 UCSD Pascal 推广)
原始程序的树状表示,例如抽象语法树,就像许多原型或教育解释器所做的那样
源程序的标记化表示,类似于 Tcl
源程序的字符,如在 MINT 和 TRAC 中所做的那样
使问题复杂化的一件事是可以将字节码翻译(编译)为本机机器指令。因此,一个成功的解释实现最终可能会获得一个编译器。如果编译器在幕后动态运行,它通常被称为即时编译器或 JIT 编译器。 JIT 已经为 Java、JavaScript、Lua 和我敢说许多其他语言开发。那时你可以有一个混合实现,其中一些代码被解释和一些代码被编译。
Java 和 JavaScript 是证明这种差异的一个相当糟糕的例子,因为它们都是解释型语言。 Java(解释)和 C(或 C++)(编译)可能是一个更好的例子。
为什么是划线的文字?正如这个答案正确指出的那样,解释/编译是关于一种语言的具体实现,而不是关于语言本身。虽然“C 是一种编译语言”之类的陈述通常是正确的,但没有什么可以阻止某人编写 C 语言解释器。事实上,C 的解释器确实存在。
基本上,编译后的代码可以直接由计算机的 CPU 执行。也就是说,可执行代码是用 CPU 的“本机”语言(汇编语言)指定的。
然而,解释语言的代码必须在运行时从任何格式翻译成 CPU 机器指令。此翻译由口译员完成。
另一种说法是,解释语言是在程序执行时将代码逐步翻译成机器指令,而编译语言在程序执行之前已经翻译了代码。
这是编译器与解释器语言之间的基本区别。
编译器语言
将整个程序作为单个输入并将其转换为存储在文件中的目标代码。
生成中间目标代码
例如:C、C++
编译后的程序运行得更快,因为编译是在执行之前完成的。
内存需求更多是由于目标代码的创建。
整个程序编译后显示错误
源代码---编译器---机器代码---输出
口译语言:
将单个指令作为单个输入并执行指令。
不生成中间目标代码
例如:Perl、Python、Matlab
解释程序运行速度较慢,因为编译和执行同时进行。
内存需求较少。
每条指令都会显示错误。
源代码---解释器---输出
通常,编译器读取高级语言计算机代码并将其转换为 p 代码或本机机器代码。解释器直接从 p 代码或解释代码(如 Basic 或 Lisp)运行。通常,编译后的代码运行得更快,更紧凑,并且已经发现了所有的语法错误和许多非法引用错误。解释代码仅在应用程序尝试解释受影响的代码后才发现此类错误。解释代码通常适用于只使用一次或最多几次的简单应用程序,甚至可能用于原型设计。编译后的代码更适合严肃的应用程序。编译器首先接收整个程序,检查错误,编译它然后执行它。然而,解释器逐行执行此操作,因此它需要一行,检查它是否有错误,然后执行它。
如果您需要更多信息,只需谷歌“编译器和解释器之间的区别”。
这是一个非常模糊的区别,实际上通常不是语言本身的属性,而是您用来执行该语言代码的程序的属性。
但是,大多数语言主要以一种或另一种形式使用,是的,Java 本质上总是被编译的,而 javascript 本质上总是被解释的。
编译源代码是在其上运行一个程序,该程序生成一个二进制可执行文件,该文件在运行时具有源定义的行为。例如,javac 将人类可读的 .java 文件编译成机器可读的 .class 文件。
解释源代码是在其上运行一个程序,该程序立即产生定义的行为,而不生成中间文件。例如,当您的 Web 浏览器加载 stackoverflow.com 时,它会解释一堆 javascript(您可以通过查看页面源代码来查看)并产生这些页面所具有的许多不错的效果 - 例如,upvoting 或 little notifier顶部的酒吧。
解释型语言在运行时按照 shell 脚本中的指令执行,而编译型语言是一种经过编译(更改为 CPU 可以理解的汇编语言)然后像 c++ 中一样执行的语言。
正如其他人所说,编译和解释特定于编程语言的实现。它们不是语言中固有的。例如,有 C 解释器。
然而,我们可以(实际上我们确实)根据最常见的(有时是规范的)实现对编程语言进行分类。例如,我们说 C 是编译的。
首先,我们必须毫不含糊地定义解释器和编译器:
语言 X 的解释器是一个程序(或机器,或一般来说只是某种机制),它执行用语言 X 编写的任何程序 p,以便它执行 X 规范所规定的效果并评估结果。
从 X 到 Y 的编译器是一个程序(或机器,或一般来说只是某种机制),它将任何程序 p 从某种语言 X 翻译成某种语言 Y 的语义等价程序 p',其方式是解释 p ' 使用 Y 的解释器将产生相同的结果并具有与使用 X 的解释器解释 p 相同的效果。
请注意,从程序员的角度来看,CPU 是它们各自本地机器语言的机器解释器。
现在,我们可以根据其最常见的实现将编程语言初步分为 3 类:
硬编译语言:当程序完全编译为机器语言时。唯一使用的解释器是 CPU。示例:通常,要在 C 中运行程序,源代码被编译为机器语言,然后由 CPU 执行。
解释语言:当没有将原始程序的任何部分编译为机器语言时。换句话说,不会产生新的机器码;只执行现有的机器代码。还必须使用除 CPU 之外的解释器(通常是程序)。示例:在 Python 的规范实现中,源代码首先编译为 Python 字节码,然后该字节码由 Python 字节码的解释器程序 CPython 执行。
软编译语言:当使用 CPU 以外的解释器时,原始程序的一部分也可以编译为机器语言。这是 Java 的情况,其中源代码首先被编译为字节码,然后,字节码可以由 Java 解释器解释和/或由 JIT 编译器进一步编译。
有时,软和硬编译语言被称为简单编译,因此C#、Java、C、C++被称为编译。
在这个分类中,JavaScript 曾经是一种解释性语言,但那是很多年前的事了。如今,在大多数主要的 JavaScript 实现中,它都被 JIT 编译为本地机器语言,所以我会说它属于软编译语言。
不定期副业成功案例分享