Jvm 将虚拟机设计与其主要编程语言相匹配

Jvm 将虚拟机设计与其主要编程语言相匹配,jvm,language-design,vm-implementation,Jvm,Language Design,Vm Implementation,作为一个附带项目的背景,我一直在阅读不同的虚拟机设计,JVM当然是最受关注的。我还研究了BEAM(Erlang)、GHC的RTS(有点像VM,但不太像VM)和一些JavaScript实现。Python还有一个字节码解释器,我知道它是存在的,但我没有读过太多 我没有找到一个很好的解释来解释为什么要为特定的语言选择特定的虚拟机设计。我对适合并发和/或非常动态(Ruby、JavaScript、Lisp)语言的设计选择特别感兴趣 编辑:针对要求具体说明的评论,这里是一个例子。JVM使用堆栈机而不是寄存

作为一个附带项目的背景,我一直在阅读不同的虚拟机设计,JVM当然是最受关注的。我还研究了BEAM(Erlang)、GHC的RTS(有点像VM,但不太像VM)和一些JavaScript实现。Python还有一个字节码解释器,我知道它是存在的,但我没有读过太多

我没有找到一个很好的解释来解释为什么要为特定的语言选择特定的虚拟机设计。我对适合并发和/或非常动态(Ruby、JavaScript、Lisp)语言的设计选择特别感兴趣


编辑:针对要求具体说明的评论,这里是一个例子。JVM使用堆栈机而不是寄存器机,这在Java首次引入时非常有争议。事实证明,设计JVM的工程师这样做是为了平台的可移植性,将堆栈机转换回寄存器机比克服阻抗不匹配(虚拟寄存器太多或太少)更容易、更有效


这是另一个例子:对于Haskell来说,要看的文件是。这与我所知道的任何其他类型的VM都非常不同。事实上,GHC(Haskell的首要实现)不是实时运行的,而是用作编译的中间步骤。Peyton Jones列出了不少于8台其他无法工作的虚拟机。我想了解为什么有些虚拟机成功了,而另一些虚拟机失败了。

我觉得这本书很有帮助。它讨论了你所问的许多问题。(请注意,我与亚马逊没有任何关联,也没有推广亚马逊;只是这是最容易链接的地方)


派生VM的技术之一就是沿着编译链,将源语言转换为越来越多的低级中间语言。一旦你发现了一种适合于平面表示的足够低级的语言(即,可以序列化为一系列“指令”)这就是你的虚拟机。您的VM解释器或JIT编译器将从您选择的序列化点继续您的转换链

一些序列化技术非常常见-例如,对表达式树使用伪堆栈表示(如.NET CLR,它根本不是“真正的”堆栈机器)。否则,您可能希望使用SSA表单进行序列化,如在LLVM中,或者简单地使用具有无限多个寄存器的3地址VM(如在Dalvik中)。您采用哪种方式并不重要,因为这只是一种序列化,稍后将进行反序列化以继续您的正常编译方式


如果您打算立即解释您的VM代码而不是编译它,情况就有点不同了。目前,对于哪种虚拟机更适合解释,还没有达成共识。基于堆栈(或者我敢说,第四种)的虚拟机和基于寄存器的虚拟机都被证明是有效的。

我将从另一个角度回答您的问题:什么是虚拟机?VM只是比源语言更低级别语言的“解释器”的规范。在这里,我使用“解释器”这个词的黑匣子含义。我不关心VM是如何实现的(作为字节码编译器、JIT编译器等等)。如果这样说,从设计的角度来看,虚拟机并不是一件有趣的事情,它是一种低级语言

理想的VM语言将做两件事。第一,它将使将源语言编译成它变得容易。第二,它还可以使目标平台上的解释变得容易(在目标平台上,解释程序可以非常简单地实现,也可以是一些非常复杂的JIT,如Hotspot或V8)

显然,这两个理想属性之间存在张力,但它们或多或少会在一条线上形成两个端点,穿过所有可能VM的设计空间。(或者,可能是比直线更复杂的形状,因为这不是一个平坦的欧几里德空间,但你明白了)。如果您构建的VM语言远远超出了这一范围,那么它将不会非常有用。这就是限制VM设计的因素:将它放在理想线路的某个地方

这也是为什么高级虚拟机倾向于非常特定于语言,而低级虚拟机更不依赖于语言,但不提供很多服务。高级VM本质上接近源语言,这使得它远离其他不同的源语言。低级虚拟机本质上接近目标平台,因此接近许多语言理想行的平台端,但低级虚拟机也离大多数源语言理想行的“易于编译”端相去甚远

现在,更广泛地说,从概念上讲,任何编译器都可以看作是从源语言到中间形式的一系列转换,而中间形式本身也可以看作是VM的语言。中间语言的虚拟机可能永远无法构建,但它们可以。编译器最终发出最终形式。最终的形式本身就是一种虚拟机语言。我们可以称之为VM“JVM”、“V8”……或者我们可以称之为VM“x86”、“ARM”等等


希望能有所帮助。

这个话题太宽泛了一点。你能给出一些你最感兴趣的设计方面吗?或任何其他例子+Dalvik JVM使用基于寄存器的体系结构——您应该看看Parrot的文档,Parrot最初是为Perl设计的,但后来被用于其他几种语言。文档讨论了动态类型语言的VM功能,而不是Java.SpacedMonkey等更静态的语言-Dakvik不是JVM,JVM
。class
文件不会在其上运行。J的字节码