JVM と CLR がスタックベースの仮想マシンとして設計されていることは理解しています。JIT がバイトコードをネイティブ コードにコンパイルするとき、スタック プリミティブ (ロード/ストア) も X86 プラットフォームのレジスタに変換しますか?
はいの場合、バイトコードがスタックベースかレジスタベースかは問題ではないようです。JITが重要です。
JVM と CLR がスタックベースの仮想マシンとして設計されていることは理解しています。JIT がバイトコードをネイティブ コードにコンパイルするとき、スタック プリミティブ (ロード/ストア) も X86 プラットフォームのレジスタに変換しますか?
はいの場合、バイトコードがスタックベースかレジスタベースかは問題ではないようです。JITが重要です。
x86 コアでレジスタを使用しないことは不可能です。プロセッサには、たとえば 2 つのローカル変数を追加する命令がありません。そのうちの 1 つをレジスタにロードする必要があります。次に、レジスタの値を変数の値に追加できます。そして、結果をスタック変数に戻します。
最適化の機会は、このシーケンスから明らかです。格納するのではなく、結果をレジスタに保持して後で使用するように、格納とロードの両方を節約します。それがオプティマイザの仕事です。利用可能なレジスタを最大限に活用する方法を探します。
確実に知る唯一の方法は、JIT コンパイル済み出力を調べることですが、レジスターの使用は JIT コンパイラーの最も不十分な最適化の 1 つであると言っても過言ではありません。ほとんどのプログラマーは、JIT コンパイラーよりも高速なコードを書くのは難しいと思います。
JIT コンパイラーは多くの機能を備えており、おそらく必要なだけレジスターを使用します。メソッドのインライン化のようなものはレジスターの使用を促進し、多くの命令型プログラム コードはレジスター ベースのアーキテクチャーでより単純に表現できるため、JIT コンパイラーがレジスターを使用することは理にかなっています。