【问题标题】:Interpreters vs Compilers vs Virtual Machines解释器 vs 编译器 vs 虚拟机
【发布时间】:2013-02-03 22:26:44
【问题描述】:

我有一个关于解释器、编译器和虚拟机 (VM) 的问题。

现在我知道解释器和编译器之间的区别,但是 虚拟机 与前两个有什么不同呢?与解释器和编译器相比,VM 的优缺点是什么?

非常感谢。

【问题讨论】:

    标签: compiler-construction vm-implementation


    【解决方案1】:

    虚拟机并不能完全替代编译器或解释器。我认为您正在考虑 JIT 编译器,即实现了多少 VM。

    虚拟机本身就是顾名思义——它是一台实际上并不存在的机器(处理器)。例如,大多数处理器没有任何处理内存分配的内在方法,或任何类型的知识。不过,Java VM 有一个new 指令,用于分配某个类的实例。 VM 的设计者认为这是语言中一个足够重要的概念,值得拥有自己的操作码,这是 VM 中的基本操作单元。

    创建自己的指令集的优点通常是弥合长编译/优化时间和慢解释器之间的差距。例如,当您编译 Java 类时,您不必进行任何寄存器分配或内联或任何传统编译器的工作。 JIT 稍后会这样做,但仅限于您运行足够多次的代码部分,并在程序运行期间分散开来。 JVM 的指令集与 Java 非常接近,因此初始编译速度很快,而且与 Java 源代码不同,它对于 VM 来说简单且易读。

    对于解释器与 JIT 编译器,通常需要权衡运行时性能与开发时间。 JIT 需要更长的时间来开发,但是解释器在运行时要慢得多。但在很多情况下,例如脚本和中小型网站,程序运行的时间不够长,您无法真正看到使用 JIT 的任何好处。

    我还应该提到 VMware 等软件。这也是一个虚拟机,但它使用的指令集也恰好在真实硬件上使用。它与语言 VM 具有相同的基本概念,因为它假装是一台实际不存在的机器,但实际上它是不同的并且非常复杂。

    【讨论】:

    • 顶级伴侣,正是我所需要的
    • “实际上并不存在”并不是正确的表达方式。事实是,可能没有制造的机器处理器可以使用给定 VM 的相同字节码语言。这并不意味着这样的机器处理器不能制造。
    【解决方案2】:

    简单的英语

    编译器将一种语言转换成另一种语言。例如,C# 转换为 IL,Java 转换为字节码,C++ 转换为二进制机器码。编译阶段不执行任何操作。

    解释器从源文件一次解释(执行)一行。如PHP、Perl等脚本语言

    虚拟机可以指几个东西,我知道的两个:

    • Hypervisor相关的虚拟机,如Hyper-VXen。这些允许您在单个硬件上运行多个操作系统
    • 软件运行时间,如Java Virtual MachineCommon Language Runtime。该软件允许运行独立于平台的中间语言(IL 代码、字节代码)并执行特定于机器的指令(just-in-time compilation)。通常,此类 VM 负责其他附属任务:资源管理、内存清理、线程、安全等

    没有优点和缺点。这三个人都从事难以比较的不同工作。

    语言和平台没有特定的顺序,实际上还有数百个其他示例

    【讨论】:

    • 非常感谢,完全理解了:)
    • Compiler & Interpreter & VM 可以为任何语言编写,任何语言都可以翻译成可以由下降 VM 执行的形式。任何语言都可以编译,当然也可以解释任何语言。这并不意味着它是有趣的事情。
    【解决方案3】:

    真机与虚拟机

    • 真正的机器是机器代码由硬件执行的机器
    • 虚拟机是一种“机器代码”由解释器执行的机器。

    解释器与编译器

    Answer is here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 2021-10-04
      • 2013-03-18
      • 2016-04-28
      • 1970-01-01
      相关资源
      最近更新 更多