C言語入門|分業を支えるビルドシステムの仕組み

― なぜ「ビルド」を理解すると開発が楽になるのか

これまでの学習では、
C言語の文法やポインタ、構造体などを使って、
1人でもかなり本格的なプログラムを作れるようになってきました。

しかし、プログラムが大きくなり、
複数人で手分けして開発しようとした瞬間、
こんな疑問が出てきます。

  • 別々に書いたソースコードは、どうやって1つにまとめるの?
  • 変更したファイルだけを効率よく作り直すことはできないの?
  • そもそも「コンパイル」って、裏側では何が起きているの?

これらの疑問に答えてくれるのが、
ビルドシステムです。

開発効率を高める3つの方法(おさらい)

まず、開発効率を高める方法を整理しておきましょう。

方法内容
1個人の知識と技能を上げる(これまでの学習)
2複数人で手分けする(この章で扱うテーマ)
3道具を使う(ビルドシステム・ツールの活用)

この章では、
2と3を支える土台となる仕組みとして、
C言語のビルドシステムを学びます。

ビルドとは何か

C言語では、
ソースコードを書いただけではプログラムは実行できません。

ソースコードから、
コンピュータが直接実行できるファイル
(outファイルやexeファイル)を作る必要があります。

この一連の処理を ビルド と呼びます。

多くの人が、これをまとめて「コンパイル」と呼びがちですが、
実際にはもう少し細かい工程に分かれています。

C言語におけるビルドの全体像

C言語のビルドは、次の流れで行われています。

工程役割
プリプロセッサマクロ展開やヘッダファイルの読み込みを行う。
コンパイラC言語を機械語に近い形へ変換する。
リンカ複数の部品を結合して1つの実行ファイルを作る。

流れとしては、次のようになります。

ソースファイル(sample.c)
        ↓
(プリプロセッサ)
        ↓
前処理済みソース
        ↓
 (コンパイラ)
        ↓
オブジェクトファイル(sample.o)+他のオブジェクトファイル+各種ライブラリファイル
        ↓
  (リンカ)
        ↓
実行可能ファイル

ここで重要なのは、
狭い意味でのコンパイルは、この中の1工程にすぎない
という点です。

分業とビルドシステムの深い関係

ビルドシステムが分業に向いている理由は、とてもシンプルです。

  • 各人が別々のソースファイルを担当できる。
  • それぞれのファイルを独立してコンパイルできる。
  • 最後にリンカがまとめて1つの実行ファイルにする。

この仕組みがあるおかげで、

分業開発でのメリット内容
同時作業が可能複数人が同時に開発できる。
変更範囲が限定される修正したファイルだけを作り直せる。
作業効率が向上全体を毎回作り直す必要がない。

という、大きな恩恵が得られます。

C言語処理系とは何か

C言語のビルドを行うためのソフトウェア群を
C言語処理系と呼びます。

代表的なものには、次の3つがあります。

処理系特徴
GCC多くの環境で使われている代表的な処理系
Clang高速でエラーメッセージが分かりやすい。
Microsoft Visual C++Windows環境で広く使われている。

これらはいずれも、

  • プリプロセッサ
  • コンパイラ
  • リンカ

を内部に持ち、
C言語プログラムを実行可能な形へ変換します。

Visual Studio におけるビルドの流れ(補足)

Visual Studio をインストールすると、
統合開発環境を使わず、
コマンドラインからC言語をビルドすることも可能です。
 Visual Studioを使ってコマンドラインからコンパイルを行う場合、あらかじめ用意された「開発者コマンドプロンプト」を使用すると PATH を通さなくてもコンパイルなどを実行することもできます。

Visual Studio には、

  • コンパイラ(cl)
  • リンカ
  • 各種ライブラリ

が一式そろっており、
内部的には次のような流れでビルドが行われています。

工程内容
前処理マクロ展開、ヘッダの展開
コンパイルC言語ソースをオブジェクトファイルに変換
リンク複数のオブジェクトやライブラリを結合

統合開発環境では、
この一連の処理をボタン1つで実行していますが、
裏側ではC言語の標準的なビルド工程が忠実に行われている
という点は、GCCなどと同じです。

これから学ぶこと

この章では、

  • プリプロセッサは何をしているのか
  • オブジェクトファイルとは何か
  • リンカがどのように部品を結合しているのか

を、
GCCを使った1工程ずつ確認する方法を紹介していきます。

ビルドの仕組みが理解できると、

  • なぜ分業が可能なのか
  • なぜ変更したファイルだけを作り直せるのか
  • なぜビルド時間が短縮できるのか

が、自然と見えてくるようになります。