我有一个关于解释器、编译器和虚拟机 (VM) 的问题。
现在我知道解释器和编译器之间的区别,但是虚拟机与前两个有什么不同?与解释器和编译器相比,VM 的优缺点是什么?
非常感谢。
我有一个关于解释器、编译器和虚拟机 (VM) 的问题。
现在我知道解释器和编译器之间的区别,但是虚拟机与前两个有什么不同?与解释器和编译器相比,VM 的优缺点是什么?
非常感谢。
虚拟机并不能完全替代编译器或解释器。我认为您正在考虑 JIT 编译器,即实现了多少 VM。
虚拟机本身就是这个名字所说的——它是一台实际上并不存在的机器(处理器)。例如,大多数处理器没有任何处理内存分配的内在方法,也没有任何类型知识。但是,Java VM 有一条new
指令可以分配某个类的实例。VM 的设计者认为这是语言中一个足够重要的概念,值得拥有自己的操作码,这是 VM 中的基本操作单元。
创建自己的指令集的优点通常是弥合长编译/优化时间和慢解释器之间的差距。例如,当您编译 Java 类时,您不必进行任何寄存器分配或内联或任何传统编译器的工作。JIT 稍后会这样做,但仅限于您运行足够多次的代码部分,并在程序运行期间分散开来。与 Java 源代码不同,JVM 的指令集与 Java 非常接近,因此初始编译速度很快,并且对于 VM 来说阅读起来简单快捷。
至于解释器与 JIT 编译器,权衡通常围绕运行时性能与开发时间。JIT 需要更长的时间来开发,但是解释器在运行时要慢得多。但是,在很多情况下,例如脚本和中小型网站,程序运行时间不够长,无法让您真正看到使用 JIT 的任何好处。
我还应该提到像 VMware 这样的软件。这也是一个虚拟机,但它使用的指令集也恰好在真实硬件上使用。它与语言 VM 的基本概念相同,因为它假装是一台实际不存在的机器,但实际上它是不同的并且非常复杂。
纯英语
编译器将一种语言转换为另一种语言。例如,C# 转换为 IL,Java 转换为字节码,C++ 转换为二进制机器码。在编译阶段没有执行。
解释器一次解释(执行)源文件中的一行。如PHP、Perl、其他脚本语言
虚拟机可以指几个东西,我知道的两个:
没有优点和缺点。这三个人都从事难以比较的不同工作。
语言和平台没有特别的顺序,实际上还有数百个其他示例