【コードせいせい】

コード生成(コンパイラ) とは?

💡 コンパイラの「最終工程」。抽象的な中間コードをCPUが実際に動かせる命令列に仕立て上げる。
📌 このページのポイント
コード生成フェーズの3ステップ 命令選択 IRの操作を CPU命令に対応 レジスタ割り当て 変数を16個の レジスタに割り付け 命令スケジューリング パイプラインを 最大限に活用 中間表現 (IR) 入力 マシンコード 出力(CPUが直接実行) 入力
コード生成の3ステップ:命令選択 → レジスタ割り当て → 命令スケジューリング
ひよこ ひよこ

コード生成って、コンパイラがコードを書いてくれるってこと?

ペンギン先生 ペンギン先生

少し違うよ。コンパイラのコード生成とは、中間表現という抽象的なコードを、CPUが直接実行できるネイティブ命令列に変換するフェーズのことだよ。

ひよこ ひよこ

具体的にどんな処理をするの?

ペンギン先生 ペンギン先生

大きく3つあるよ。まず「命令選択」でIRの各操作をCPU命令セットに対応させる。次に「レジスタ割り当て」で変数をCPUの限られたレジスタに割り当てる。最後に「命令スケジューリング」でパイプラインを最大限活かせるように命令の順序を並び替えるんだ。

ひよこ ひよこ

レジスタって何なの?

ペンギン先生 ペンギン先生

CPUの中に直接ある超高速な記憶場所だよ。x86-64なら汎用レジスタは16個しかないんだ。変数の数がレジスタより多ければ、一部をメモリに退避(スピル)しないといけない。このレジスタ割り当てが不出来だと、メモリアクセスが増えて遅くなるんだよ。

ひよこ ひよこ

JITコンパイルでもコード生成って行われるの?

ペンギン先生 ペンギン先生

されるよ。JIT(Just-In-Time)はプログラムを実行しながら「よく使われる部分」を検出して、そこにリアルタイムでコード生成をかけるんだ。JavaのHotSpotやV8(JavaScript)がこの仕組みで動いていて、インタープリタよりずっと速く動けるんだよ。

ひよこ ひよこ

コード生成の出来不出来って、どのくらい実行速度に影響するの?

ペンギン先生 ペンギン先生

大きく変わるよ。たとえばSIMD命令(複数データを一度に処理できるCPU命令)をうまく使えるかどうかで数倍変わることもある。LLVMやGCCのようなコンパイラがバージョンアップするたびに速くなるのは、コード生成の最適化が改善されているからなんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「コード生成(コンパイラ)」って出てきたら「IRをCPUが動かせる命令に変換するコンパイラの後段処理」と思えればだいたいOK!
📖 おまけ:英語の意味
「Code Generation」 = コード生成
💬 コンパイラ理論の古典的用語で、「コードを生成する(Generate Code)」そのままの命名だよ。バックエンド処理とも呼ばれ、フロントエンド(字句解析・構文解析)や最適化フェーズの後に来る最終変換ステップだよ。
← 用語集にもどる