口译员与编译器与虚拟机

Dod*_*bro 26 compiler-construction vm-implementation

我有一个关于口译员,编译器和VM的问题

现在我知道解释器和编译器之间的差异但是前两个虚拟机有什么不同?VM在口译员和编译器上的优缺点是什么?

非常感谢

小智 27

虚拟机并不完全是编译器或解释器的替代品.我想你正在考虑一个JIT编译器,它实现了多少个VM.

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

创建自己的指令集的好处通常是弥合长编译/优化时间和慢速解释器之间的差距.例如,当您编译Java类时,您不必执行任何寄存器分配或内联或任何传统编译器的操作.JIT将在稍后执行此操作,但仅适用于您运行足够次数的代码部分,并且在程序运行时分散.JVM的指令集足够接近Java,初始编译很快,并且与Java源代码不同,它对VM的读取简单快捷.

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

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

  • "实际上并不存在"并不是恰当的表达方式.真实情况是,可能没有制造的机器处理器可以使用给定VM的相同字节码语言.这并不意味着不能制造这样的机器处理器. (2认同)

ole*_*sii 19

简单的英语

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

解释器一次从源文件解释(执行)一行.如PHP,Perl,其他脚本语言

虚拟机可以参考几件事,我知道的两件事:

  • 与Hypervisor相关的虚拟机,如Hyper-V,Xen.这些允许您在单个硬件上运行多个OS
  • 软件运行时,如Java虚拟机,公共语言运行时.这个软件允许运行独立于平台的中间语言(IL代码,字节代码)并执行机器特定的指令(即时编译).通常,此类VM负责其他卫星任务:资源管理,内存清理,线程,安全性等

没有利弊.这三个人都做了很难比较的不同工作.

语言和平台没有特别的顺序,有数百个其他样本


mar*_*nas 7

真机与虚拟机

  • 真机是机器代码由硬件执行的机器
  • 虚拟机是由解释器执行"机器代码"的虚拟机.

口译员与编译员

答案在这里