1. ホーム
  2. jvm

[解決済み] なぜJVMはスタックベース、Dalvik VMはレジスタベースなのか?

2022-11-16 12:40:06

疑問点

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

JVMはプラットフォーム非依存であるはずなので、ある数のレジスタがターゲットプラットフォームで利用可能であると本当に仮定することはできないのでしょう。そのため、JIT コンパイラーにレジスタ割り当てなどを先送りします。(私が間違っていたら訂正してください)。

Androidの人たちは、「これは非効率だ、すぐにでもレジスタベースのVMを作ろう」と思ったのでしょうか。しかし待てよ、アンドロイドには複数の異なるデバイスがあり、Dalvikは何本のレジスタをターゲットにしていたのだろうか?Dalvikのオペコードは特定の数のレジスタ用にハードコードされているのでしょうか?

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

どのように解決するのですか?

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

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

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

レジスタベースのスキームで行くことは、おそらく Dalvik のコード ジェネレーターが、パフォーマンスの高いコードを生成するためにそれほど努力する必要がないことを意味します。極端にレジスタが多い、または少ないアーキテクチャ上で実行すると、おそらく Dalvik は不利になりますが、これは通常のターゲットではなく、ARM は非常に中道的なアーキテクチャなのです。


また、Dalvik の初期バージョンに JIT がまったく含まれていないことを忘れていました。命令を直接解釈するのであれば、レジスタベースの方式が解釈のパフォーマンスでは勝算があるのでしょう。