web-dev-qa-db-ja.com

JVMがスタックベースで、Dalvik VMレジスタベースですか?

なぜ、SunがJVMをスタックベースにし、GoogleがDalvikVMをレジスタベースにすることにしたのでしょうか?

JVMは、プラットフォームに依存しないはずなので、ターゲットプラットフォームで特定の数のレジスタが利用可能であると実際に想定できないと思います。そのため、JITコンパイラへのレジスタ割り当てなどを延期するだけです。 (間違っている場合は修正してください。)

Androidの人たちは、「ちょっと、それは非効率的です。すぐに登録ベースのvmに行きましょう...」と考えましたか?しかし、待ってください、複数の異なるAndroidデバイスがあります。Dalvikは何個のレジスタをターゲットにしましたか? Dalvikオペコードは、特定の数のレジスタに対してハードコードされていますか?

現在市販されているすべてのAndroidデバイスには、ほぼ同じ数のレジスタがありますか?または、dex-loading中に実行されるレジスタの再割り当てはありますか?これはどのように組み合わされますか?

95
aioobe

スタックベースのVMには、Javaの設計目標によく適合するいくつかの属性があります。

  1. スタックベースの設計では、ターゲットハードウェア(レジスタ、CPU機能)についてほとんど仮定を行わないため、さまざまなハードウェアにVMを簡単に実装できます。

  2. 命令のオペランドは主に暗黙的であるため、オブジェクトコードは小さくなる傾向があります。これは、低速のネットワークリンクを介してコードをダウンロードする場合に重要です。

レジスタベースのスキームを使用することは、おそらく、Dalvikのコードジェネレーターがパフォーマンスコードを生成するために懸命に動作する必要がないことを意味します。非常にレジスタが豊富な、またはレジスタが少ないアーキテクチャで実行すると、Dalvikにハンディキャップをかける可能性がありますが、それは通常のターゲットではありません-ARMは、非常に中間的なアーキテクチャです。


また、Dalvikの初期バージョンにはJITがまったく含まれていなかったことも忘れていました。命令を直接解釈する場合、おそらくレジスタベースのスキームが解釈パフォーマンスの勝者です。

65
Mark Bessey

私は参照を見つけることができませんが、Sunはスタックベースのバイトコードアプローチを決めたと思います。なぜなら、レジスタが少ないアーキテクチャ(IA32など)でJVMを簡単に実行できるからです。

Google I/O 2008の Dalvik VM Internals )で、Dalvik作成者 Dan Bornstein は、レジスタベースの選択VM presentation slides のスライド35で:

マシンの登録

どうして?

  • 命令の派遣を避ける
  • 不要なメモリアクセスを避ける
  • 命令ストリームを効率的に消費します(命令あたりのセマンティック密度が高くなります)

スライド36で:

マシンの登録

統計

  • 30%少ない命令
  • 35%少ないコードユニット
  • 命令ストリームのバイト数が35%増えました
    • しかし、私たちは一度に2つを消費するようになります

Bornsteinによれば、これは「一連のクラスファイルをdexファイルに変換するときに見つけることができる一般的な期待」です。

プレゼンテーションビデオの関連部分は、25:00 から始まります。

Shi他による "Virtual Machine Showdown:Stack Versus Registers"というタイトルの洞察力に富んだ論文もあります。 (2005) 。スタックベースの仮想マシンとレジスタベースの仮想マシンの違いを調査します。

27
Flow

SunがJVMスタックベースを作成することにした理由はわかりません。 Erlangs仮想マシン、BEAMはパフォーマンス上の理由から登録ベースです。また、Dalvikはパフォーマンス上の理由から登録ベースであるようです。

から Pro Android 2

Dalvikは、スタックではなく、主にデータストレージの単位としてレジスタを使用します。 Googleは、結果として30%少ない指示を達成することを望んでいます。

そして、コードサイズに関して:

Dalvik VMは、生成されたJavaクラスファイルを取得し、それらを1つ以上のDalvik実行可能(.dex)ファイルに結合します。複数のクラスファイルからの重複情報を再利用します、必要なスペース(非圧縮)を従来の.jarファイルから半分に削減します。たとえば、AndroidのWebブラウザーアプリの.dexファイルは約200kですが、同等の非圧縮.jarファイルは目覚まし時計の.dexファイルは約50kで、.jarバージョンではその約2倍のサイズです。

そして、私が覚えているように コンピューターアーキテクチャ:定量的アプローチ は、登録マシンがスタックベースのマシンよりもパフォーマンスが良いと結論付けています。

12
Jonas