15.1 コンパイル型
ソースコードを事前に機械語へ変換します。
Rust
Go
C
C++
一般に、実行前に多くの検査が行われ、高速に実行できます。
15.2 仮想マシン型
中間コードへコンパイルし、仮想マシン上で実行します。
Java → JVMバイトコード
C# → .NET IL
実行時にJITコンパイルされる場合もあります。
15.3 インタプリタ型
ソースコードまたは中間表現を実行時に解釈します。
Python
Ruby
PHP
JavaScript
ただし、現代の実装は単純な逐次解釈だけではありません。
バイトコード化
JITコンパイル
実行時最適化
キャッシュ
そのため、「コンパイル言語かインタプリタ言語か」という二分法だけでは実態を説明できない場合があります。
15.4 コンパイル時と実行時
最も重要なのは、各処理がいつ行われるかです。
コンパイル時
構文検査
型検査
所有権検査
マクロ展開
コード生成
最適化
実行時
実データの処理
動的型検査
例外発生
Reflection
ガベージコレクション
動的ディスパッチ
旧世代から新世代への進化では、多くの言語が問題の検出を実行時からコンパイル時へ移しています。