コンパイルとは何か

ソースコードから実行可能ファイルへの変換プロセスを理解する

概要

C++はコンパイル言語です。つまり、 書いたプログラムはすぐには実行できず、 まずコンパイルという変換作業が必要です。

このページでは、その変換プロセスを理解します。

コンパイルとは

コンパイルとは、 人間が読める形で書かれたプログラム(ソースコード)を、 コンピュータが直接実行できる形(機械語 / バイナリ)に 変換する処理のことです。

プロセス図:

┌─────────────────────┐
│  ソースコード (.cpp)  │
│                      │
│  #include ...        │
│  int main() { ... }  │
└──────────┬───────────┘
           │
           │ [コンパイラ]
           ↓
┌─────────────────────┐
│ 実行ファイル (.exe)  │
│                      │
│ FFC3004589...        │
│ (機械語)             │
└──────────┬───────────┘
           │
           ↓
   [コンピュータが実行]
   → 画面に出力

コンパイラとは

コンパイラとは、 ソースコードをコンパイルするための プログラムです。

代表的なC++コンパイラ:

  • g++ — Linux/Mac標準、Windowsでも使用可能
  • clang — モダンで高速。Apple/Linux対応
  • Visual Studio C++ — Windows上で動作

コンパイルのステップ

実は、コンパイルには複数のステップがあります:

1. プリプロセッシング

#include などの指示を処理します。 外部ファイルの内容を埋め込んだりします。

2. コンパイル

ソースコードをアセンブリコードに変換します。 構文チェック(エラーのチェック)も行われます。

3. アセンブル

アセンブリコードをオブジェクトファイル(.o)に変換します。 これはまだ実行できません。

4. リンク

複数のオブジェクトファイルと標準ライブラリを 結合して、 実行ファイル(.exe)を作成します。

ソースコード
   ↓ プリプロセッシング
プリプロセッス後ソース
   ↓ コンパイル
アセンブリコード
   ↓ アセンブル
オブジェクトファイル
   ↓ リンク
実行ファイル ← これが実行できる!

実例:Hello Worldをコンパイルする

Linux/Mac でコンパイルする場合(コマンドラインで実行):

# 1. ファイルをコンパイルする
$ g++ -o hello hello.cpp

# 2. 実行ファイルを実行する
$ ./hello

# 出力:
Hello, World!

g++ -o hello hello.cpp という1行で、 プリプロセッシング→コンパイル→アセンブル→リンク のすべてが自動で実行されます。

コンパイルエラーとランタイムエラー

コンパイルエラーランタイムエラーは別物です:

エラーの種類 発生時点 原因
コンパイルエラー コンパイル時 文法が間違っている 括弧の忘れ、変数の型ミス
ランタイムエラー 実行時 ロジックが間違っている 0で割る、範囲外アクセス

コンパイルエラーはコンパイラが教えてくれます。 ランタイムエラーは自分で見つける必要があります。

ポイント

  • C++はコンパイル言語。実行前にコンパイルが必須
  • コンパイルとは、ソースコード → 実行ファイルへの変換
  • コンパイラが文法エラーをチェックしてくれる
  • コンパイルに成功 = 文法は正しい(ロジックが正しいとは限らない)

よくある誤り

誤解: 「コンパイルエラー = プログラムが悪い」

コンパイルエラーは文法の誤りです。 修正すればOKです。初心者は最初、 エラーの読み方に戸惑いますが、 慣れれば自動修正できるようになります

// コンパイルエラーの例
int main {  // ← () がない!
    return 0;
}

// エラーメッセージ:
error: expected '(' before '{' token

やってみよう

練習1: コンパイルの4つのステップの名前を言ってみてください。

練習2: コンパイルエラーとランタイムエラーの違いを説明してください。

チャレンジ: 以下のコードをコンパイルするとどうなるでしょう?理由も考えてみてください。

int main() {
    int x = "hello";  // ← 数値型に文字列を代入
    return 0;
}
答え

コンパイルエラーになります。 型が合致していないため、コンパイラが検出してくれます。

まとめ

  • C++プログラムを実行するにはコンパイルが必須
  • コンパイルは、ソースコードを実行ファイルに変換する処理
  • コンパイルは4つのステップで構成(プリプロセッシング、コンパイル、アセンブル、リンク)
  • コンパイルエラーは修正可能。落ち着いてエラーメッセージを読もう