サイド プロジェクトの背景として、さまざまな仮想マシンの設計について読んでいますが、もちろん JVM が最も報道されています。また、BEAM (Erlang)、GHC の RTS (VM のようなものですが、完全な VM ではありません)、および JavaScript の実装の一部についても調べました。Python にはバイトコード インタープリターもありますが、これは存在することは知っていますが、あまり読んだことがありません。
私が見つけられなかったのは、特定の言語に対して特定の仮想マシンの設計が選択された理由の適切な説明です。私は特に、並行言語や非常に動的な (Ruby、JavaScript、Lisp) 言語に適合する設計の選択に関心があります。
編集:具体性を求めるコメントへの回答として、ここに例を示します。JVM はレジスタ マシンではなくスタック マシンを使用しますが、これは Java が最初に導入されたときに非常に物議をかもしました。JVM を設計したエンジニアは、プラットフォームの移植性を意図してそうしていたことが判明し、仮想レジスタが多すぎたり少なすぎたりするインピーダンスの不一致を克服するよりも、スタック マシンをレジスタ マシンに変換する方が簡単で効率的でした。
もう 1 つの例を次に示します。Haskell の場合、注目すべき論文は、Implementing lazy functions languages on stock hardware: the Spineless Tagless G-machineです。これは、私が知っている他のタイプの VM とは大きく異なります。実際のところ、GHC (Haskell の主要な実装) は実際には動作しませんが、コンパイルの中間ステップとして使用されます。Peyton-Jones は、動作しなかった仮想マシンを 8 つも挙げています。一部の VM が成功し、他の VM が失敗する理由を理解したいと思います。