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

16
作为一个副业的背景,我一直在阅读不同的虚拟机设计,其中JVM当然得到了最多的关注。我还看了BEAM(Erlang)、GHC的RTS(有点但不完全是VM)以及一些JavaScript实现。Python也有字节码解释器,但我没有读过太多相关内容。
我没有找到一个好的解释 为什么会针对特定语言做出特定的虚拟机设计选择。我特别关心与并发和/或非常动态(Ruby、JavaScript、Lisp)语言相适配的设计选择。

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

这里有另一个例子:对于Haskell,应该查看的文章是 Implementing lazy functional languages on stock hardware: the Spineless Tagless G-machine。这与我所知道的任何其他类型的虚拟机都非常不同。事实上,GHC(Haskell的首选实现)不是实时运行的,而是用作编译过程中的一个中间步骤。Peyton-Jones列举了至少8个其他的虚拟机失败的例子。我想了解为什么有些虚拟机成功,而其他的失败了。


5
这个话题有点太广泛了。你能否提供一些你最感兴趣的设计特定方面或任何其他例子?无论如何,我给你一个赞,因为这可能会带来一些有趣的答案。 - Jivings
1
Dalvik JVM使用基于寄存器的架构 - http://en.wikipedia.org/wiki/Dalvik_(software) - SpacedMonkey
2
你应该查看Parrot的文档http://www.parrot.org/,它最初是为Perl设计的,但现在已被用于其他几种语言。文档讨论了动态类型语言与更静态语言(如Java)的虚拟机功能。 - Gene
1
SpacedMonkey - Dakvik 不是 JVM,JVM 的 .class 文件无法在其上运行。在将 JVM 的字节码放入 Android 设备之前,需要将其转换为 Dalvik 字节码。 - John F. Miller
1
这个不是更适合程序员吗? - Austin Henley
显示剩余3条评论
3个回答

2
我将从不同的角度回答你的问题:什么是虚拟机?虚拟机只是一个规范,用于解释比源语言更低级别的语言。这里使用“解释器”的黑盒含义。我不关心虚拟机如何实现(作为字节码解释器,JIT编译器等)。从设计的角度来看,虚拟机并不是有趣的东西,而是低级别语言。
理想的虚拟机语言将执行两个操作。第一,它将使得将源语言编译到其中变得容易。第二,它也将使得在目标平台上解释变得容易(在这里解释器可以非常原始,也可以是像Hotspot或V8这样非常复杂的JIT)。显然,这两种理想属性之间存在紧张关系,但它们或多或少形成了所有可能虚拟机的设计空间中的两个端点的线。如果将虚拟机语言构建得远离该线,则它将没有什么用处。这就限制了虚拟机的设计:将其放置在该理想线的某个位置。
该线也是高级虚拟机倾向于非常特定于某种语言而低级虚拟机更加通用但提供的服务不多的原因。高级虚拟机本质上接近源语言,这使其与其他不同的源语言相距甚远。低级虚拟机本质上接近目标平台,因此对于许多语言而言,它们接近理想线的平台端,但该低级虚拟机也将与大多数源语言的“易于编译到”理想线的末端相距甚远。
更广泛地说,从概念上讲,任何编译器都可以看作是从源语言到中间形式的一系列转换,这些中间形式本身可以看作是虚拟机的语言。可能永远不会为中间语言构建虚拟机,但它们可能会。编译器最终发出的最终形式本身将是虚拟机的语言。我们可以将该虚拟机称为“JVM”,“V8”...或者我们可以将该虚拟机称为“x86”,“ARM”等。
希望这能有所帮助。

1

推导虚拟机的技术之一是沿着编译链向下转换源语言为更低级别的中间语言。一旦你找到一个足够低级别的适合扁平表示(即可以序列化为“指令”序列的语言),这就是你的虚拟机。你的虚拟机解释器或JIT编译器将从你选择进行序列化的点继续你的转换链。

一些序列化技术非常常见,例如使用伪堆栈表示表达式树(如.NET CLR,它根本不是真正的堆栈机)。否则,您可能希望使用SSA形式进行序列化,如LLVM,或者只是一个具有无限数量寄存器的3地址虚拟机(如Dalvik)。由于这只是一种序列化,因此采取哪种方式并不重要,稍后会对其进行反序列化以继续您的正常编译方式。

如果您打算立即解释您的VM代码而不是编译它,则情况有所不同。目前还没有共识认为哪种类型的VM最适合解释。基于堆栈(或我敢说是Forth)的VM和基于寄存器的VM都被证明是有效的。


0
我发现这本书很有帮助。它讨论了你所问的许多要点。(请注意,我与亚马逊没有任何关联,也不是在推广亚马逊;只是从中链接最方便)。

http://www.amazon.com/dp/1852339691/


这不是一个答案,你可以将其作为评论提及。 - dilip kumbham
你能给我一个关于这个主题的摘要吗? - John F. Miller
有一个完整的实现技术章节,比较了基于堆栈和寄存器的机器。 - Jim
很有趣,当你提出一个没有具体答案的广泛问题时,你会对一个回答进行负面评价。你为自己做了什么来帮助自己?你在研究中遇到了什么具体问题?如果你想比较虚拟机设计及其在不同情况下的使用,请阅读一本书。 - Jim
抱歉,Jim,这不是关于阅读书籍的问题,而是需要更实际的答案,而不仅仅是建议一本书。 - dilip kumbham
这是一个不太好的问题。除了写一本书来回答,最好的答案就是建议一本书。这是我对此事的看法。 - Jim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接