Joh*_*ler 16 jvm language-design vm-implementation
作为辅助项目的背景,我一直在阅读有关不同虚拟机设计的内容,其中JVM当然获得了最多的新闻.我还看了BEAM(Erlang),GHC的RTS(有点但不是很简单的VM)和一些JavaScript实现.Python也有一个字节码解释器,我知道存在,但没有读太多.
我没有找到的是一个很好的解释为什么为特定语言选择特定的虚拟机设计.我对那些适合并发和/或非常动态(Ruby,JavaScript,Lisp)语言的设计选择特别感兴趣.
编辑:在回答要求特异性的评论时,这是一个例子.JVM使用堆栈计算机而不是寄存器计算机,这在Java首次引入时非常有争议.事实证明,设计JVM的工程师已经完成了这样的平台可移植性,并且将堆栈机器转换回寄存器机器比克服虚拟寄存器太多或太少的阻抗不匹配更容易,更有效.
这是另一个例子:对于Haskell,要查看的论文是在库存硬件上实现懒惰的函数式语言:Spineless Tagless G-machine.这与我所知道的任何其他类型的VM非常不同.事实上GHC(Haskell的首要实现)并不是实时运行,而是用作编译的中间步骤.Peyton-Jones列出了不少于8个其他无效的虚拟机.我想了解为什么有些VM会在其他失败的情况下成功.
我将从不同的角度回答您的问题:什么是虚拟机?VM 只是比源语言低级语言的“解释器”规范。这里我使用“解释器”这个词的黑匣子含义。我不关心虚拟机是如何实现的(作为字节码解释器、JIT 编译器,等等)。这样说时,从设计的角度来看,VM 并不是有趣的东西,它是低级语言。
理想的 VM 语言将做两件事。第一,它将使得将源语言编译成它变得容易。第二,它还将使在目标平台上的解释变得容易(同样,解释器可以非常简单地实现,或者可以是一些非常复杂的 JIT,如 Hotspot 或 V8)。
显然,这两个理想的属性之间存在紧张关系,但它们或多或少在穿过所有可能的虚拟机的设计空间的线上形成了两个端点。(或者,也许是一些比直线更复杂的形状,因为这不是一个平坦的欧几里得空间,但你明白了)。如果你构建的虚拟机语言远远超出了该线,那么它不会很有用。这就是限制 VM 设计的因素:将其放置在理想线路的某个位置。
这也是为什么高级虚拟机往往是特定于语言的,而低级虚拟机与语言无关但不提供很多服务。高级虚拟机本质上接近于源语言,这使得它远离其他不同的源语言。低级 VM 本质上接近目标平台,因此接近许多语言的理想线的平台端,但低级 VM 也离理想线的“易于编译”端相当远。大多数源语言。
现在,更广泛地说,从概念上讲,任何编译器都可以被视为从源语言到中间形式的一系列转换,中间形式本身可以被视为虚拟机的语言。中间语言的虚拟机可能永远不会被构建,但它们可以。编译器最终会发出最终形式。最终形式本身就是虚拟机的语言。我们可能会将该 VM 称为“JVM”、“V8”...或者我们可能会将该 VM 称为“x86”、“ARM”等。
希望有帮助。
归档时间: |
|
查看次数: |
772 次 |
最近记录: |