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