質問: 頭があれで、説明が下手ですいませんが、Javaの言語は**「ソースコード」→「バイトコード」→「機械語」**という**順番で変換**されて実行されますが、 「ソースコード」→「バイトコード」に変換する際は「**コンパイラ方式**」で変換 「バイトコード」→「機械語」に変換する際は「**インタプリタ方式**」で変換 という2つの方式を使って実行されていくと思いますが、 このページの**「バイトコードの実行方式」**を見てみると > > ・バイトコードをインタプリタで逐次解析しながら、「JVM」という仮想マシン上で実行。 > > ・バイトコードの読み込み時に、JITコンパイラがバイトコードを機械語にコンパイルして実行。 > > > と書かれていますが、一つ目の「バイトコードをインタプリタで逐次解析」のところはわかりますが、 もう一つの「バイトコードの読み込み時に、JITコンパイラがバイトコードを機械語にコンパイルして実行。」というのは これはどういうことでしょうか? つまり、 「バイトコードを機械語に変換する方式として**インタプリタで実行**」 「バイトコードを機械語に変換する方式として**コンパイラで実行**」 ↑この**2つのこと**を指すのでしょうか? もし、この2種類があったとしたら、どんなときに**どのタイミングで方式**(インタプリタ・コンパイラ)**を変える**のでしょうか? それとも**同時並行**で実行するのでしょうか? よろしくお願いします。
回答: > > 「バイトコード」→「機械語」に変換する際は「インタプリタ方式」で変換 > > > ここから間違っています。インタプリタは機械語に変換などしません。 インタプリタというプログラムが、バイトコードをデータとして読み取って、バイトコードをJavaVMの命令として解釈(インタプリット)し、その解釈した通りに処理します。 これだと多数回の繰り返し処理などで繰り返す度に解釈処理を行うため、効率が悪いので、解釈実行処理の代わりに解釈して機械語に変換してからその機械語を呼び出すようにした物が、JITコンパイラです。 細かいところを無視して丸めた話にすると、 ★一度しか実行しない処理 ・・・・・インタプリタ: 解釈→実行 ・・・・・JITコンパイラ: 解釈→機械語変換→実行 ★ループで1万回実行する処理 ・・・・・インタプリタ: (解釈→実行)×10000 ・・・・・JITコンパイラ: 解釈→機械語変換→(実行)×10000 JITコンパイラの詳細は他の方の回答参照。 なお、上記で「インタプリタ」と書いたのはJITコンパイル機能を持たない純粋なインタプリタのことです。実際には、JITコンパイル機能を内蔵したものもインタプリタと呼ばれます。