最終更新:

コンパイラの仕組みとは?解析・最適化・リンクまでを図解


CをClangで実行ファイルにする例 1 前処理・解析 include・マクロなどを処理 字句・構文・意味を解析 ASTで構造を表す 2 IR・最適化・コード生成 LLVM IRなどの中間表現へ 意味を保つ範囲で最適化 対象CPU向けのコードを生成 3 アセンブル・リンク オブジェクトファイルを作成 ほかの定義・ライブラリと結合 実行時の正しさは別途検証 言語・実装により変換先や工程は異なる CをClangで実行ファイルにする例 1 前処理・解析 include・マクロなどを処理 字句・構文・意味を解析 ASTで構造を表す 2 IR・最適化・コード生成 LLVM IRなどの中間表現へ 意味を保つ範囲で最適化 対象CPU向けのコードを生成 3 アセンブル・リンク オブジェクトファイルを作成 ほかの定義・ライブラリと結合 実行時の正しさは別途検証 言語・実装により変換先や工程は異なる
言語・実装により変換先や工程は異なる
ひよこ ひよこ
コンパイラは何をするの?
ペンギン先生 ペンギン先生
プログラムを別の表現へ変換するソフトウェアだよ。機械語にするものもあれば、中間表現や別言語を出力するものもある。このページではCをClangで実行ファイルにする流れを中心に見よう。
ひよこ ひよこ
最初は何から始まるの?
ペンギン先生 ペンギン先生
Cではincludeやマクロなどを処理する前処理があるよ。字句解析で文字列をトークンに分け、構文解析で文法上の構造を作る。int x = 10;なら型名、識別子、記号、数値などとして読むんだ。
ひよこ ひよこ
文法が正しければ、正しいコード?
ペンギン先生 ペンギン先生
まだだよ。意味解析で名前の参照や型などを確認する。構文が正しくても、宣言されていない名前を使うなどの問題がある。解析で得るASTはコードの構造を表す木で、チェックと変換の土台になるんだ。
ひよこ ひよこ
ASTから直接機械語になるの?
ペンギン先生 ペンギン先生
ClangとLLVMではLLVM IRという中間表現などを経由するよ。言語に近い表現からCPUに近い表現へ段階的に下げるので、いろいろな言語やCPUで変換処理を共有しやすくなるんだ。
ひよこ ひよこ
最適化は何を変えるの?
ペンギン先生 ペンギン先生
言語の規則を守りながら、定数の計算や不要な処理の除去などを行うよ。ただし速度・サイズ・コンパイル時間にはトレードオフがある。最適化すればすべてのプログラムが必ず速くなるわけではないんだ。
ひよこ ひよこ
コード生成まで終われば実行できる?
ペンギン先生 ペンギン先生
通常のネイティブビルドでは、アセンブルしてオブジェクトファイルを作り、リンクでほかのオブジェクトやライブラリと結び付けるよ。コンパイラのドライバーがこれらをまとめて呼ぶので、普段は1コマンドに見えるんだ。
ひよこ ひよこ
JITはこの流れと別のもの?
ペンギン先生 ペンギン先生
JITは実行中に必要なコードをコンパイルする方式だよ。事前に行うAOTと、いつ変換するかが違う。1つの実行環境がインタープリターや複数のコンパイル段階を組み合わせることもあるんだ。
ひよこ ひよこ
ビルドが通れば安心?
ペンギン先生 ペンギン先生
文法や型が正しくても、入力の扱いやロジックの誤りは残るよ。コンパイル・リンク・実行のどの段階で失敗したかを分けて調べよう。エラーメッセージを最初に読むと、修正する場所を絞りやすくなるんだ。

「コンパイルエラー」と「リンクエラー」を分ける

段階確認するもの問題の例
前処理・解析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日。製品の仕様・料金・対応環境は導入時にも確認してください。