ChatGPT解决这个技术问题 Extra ChatGPT

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

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


N
Norman Ramsey

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

区别不在于语言。它正在实施中。

从我的系统中得到这个,这里有一个答案:

在编译实现中,原始程序被翻译成本地机器指令,由硬件直接执行。

在解释的实现中,原始程序被翻译成别的东西。另一个程序,称为“解释器”,然后检查“其他东西”并执行任何需要的操作。根据语言及其实现,“其他”有多种形式。从更流行到不太流行,“其他东西”可能是虚拟机的二进制指令,通常称为字节码,就像在 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 和我敢说许多其他语言开发。那时你可以有一个混合实现,其中一些代码被解释和一些代码被编译。


先生,我有以下问题 1. “其他”是用哪种语言写的? 2. 在 JavaScript 的上下文中,“其他”是否因浏览器而异? 3. 假设我的脚本在 Google Chrome 和 Internet Explorer 中运行,这两种浏览器的解释是否相同?
@Norman 这是一个很棒的解释。但是,我仍然有一些困惑。在编译的实现中,原始程序被转换为本地机器指令。怎么来的?例如,我认为 C 在编译后会生成汇编代码,无论如何都需要由本机汇编程序将其汇编成底层机器的机器代码。那么在解释语言的情况下,这与 VM(python 或 JVM 等)做同样的事情有什么不同呢?
C
Community

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

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

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

然而,解释语言的代码必须在运行时从任何格式翻译成 CPU 机器指令。此翻译由口译员完成。

另一种说法是,解释语言是在程序执行时将代码逐步翻译成机器指令,而编译语言在程序执行之前已经翻译了代码。


Java是解释的?来自维基百科:“Java 应用程序通常被编译为可以在任何 Java 虚拟机 (JVM) 上运行的字节码(类文件),而不管计算机架构如何。”
@Personman 在技术上仍然被“解释”为 JVM 正在执行代码,而不是操作系统本身。它不再是一种语义上的差异,正如人们可以说现代操作系统的复杂性使得这种差异在大多数情况下基本上无关紧要。您在谈论运行应用程序的操作系统与运行运行代码的应用程序的操作系统之间的区别。
我想您的意思是类文件本身由 Java VM 解释。这有点合理,但 java 源代码确实被编译为 Java VM 字节码。您可以构建一个物理 Java 机器,它不需要 VM 将其解释为另一个体系结构的机器代码。所以说Java是编译的似乎更准确。尽管如此,这仍然是一个很好的例子,说明这种区别是令人困惑的,而且有点武断。毕竟,编译后的 C 是由 CPU 解释的,对吧?
Java 是编译语言或解释语言的一个非常糟糕的例子,因为它本质上是两者。如果我要进行比较,我会选择 C 和 Lisp 以避免任何混淆。
@stakx - 实际上,Java 字节码通常也由 JIT 编译器编译为本机代码。获得纯解释器行为的唯一方法是在启动 JVM 时显式关闭 JIT 编译器。
P
Pang

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

编译器语言

将整个程序作为单个输入并将其转换为存储在文件中的目标代码。

生成中间目标代码

例如:C、C++

编译后的程序运行得更快,因为编译是在执行之前完成的。

内存需求更多是由于目标代码的创建。

整个程序编译后显示错误

源代码---编译器---机器代码---输出

口译语言:

将单个指令作为单个输入并执行指令。

不生成中间目标代码

例如:Perl、Python、Matlab

解释程序运行速度较慢,因为编译和执行同时进行。

内存需求较少。

每条指令都会显示错误。

源代码---解释器---输出


P
Pang

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

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


嗯,除了前两个陈述之外,不知道你从哪里得到了一些。这在几代以前的许多解释语言中在技术上是正确的,但是根据平台和对细节的关注,有可能具有执行接近或与某些活动的编译代码一样的解释代码。
请记住,像 Java、C# 和 JavaScript 这样的语言几乎充斥着当今整个编程世界,说“编译代码更适合严肃的应用程序”是不公平的。
P
Personman

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

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

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

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


虽然 Java 首先转换为字节码,并且只有在执行 JVM 时才会将其转换为机器码;说它是编译而不是解释是否正确?
我想你可以说 Java 字节码是被解释的,当然,但没有人编写 Java 字节码。 Java 本身通常被编译为字节码。
不仅可以说,还可以解读。它也可以被 JIT 编译成机器码。
似乎你认为你在某件事上不同意我的观点,但我不知道是什么。
P
Praveen Kishor

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


M
MrIo

正如其他人所说,编译和解释特定于编程语言的实现。它们不是语言中固有的。例如,有 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 编译为本地机器语言,所以我会说它属于软编译语言。