【问题标题】:What's the difference between compiled and interpreted language?编译语言和解释语言有什么区别?
【发布时间】:2011-02-09 01:54:35
【问题描述】:

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

【问题讨论】:

    标签: java javascript programming-languages


    【解决方案1】:

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

    区别在于语言中不是;它在实现中。

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

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

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

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

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

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

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

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

    【讨论】:

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

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

    为什么要划线?正如this answer 正确指出的那样,解释/编译是关于一种语言的具体实现,而不是关于语言本身。虽然“C 是一种编译语言”之类的陈述通常是正确的,但没有什么可以阻止某人编写 C 语言解释器。其实interpreters for C do exist.

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

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

    另一种说法是解释的languages are代码被逐步翻译成机器指令while 程序正在执行,而编译的语言有代码在程序执行之前已经被翻译。

    【讨论】:

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

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

    编译器语言

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

    翻译语言:

    • 以单条指令为单条输入并执行指令。
    • 不生成中间对象代码
    • 例如:Perl、Python、Matlab
    • 解释程序运行速度较慢,因为编译和执行同时进行。
    • 内存需求较少。
    • 每条指令都会显示错误。
    • 源代码---解释器---输出

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

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

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

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

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

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

      【讨论】:

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

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

      【讨论】:

        【解决方案7】:

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

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

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

        interpreter 语言 X 是一个程序 (或机器,或只是某种一般的机制) 执行以 X 语言编写的任何程序 p,以便执行 X 规范规定的效果并评估结果。 p>

        XY编译器是一个程序 (或机器,或只是某种一般的机制) 将任何程序 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 编译为本机机器语言的,所以我会说它属于软编译语言。

        【讨论】:

          猜你喜欢
          • 2016-11-24
          • 2011-03-16
          • 2021-01-15
          • 2011-03-29
          • 1970-01-01
          • 1970-01-01
          • 2013-03-23
          • 2023-03-06
          • 2010-09-06
          相关资源
          最近更新 更多