場所を決めることもリンクの役目

図5●再配置可能なオブジェクトを特定の位置に配置する

 もう一つリンクの重要な役割は,参照しているアドレスの確定である。コンパイルした結果は,実行モジュールのどの位置に配置されるか決まっていない。逆に言えば場所を変更できる,つまり再配置可能な状態にある。これをリロケータブル・オブジェクトと呼ぶ注3)。UNIXでは「.o」,Windowsでは「.obj」という拡張子で表現されることが多い。

 リロケータブル・オブジェクトは,複数の実行モジュールで使われることがある。実行モジュールのどの位置を占めるかは,プログラムによって違う。しかし実行モジュールとして完成させるには,位置が決まっていなければならない。プログラムの中の位置を確定させることが,リンクのもう一つの作業である(図5[拡大表示])。リロケータブル・オブジェクトの状態では,サブルーチンやデータなどの位置を名前で参照できるようになっている。実行モジュールでは,基本的に名前ではなくアドレスで参照する。

ソース・ファイルは小さくしておく

 リンクに関連して触れておきたいのは,ファイルを分割することのメリットである。ファイルを分割する目的は,個々のモジュールを小さくすることにより,管理を容易にすることにある。ファイルが増えるとかえって繁雑になると思われるかもしれないが,個々のファイル単位で完成度を高めていくことができる。このメリットの方が大きい。

 ファイルの大きさが小さくなれば,個々のコンパイル時間は当然短くなる注4)。一度コンパイルしてしまったら,ソース・コードに変更を加えない限り再コンパイルする必要はまずない。トータルのコンパイル時間を短くできる。

 またライブラリとして利用する場合,実行モジュールにはリロケータブル・オブジェクトごとに組み込まれる。したがって一つのオブジェクト・ファイルを大きなものにしてしまうと,最終的にできあがる実行モジュールに無駄なコードが組み込まれて,大きなものになってしまう注5)。

makeツールでソースを管理する

 ではこのような多くのファイルをどうやって管理するのか。統合開発環境を使えば,それぞれの開発プロジェクトで使っているファイルをIDEが管理してくれる。いくらファイルがたくさんあっても混乱することなく開発を進められるだろう。しかしコマンド・ラインでは別の方法が必要である。プログラマがファイルごとにコンパイルが済んでいるかどうかをチェックするのでは効率が悪すぎる。またコマンド行で大量のファイル名を指定しなければならず,タイプミスを引き起こしやすい。

 そこで使われているのが「make」と呼ばれるツールである。もともとUNIXでは標準的なツールの一つ。このため「ビルドする」と言わずに「メークする」という開発者も少なくない。以前はビルドという表現よりも普及していた言葉である。例えばMicrosoft社のCコンパイラでは,MS-DOS版までの統合開発環境のメニューに「ビルド」はなく,「make」という項目があったくらいだ。

 makeツールの役割は,(1)実行モジュール作成に必要なファイルを,プログラマに代わって覚えておくこと,(2)コンパイル済みであれば,その操作をスキップすること,(3)依存関係を考慮して必要に応じてコンパイル/リンクを実行すること,(4)エラーがあったらその処理を中断して,適切なエラー・メッセージを表示すること,である。makeツールなしに作業しているときには,各ユーザが適宜バッチ・ファイルを作っていたが,その作り方によってはエラーが出ても処理が止まらずにエラー・メッセージが流れてしまったり,適切な処理がなされなかったりすることがある。

リスト2●Makefileの例。
生成するファイルとそれに必要なファイル,および,生成するコマンドを記述していく

 makeツールの多くは,「Makefile」という特別な名称のファイルに,コンパイルのためのルールを記述する(リスト2[拡大表示])。どのファイルを生成するのにどのファイルが必要であるかと,どのツールを使って生成するかを記述するのが基本である。makeツールはこの情報と,ファイルの作成日時を参照して処理をする。

 makeではオプションを指定することにより,動作の対象を変えられる。このことを利用して,「make all」でプロジェクトのビルドを実行させたり,「make clean」で,.objファイルなどの中間生成物を消させたりする。

「でも,以前Javaを使っていたときには,
確かリンクなんてしなかったはずなんですが」

「いいところに気が付いたね。
Javaではリンクはしない。どうしてだと思う?」

「えー。それがわからないから聞いてるんじゃないですか」
「そりゃそうか。カギはダイナミックかスタティックか,ってところにあるんだ」

(北郷 達郎、八木 玲子)