JIT コンパイラーによってバイトコードをマシンコードにコンパイルするという概念については、まだよくわかりません。非 JIT インタープリターよりも高速なコードを生成する理由を知りたいです。このプロセスがどのように行われるかについて、誰かが私に良い例を教えてもらえますか?
3 に答える
百万回実行する必要があるループがあるとします。
「真の」インタープリターは、ループの各反復で this のバイトコードを見て、コードがシステム状態 (呼び出しなど) にどのような影響を与えるべきかを判断する必要があります。
JIT コンパイラは、バイトコードを 1 度だけ見て、コンピュータが直接理解できるネイティブ コードにコンパイルします。それ以上の変換は必要ありません。翻訳には時間がかかるので、一度で済むと効率的です。
実際の例を挙げると、英語の小説があり、それに興味を持ったフランス人が何人かいた場合、両方の言語を知っている人にその本を渡すことができます。または、その人に本を持ってきてもらい、それをフランス語に翻訳してもらい、各フランス人にフランス語で書かれた本のコピーを渡すこともできます。本に興味を持っている人が 1 人だけの場合は、オンザフライ翻訳の方が効率的です。コピー エディター、レイアウト スペシャリスト、プリンターなどは必要ありません。本を読んでから、より完全な 1 回限りの翻訳を行う方が理にかなっています。
1 HotSpot のものを含む一部の JIT は、用途に応じて、異なる最適化レベルで同じコードを実際に数回 JIT コンパイルします。
JIT でコンパイルされたコードは実際にはベア メタル上で直接実行されますが、解釈されたコードはインタープリターによって継続的に再解釈される必要があります。インタープリターは、バイトコードを再処理して再処理する必要がなくなりました。