Compiler construction 解释器vs编译器vs虚拟机

Compiler construction 解释器vs编译器vs虚拟机,compiler-construction,vm-implementation,Compiler Construction,Vm Implementation,我有一个关于解释器、编译器和虚拟机的问题 现在我知道了解释器和编译器之间的区别,但是虚拟机与前两个有什么不同?与解释器和编译器相比,虚拟机的优点和缺点是什么 非常感谢通俗易懂的英语 编译器将一种语言转换为另一种语言。例如,C++输入IL,java成字节码,C++成二进制机器代码。编译阶段没有执行 解释器每次解释(执行)源文件中的一行。例如PHP、Perl和其他脚本语言 虚拟机可以指几件事,我知道这两件事: 与虚拟机监控程序相关的虚拟机,例如。这些允许您在单个硬件上运行多个操作系统 软件运行时,

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

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

非常感谢

通俗易懂的英语

编译器将一种语言转换为另一种语言。例如,C++输入IL,java成字节码,C++成二进制机器代码。编译阶段没有执行

解释器每次解释(执行)源文件中的一行。例如PHP、Perl和其他脚本语言

虚拟机可以指几件事,我知道这两件事:

  • 与虚拟机监控程序相关的虚拟机,例如。这些允许您在单个硬件上运行多个操作系统
  • 软件运行时,如。此软件允许运行独立于平台的中间语言(IL代码、字节码)并执行特定于机器的指令()。通常,这样的虚拟机负责其他卫星任务:资源管理、内存清理、线程、安全等
没有利弊之分。这三项工作的不同,很难进行比较


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

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

虚拟机本身就是这个名字所说的——它是一台实际上并不存在的机器(处理器)。例如,大多数处理器没有任何处理内存分配的内在方式,也没有任何类型知识。不过,JavaVM有一条
new
指令分配某个类的实例。VM的设计者认为,这在语言中是一个非常重要的概念,值得拥有自己的操作码,这是VM中的基本操作单元

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

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

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

真实机器与虚拟机器
  • 真正的机器是由硬件执行机器代码的机器
  • 虚拟机是其“机器代码”由解释器执行的机器
解释器与编译器

非常感谢,完全理解:)编译器和解释器&VM可以为任何语言编写,任何语言都可以翻译成可以由虚拟机执行的形式。任何语言都可以被编译,当然任何语言都可以被解释。这并不意味着这是一件有趣的事情。顶尖的朋友,只是我需要的“实际上并不存在”并不是正确的表达。事实上,可能没有一个制造的机器处理器可以使用给定VM的相同字节码语言。这并不意味着这样的机器处理器无法制造。