コンパイラ・インタプリタ・JITの違い:実行方式を比較
ソースコードを実行する方法は、主に3つあります。コンパイラ(事前コンパイル、AOT)は、プログラムの実行前に、全体を機械語に変換します。インタプリタは、機械語のファイルを作らずに、実行しながらプログラムを読んで動かします。JITコンパイラ(ジャストインタイム)は、まずインタプリタで始め、よく使う部分を、プログラムの実行中に機械語へコンパイルします。多くの言語が、これらを組み合わせています。
| 項目 | コンパイラ(AOT) | インタプリタ | JITコンパイラ |
|---|---|---|---|
| 変換する時期 | 実行前。プログラム全体が機械語になる | 実行中。プログラムを読みながら、1ステップずつ動かす | 実行中。よく使うコードを機械語にコンパイルする |
| 起動 | 速く始まる(ただし先にビルドが必要) | 速く始まる。ビルドは不要 | 最初は遅い。コードが温まる(ウォームアップ)まで |
| 実行速度 | 最も速く、予測しやすい | 最も遅い。コンパイルしたコードの何倍も遅いことが多い | ウォームアップ後はコンパイルした速度に近く、実行時の情報を使って、速くなることもある |
| 移植性 | プラットフォームごとにバイナリが必要 | 移植しやすい。インタプリタがある場所なら動く | 移植しやすいバイトコードと、プラットフォームごとのランタイム |
| エラーの検出 | 多くのエラーをコンパイル時に見つけられる | 問題のある行が実行されたときにエラーが出る | 言語による |
| メモリの使用量 | 実行時の負荷が小さい | インタプリタ自体がメモリに常駐する | コンパイラと、コンパイル済みコードのキャッシュのために、メモリが余分に要る |
| 開発の流れ | 編集、ビルド、実行 | 編集してすぐ実行 | 多くは編集して実行、またはバイトコードへビルド |
| 代表的な言語 | C、C++、Rust、Go | 従来のPython(CPython)、Ruby、シェルスクリプト | Java(HotSpot)、JavaScript(V8)、C#(.NET)、PyPy |
数値は代表的な目安で、世代や製品によって異なります。