はじめに ======================================================================== ソースコードを読めると何が良いか ------------------------------------------------------------------------ この演習/講義を選択した時点で、みなさんは何がしかソースコードを読めるこ とに価値を見出しているはずです。この演習/講義を作るにあたり筆者が想定し た「ソースコード」を読めると役に立つ状況を典型的な状況を延べます。 研究活動において ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 修了/就職する先輩から引き継いで研究を行うことを考えます。3月に引き継い だ内容には、提案内容の実装や、それを検証、実験するためのプログラムが含 まれているとします。自身の研究を進めるにあたって、それらのプログラム に機能を追加したり、あるいは不具合を直すといった改変が必要になった とします。単純明快なプログラムであれば改変も簡単かもしれません。 複雑難解な場合、そうは行きません。自身の研究が本格化してくる頃に講座を 離れた先輩に、そのプログラムについて質問してみて下さい。先輩自身も自分 の書いたプログラムの詳細についてすっかり忘れてしまっているかもしれませ ん。先輩が修論提出直前に仕上げた実験のプログラムであれば文章化も十分で は無いでしょう。このときソースコードが、そのプログラムを説明する主要な 情報源となります。 改変する代りに論文を読み直して一から再実装することもできるでしょう。し かし研究の過程で改変の対象となるのは先輩から引き継いたプログラムとは限 りません。gccコンパイラ、linuxカーネル、 netbsdカーネル、apacheウェブサー バ、firefoxウェブブラウザといった大規模なフリー/オープンソースソフトウェ アを研究の材料、基盤としている場合、もはや自身で代替を短期間に再実装す るというのは現実的ではありません。研究を進めるには改変するしかありませ ん。 ソースコードを読んで理解するという作業は、このような改変の前提となります。 改変の種類によっては、改変のほとんどの大部分が読解作業に費されることにな ります。 業務として ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, 大学院を離れてからもソフトウェアに携っている限り、ソースコードを読んで 理解するということが多くの場面で役に立ったり、必要となったりします。 自社開発したソフトウェアについて不具合の修正や脆弱性へ対応する保守業務、 十分にはドキュメント化されていないサードパーティ製のライブラリやフレー ムワークを活用したソフトウェア開発業務はその例です。十分にドキュメント化 されていても、そのドキュメントとソフトウェアの実際の動作とが一致しなか った場合、その動作についてより詳細に理解したくなることでしょう。 サードパーティ製のソフトウェアについて保守契約があれば調査を依頼できま すが、重大な疑問に関しては調査結果を開発担当者自身で確認したくなるでしょ う。保守契約を結んでいない場合や、どこも保守サービスを提供していないソ フトウェアを使う場合、どんな疑問であれ開発担当者自身で調べる必要があり ます。自分の目ではっきりと確認できます。 日常的にコードリーディングを実施している人にとって、それはあたり前のこ とすぎて、あまり多く語られることが無いように見えます。 .. 趣味として .. ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, .. 実行できないプログラムや、特殊な入力に対する動作も予測できる。 演習の前提 ------------------------------------------------------------------------ 演習はC言語で記述されたソースコードを対象としています。 C言語についてある程度知っていることを前提とします。C言語の文法と意味を 一から説明することはしません。具体的に以下のような基準を設定しました。 - 300行程度のプログラムを書いたことがある。 - 構造体、ポインタについて知っている。 - 分割コンパイルしたことがある。 - malloc/freeしたことがあり、その意味を知っている。 演習の作業に用いるプラットフォームをFedoraとしました。できるだけ環境に 依存しない技法を説明したかったのですが、実際にソースコードを読んでもら うには作業環境が必要です。コマンドラインインターフェイスに抵抗が無くま た、GNU/Linuxの基本的なコマンドを知っていることを前提とします。 - コマンドラインインターフェイス * プログラムを起動できる。 * プロセスを停止させる方法としてcontrol-cを知っている。 * パイプラインを組んだことがある。 - ページャー(less) * ファイルのオープン、終了の方法を知っている。 * 前方、後方スクロールができる。 * 前方、後方文字列サーチができる。 - エディタ * ファイルのオープン、編集、保存の方法を知っている。 * 前方、後方文字列サーチができる。 演習の目標 ------------------------------------------------------------------------ * オープンソースソフトウェアについてソースコードを入手できるようになる。 * 500行程度、複数ファイルからなるプログラムについて、制御フロー、データフロー を追跡することで、そのソフトウェアの動作を説明できるようになる。 * より大きな規模のプログラムについても、混乱することなく計画立てて読めるように コードリーディングの作業モデルを持つ。 心構え ------------------------------------------------------------------------ 1. 読まずに済めば幸い。 2. どうしても読まないといけないことが確実となったら諦めて読む。 3. 綺麗、汚ないについて考えない。 4. これは演習なのでとにかく読む。