コンパイルの仕組み: 裏側で起きていること

ただコマンドを打つだけでなく、ソースコードが実行ファイルになるまでの4段階を理解する。

詳細解説

料理の4段階 (Cooking Process)

コンパイルは「料理のフルコース」です。 1. プリプロセス(下準備):野菜を洗って切る。 2. コンパイル(レシピ書き):手順書を作る。 3. アセンブル(調理):実際に火を通す。 4. リンク(盛り付け):お皿に盛って定食にする。 コマンド一発で見えませんが、裏ではこの4人がバトンタッチしています。

初心者は「gcc コマンド一発で変換される」と思いがちですが、実は内部では4つの工程を経て実行ファイルが作られています。これを料理に例えるとわかりやすいです。

4つの段階

GCCのオプションを使うと、各段階で止めてファイルの中身を確認できます。

Step-by-Step Compilation
# 1. プリプロセス (Preprocess)
# #include や #define を展開する
gcc -E hello.c -o hello.i
# 2. コンパイル (Compile)
# C言語をアセンブリ言語に翻訳する
gcc -S hello.i -o hello.s
# 3. アセンブル (Assemble)
# アセンブリを機械語(オブジェクトファイル)にする
gcc -c hello.s -o hello.o
# 4. リンク (Link)
# ライブラリと結合して実行可能ファイルを作る
gcc hello.o -o hello

実践テクニック

なぜこれを知る必要があるのか?

エラーが出たとき、「どの段階で失敗したか」がわかると解決が早いからです。

  • file not found → プリプロセス(ヘッダがない)
  • syntax error → コンパイル(文法ミス)
  • undefined reference → リンク(ライブラリのリンク忘れ)

警告オプションの鉄則

現場では警告を無視するエンジニアに未来はありません。常に警告オプションを付けましょう。

Best Practice Command
// 実践: 警告オプションは「常時ON」が鉄則
// -Wall: 一般的な警告を有効化
// -Wextra: さらに詳細な警告
// -std=c17: C17規格に準拠
gcc -Wall -Wextra -std=c17 hello.c -o hello

演習課題

クイズ: エラーの原因
「undefined reference to printf」というエラーが出ました。どの段階での失敗ですか?
解答例を見る

リンク (Linker) の段階です。

「undefined reference(未定義の参照)」は、ヘッダファイルには宣言があったけれど(コンパイルは通った)、実際の実体(ライブラリ)が見つからなかったときに発生します。

合格ライン

コンパイルの4段階を言える
undefined reference エラーの意味がわかる
-Wall -Wextra を使っている