作为一个附带项目的背景,我一直在阅读不同的虚拟机设计,当然 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 个其他无法运行的虚拟机。我想了解为什么有些虚拟机成功而其他虚拟机失败。