最終更新:
コンパイラの仕組みとは?解析・最適化・リンクまでを図解
コンパイラは何をするの?
最初は何から始まるの?
文法が正しければ、正しいコード?
まだだよ。意味解析で名前の参照や型などを確認する。構文が正しくても、宣言されていない名前を使うなどの問題がある。解析で得るASTはコードの構造を表す木で、チェックと変換の土台になるんだ。
ASTから直接機械語になるの?
最適化は何を変えるの?
コード生成まで終われば実行できる?
JITはこの流れと別のもの?
ビルドが通れば安心?
文法や型が正しくても、入力の扱いやロジックの誤りは残るよ。コンパイル・リンク・実行のどの段階で失敗したかを分けて調べよう。エラーメッセージを最初に読むと、修正する場所を絞りやすくなるんだ。
「コンパイルエラー」と「リンクエラー」を分ける
| 段階 | 確認するもの | 問題の例 |
|---|---|---|
| 前処理・解析 | include、文法、名前、型 | ヘッダがない、識別子が未宣言 |
| IR・最適化・コード生成 | 中間表現と対象CPU向けの変換 | 対応しないターゲット設定 |
| アセンブル・リンク | オブジェクトとシンボルの解決 | 呼び出した関数の定義をリンクしていない |
| 実行 | 実際の入力・資源・処理 | ファイルがない、期待と異なる計算結果 |
Clangで段階を止めて観察する
Clangと必要な開発環境が導入済みで、hello.cがある場合の例です。出力先は作業用フォルダにします。
clang -E hello.c -o hello.i
clang -S hello.c -o hello.s
clang -c hello.c -o hello.o
clang hello.o -o hello
-Eは前処理まで、-Sはアセンブリ出力まで、-cはオブジェクト作成までで止めます。最後のコマンドがリンクです。実行ファイルの名前やリンクに必要なツール・ライブラリはOSで異なります。
LLVMを使う言語のフロントエンドも、構文解析だけで済むわけではありません。名前・型・言語固有の意味を扱い、適切なIRへ変換する仕事が必要です。
参考資料
確認日:2026年9月26日。製品の仕様・料金・対応環境は導入時にも確認してください。
- Clang command guide:前処理・意味解析・IR・アセンブル・リンクと停止オプション。
- LLVM: My First Language Frontend:字句・構文解析からIR生成とJIT。