编译和直译语言有什么区别?

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

157460 次浏览

Java 和 JavaScript 是展示这种差异的一个相当糟糕的例子。Java罢工 > (解释)和 C (或 C + +) < 罢工 > (已编译) 可能是一个更好的例子。

为什么要用删除线?正如 this answer正确指出的那样,解释/编译是关于语言的具体实现,而不是关于语言 per se。虽然像“ c 是一个编译语言”这样的陈述是 一般来说正确的,但是没有什么可以阻止人们编写一个 c 语言解释器。事实上,是 C 语言的解释器确实存在

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

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

另一种表示 的方法是,解释后的 语言是代码被逐步转换成机器指令 同时,程序正在执行,而编译后的 语言有代码被转换成 之前程序执行。

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

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

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

However, most languages are used primarily in one form or the other, and yes, Java is essentially always compiled, while javascript is essentially always interpreted.

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

To interpret source code is run a program on it that produces the defined behavior right away, without generating an intermediary file. For instance, when your web browser loads stackoverflow.com, it interprets a bunch of javascript (which you can look at by viewing the page source) and produces lots of the nice effects these pages have - for instance, upvoting, or the little notifier bars across the top.

编译和直译语言有什么区别?

不同之处在于语言中的 没有; 它在 实施中。

我已经把这些都说出来了,这里有一个答案:

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

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

    • 用于虚拟机的二进制指令,通常称为 字节码,在 Lua、 Python、 Ruby、 Smalltalk 和许多其他系统中都是这样做的(这种方法在20世纪70年代由 UCSD P-system 和 UCSD Pascal 推广)

    • 原始程序的树状表示,比如抽象语法树,对于许多原型解释器或教育解释器都是这样做的

    • A tokenized representation of the source program, similar to Tcl

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

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

直译语言是在运行时根据 shell 脚本中的指令执行的,而编译语言则是编译后(转换为汇编语言,CPU 可以理解)然后像 c + + 那样执行的。

下面是编译器语言和解释器语言的基本区别。

编译器语言

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

翻译语言:

  • Takes single instruction as single input and executes instructions.
  • Intermediate Object code is NOT generated
  • 例如: Perl,Python,Matlab
  • 解释程序运行较慢,因为编译和执行同时进行。
  • 内存需求更少。
  • 每条指令都显示错误。
  • Source Code ---Interpreter ---Output

正如其他人所说,编译完毕解读是特定于一种编程语言的 实施的; 它们是该语言固有的 没有。例如,有 C 解释器。

然而,我们可以(实际上我们确实是这样做的)根据最常见(有时是规范)的实现对编程语言进行分类。例如,我们说 C 是编译的。

First, we must define without ambiguity interpreters and compilers:

语言 X翻译是一个程序 (或者机器,或者只是某种机械装置) 执行用 X语言编写的任何程序 P,以便按照 X规范执行效果并评估结果。

X为什么compiler是一个程序 (或者机器,或者只是某种机械装置) 将任何程序 P从某种语言 X翻译成 在某种语言 为什么中使用语义等效的程序 P’,以这样的方式用 为什么的解释器解释 P’将产生与用 X的解释器解释 P相同的结果和效果。

Notice that from a programmer point of view, CPUs are machine interpreters for their respective native machine language.

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

  • 硬编译语言: 当程序完全编译成机器语言时。唯一使用的解释器是 CPU。示例: 通常,要在 C 中运行程序,源代码被编译成机器语言,然后由 CPU 执行。
  • Interpreted languages: When there is no compilation of any part of the original program to machine language. In other words, no new machine code is generated; only existing machine code is executed. An interpreter other than the CPU must also be used (usually a program).Example: In the canonical implementation of Python, the source code is compiled first to Python 字节码 and then that bytecode is executed by CPython, an interpreter program for Python 字节码.
  • 软编译语言: 使用 CPU 以外的解释器时,可以将原程序的某些部分编译成机器语言。这就是 Java 的情况,源代码首先被编译成字节码,然后字节码可以由 Java 解释器解释,或者由 JIT 编译器进一步编译。

Sometimes, soft and hard compiled languages are refered to simply compiled, thus C#, Java, C, C++ are said to be compiled.

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