Software Engineering Lecture 9/7

Software Engineering Lecture 9/7

先週の復習



デバッグ

テスト



ソース管理

プログラムを始めとするさまざまな文書は必ず繰り返しの変更を受ける。それ を版(Version)として管理するのがバージョン管理ツールである。

Unix では通常テキスト(プレーンテキストともいう)の処理が充実しており、 文書の行毎の違いを抜き出すdiff、diffの違いを元に文書を修正するpatch、 文書の保存を行うtar、圧縮を行うcompress などのツールがある。これらを組 み合わせたツールとして、SCCS や RCS (Revision Control System) などのバ ージョン管理ツールが作られた。

プログラムやプロジェクトはソースコードやドキュメント、テストデータなど のさまざまな種類のファイルが含まれている。これらを特定のアプリケーショ ンにより一括して管理することもできる。これらの機能は、Windowsなどでは 統合プログラミング環境の一部として組み込まれている場合もある。

これらのファイルから最終的な実行形式を作ることはビルド(build) と呼ばれ る。ビルドは多数のさまざまなファイルが係わる複雑なものである。 ファイルの追加や削除などによって変わる複雑な作成方式の詳細や、プログラムの変更の際の ビルドの最小限度の実行などの管理を構成管理と呼ぶ。 構成管理はバージョン管理とは独立であり、Unixではビルドは Make と呼ばれ るプログラムとMakefileによる記述で処理される。

バージョン管理とCVS

文書やソースは、順序良く変更されるとは限らない。一つの文書に複数の 変更がほどこされる場合もあり、その場合は、同時に複数の独立した版が 作成される。一般的に版は、木構造を持つ。版は数字で表現されることも 多いが、3.14 などようにメジャー版番号3と、.14 などのマイナー版番号 にわけることも多い。現実には、徐々にマイナー版番号が深くなることが 多く、なかなかメジャー版番号は進まない。例えば、GNUコンパイラの版 番号は2.7.2.1などのように細かくなっている。TeX では最終版として 固定される版はπ(3.1415...)などになる予定とされている。

Unixでの標準的なバージョン管理ツールはRCSを発展させたCVS(Concurrent Versions System)である。CVSの基本的なコマンドは以下のようなもの がある。

       cvs checkout modules    モジュールの取り出し
       cvs update              最新版と私的版の融合
       cvs add file            ファイルの追加
       cvs remove file         ファイルの削除
       cvs commit file         変更の公開
CVSは、まず私的版(Private Version)を作り、それを最新版に維持しながら変 更を完成させ、それを共有された版(Repository) に反映させるという手順を 取る。

インターネット上でのプログラム開発では、各地に分散している開発者がCVS ツリーと呼ばれるCVSをサーバとして構成した版管理を採用することが多い。 ロックを最小限にとどめるように考慮されたCVSは、このような用途に向いて いる。

CVSでは、基本的な版管理はRCSを用いており、RCSはdiffを使って変更の履歴を 管理している。最新版と変更版の融合(Merge)は、diffを元に変更の衝突を 解決しながら修正していく操作となる。


プロジェクト管理

構成管理ツール Make

Make は、ソースなどの依存関係を調べながら、コンパイルやコード生成などを 行っていくツールである。依存関係は、例えば、Makefile というファイルに

	test1 : test1.o  test2.o
		cc -o test1 test1.o test2.o
	test1.o :  test1.c test.h
の用に記述される。これは、test1 がオブジェクトファイルtest1.oとtest2.o からCコンパイラccによって作られ、test1.o は、さらに test1.c と、それが 参照するtest.h を見るという意味である。Make には、さらに基本的なルール、 例えば、.o ファイルは .c ファイルから cc を使って作るというルール

	.c.o : 
		cc -c $> -o $< 
が含まれている。Makeの機能は、このようなルールを解決し、ルールに 付属するコマンドを実行していくことである。実際には、さらに複雑な変数置換 や制御文などが含まれていることもある。 ビルドの依存関係はプログラム言語によって決まるので、自動的な抽出を 行うことも可能である。makedepend などのツールがMakefileを生成する形で 使われることが多い。

コンフィグレーション

Make は特定の環境下でのプログラムの構成方法を解決するものだが、プログ ラムはWindows と Unix のような複数の環境をターゲットとすることも多い。 統合環境は、環境への依存度が高く複数プラットホームのプログラムには比較 的非力である。この場合は、構成方法自体も環境によって異なることになる。 これはMakeを実行する以前に解決すべき問題でありコンフィグレーション (Configuration)と呼ばれる。さらに、多環境でのコンフィグレーションを作 成するメタコンフィグレーションという概念も存在する。

コンフィグレーションを自動的に行うには、環境間のなんらかの共通ツールが 必要である。Unix ならばシェルを使うことができるが、Windows や Mac OS では、そのようなものを基本的に欠いているので、なんらかのツールをまず導 入する必要がある場合が多い。Unix を前提としたX-Window システムでは、独 自にimake と呼ばれるコンフィグレーションツールを導入して、Imakefile か ら Makefile を生成するということが行われている。その他の多くのUnixツー ルでは、configure というシェルスクリプトが、自動的に多くのUnixの違い( ヘッダファイルの位置や、ライブラリの互換性、バイナリフォーマットの違い など) を検出し、ヘッダファイルやMakefileを生成するようになっている。configure 自体はmetaconfigというツールから生成されることもある。

Perlの場合は、Perlが導入された時に使われたコンフィグレーションを保持し、 Perlのモジュールの導入の際には、Perlスクリプトを使って、そのコンフィグ レーションを参照しながらビルドをおこなうようになっている。