6

JVM と CLR がスタックベースの仮想マシンとして設計されていることは理解しています。JIT がバイトコードをネイティブ コードにコンパイルするとき、スタック プリミティブ (ロード/ストア) も X86 プラットフォームのレジスタに変換しますか?

はいの場合、バイトコードがスタックベースかレジスタベースかは問題ではないようです。JITが重要です。

4

3 に答える 3

2

x86 コアでレジスタを使用しないことは不可能です。プロセッサには、たとえば 2 つのローカル変数を追加する命令がありません。そのうちの 1 つをレジスタにロードする必要があります次に、レジスタの値を変数の値に追加できます。そして、結果をスタック変数に戻します。

最適化の機会は、このシーケンスから明らかです。格納するのではなく、結果をレジスタに保持して後で使用するように、格納とロードの両方を節約します。それがオプティマイザの仕事です。利用可能なレジスタを最大限に活用する方法を探します。

于 2012-06-19T01:01:33.457 に答える
0

確実に知る唯一の方法は、JIT コンパイル済み出力を調べることですが、レジスターの使用は JIT コンパイラーの最も不十分な最適化の 1 つであると言っても過言ではありません。ほとんどのプログラマーは、JIT コンパイラーよりも高速なコードを書くのは難しいと思います。

JIT コンパイラーは多くの機能を備えており、おそらく必要なだけレジスターを使用します。メソッドのインライン化のようなものはレジスターの使用を促進し、多くの命令型プログラム コードはレジスター ベースのアーキテクチャーでより単純に表現できるため、JIT コンパイラーがレジスターを使用することは理にかなっています。

于 2012-06-18T23:29:28.267 に答える