6

JVMとCLRがスタックベースのアーキテクチャを備えている理由について常に興味がありますか?なぜ彼らはレジスターベースのアプローチを使わないのですか?レジスタベースのアプローチに比べてどのようなメリットがありますか?

4

2 に答える 2

9

以前は、レジスター マシンとスタック マシンの違いについて考えたり、命令シーケンスを比較したり、ベンチマークを実行したりしていました...

その後、レジスター マシンである Parrot VM で作業しながら、両方のタイプのマシンを実装するのに数年を費やしました。データ スタックとレジスタ スタックを組み合わせた固定レジスタ セットから単純に開始しましたが、最終的にはこれは人為的な制限であると結論付けたため、無限レジスタ セットとアロケータに変更しました。ある時点で、Parrot の高速コア (GCC で計算された goto) は、Mono および JVM インタープリター コア (非 JIT) よりも優れていましたが、違いは JIT に帰着しました。Parrot の JIT は、他の製品の品質に匹敵するものではありませんでした。最終的なマシンを作るのは JITter の品質であり、それは一般的に人々が気にかけていることです。すべての VM が同じルールで再生される場合 (つまり、JIT なしでインタープリター モードで実行するという制約があった場合)、私の証拠は、レジスターマシンが同等のスタックマシンよりもパフォーマンスが優れていることを示しています。命令は大きくなりますが、命令の数は少なくなります == スループット (IPC) が高くなり、参照のキャッシュの局所性が向上します。Dalvik JVM は実際に私の調査結果を裏付けています。Dalvik には数年間 JIT がなく、インタープリター コアと競合していました。

非常に少数の主流の VM が排他的に解釈モードで実行され (AFAIK)、それらは JIT コンパイルされ、それが私たちがベンチマークしたものです。インタープリター コアのポイントは、プラットフォーム上で存在を確立し、バイトコードの検証を行い、JIT がない場合にフェイルセーフ実行コアを提供することです。もちろん、これはルールではありません。JIT なしで ARM アクセラレーション JVM を実行しているデバイスは何十億もありますが、メモリまたは CPU の制約がない場合は、これが当てはまります。

私はコアの微調整、テスト、およびチューニングに取り組みましたが、最終的には高速な JIT が本当に必要であることがわかりました。最終的に JIT を実行するのであれば、スタックを実装するかマシンを登録して起動するかは大した問題ではないという結論に達しました。好きなことをしてください。しかし、スタック マシンを使用すると、「市場投入」をより迅速に行うことができます。仮想マシン コアがバイトコードを解釈するために多くの疑似レジスタ マシン仮想最適化を行うことは、実際のネイティブ最適化ではないため、部分的に無駄な作業です。ソフトコアは、分岐予測、レジスタの名前変更、命令の並べ替え、並列実行、または実際のプロセッサのようなプリフェッチを行いません。ネイティブ バイナリへの高品質な JIT があれば、同じ目的地に到達できると思います。

これらの理由から、私は技術的にスタックベースのマシンを次のように好みます。

  1. シンプルさ - 維持するコードが大幅に減る = バグが減る
  2. 実装する時間

しかし、視覚的にも感情的にも、私はレジスターマシンを次のように好みます。

  1. 視覚概念モデルは機械と私の脳によりよく一致します。
  2. 柔軟性 - コンパイラは、SSA を使用して異なる順序で式ツリーを評価できます。

コンパイラがより「簡単に」コードを生成できるとは言っていないことに注意してください。これは、主にスタック マシンを扱ってきた人々が主張するのが好きなことのようです。私はそれを信じていませんし、それが真実だとは思いませんでした。Parrot と CLR の両方で短期間に書かれた多くの趣味のコンパイラを見ましたが、CLR のコンパイラの方が高品質であることは認めますが、それは主にエコシステムと利用可能なツールの品質の 1 つです。私は自分で両方のプラットフォームでコンパイラを作成しましたが、トレードオフがあることがわかりましたが、寝坊するほどではありませんでした。

私の実際の経験には完全な JITter の記述が含まれていないため、これは経験に基づいた推測です。そのため、さまざまな形式のオペコードを JIT することの長所と短所を直接比較した経験がありませんが、私の意見は、 JIT を含めると、非常に洗練された仮想マシン オペコード コアを作成すると、最適化が時期尚早になります。あなたの時間は他の場所で過ごすほうがよいでしょう。

于 2014-06-19T04:44:21.557 に答える
3

通常、記事にリンクするだけでは適切ではありませんが、今回は例外として、Eric Lippert によるこの記事はまさにこの質問に答えます。

于 2012-10-28T22:50:29.220 に答える