【コードせいせい】
コード生成(コンパイラ) とは?
最終更新:
💡 対象環境に合う命令やコードへ変換する
コンパイラが入力の表現を、対象環境で使うコードへ変換する処理。IRからCPU向けコードへの変換、命令選択・レジスタ割り当て・スケジューリング、出力とリンクの違いを解説します。
📌 このページのポイント
- 対象CPU向けのコード生成では、IRから命令列を作る
- 命令選択・レジスタ割り当て・スケジューリングなどを行う
- 工程の数や順序は実装による。固定の3ステップではない
- コード生成の出力と、リンク済みの実行ファイルを区別する
命令選択では、何を選ぶの?
レジスタ割り当ては、変数を16個の場所に入れること?
その後は、命令の順番を並べるだけ?
生成できたら、そのまま実行できる?
アセンブリやオブジェクトファイルなど、出力の形によるよ。必要なライブラリなどとリンクして実行ファイルにする場合もある。JITでは実行中にコードを生成することもあるけれど、それだけで常に速くなる保証はないんだ。
もっと詳しく知りたい人へ
最適化は、コード生成だけが担当する?
コンパイラの最適化は、IRなどを対象にした段階にもあります。CPU向けの生成では対象の命令や制約に応じた処理を行いますが、プログラム全体の速さはアルゴリズム、メモリの使い方、実行環境などにも左右されます。コンパイラの更新で、すべてのコードが毎回速くなるわけではありません。
「IRを生成する」と「IRから生成する」は矛盾する?
変換の段階が異なります。フロントエンドでは構文木などからIRを作り、バックエンドではIRから対象向けのコードを作ります。code generationという言葉を見たら、何を入力し、何を出力する段階かを確認すると理解しやすくなります。
まとめ:ざっくりこれだけ覚えればOK!
「コード生成」って出てきたら「コンパイラで対象環境に合うコードを作る処理」と思えばだいたいOK!
📖 おまけ:英語の意味
「Code Generation」 = コードの生成
💬 文脈によって生成するものが異なります。LLVMのチュートリアルには構文木からLLVM IRへのcode generationもあり、必ず機械語だけを意味する用語ではありません。