書評☆3 Code Reading | 大量のOSSの実コードを引用した学術的要素高めのC言語ベースのコーディング技法解説

概要

  • 書名: Code Reading
  • 副題: オープンソースから学ぶソフトウェア開発技法
  • 著者: トップスタジオ and まつもと ゆきひろ and 平林 俊一 and 鵜飼 文敏
  • 出版日: 2004-06-10
  • 読了日: 2019-11-05 Tue
  • 評価: ☆3
  • URL: https://book.senooken.jp/post/2019/12/13/

評価

新しい仕事に取り掛かる際に,既存ソフトのソースコードを眺めて作りを理解する必要に迫られた。今までも似たような作業があり,コードリーディングの能力を高める必要があると思い,本書を読んだ。

内容としては,既存のOSS (Open Source Software) のソースコードを使って,実際にどのような手法が使われているかを解説したものだった。

既存OSSがC言語のものが多かったということで,C言語をベースとしたコーディング技法を解説していた。

流れとしては,目次通り以下の流れで解説されていた。

  1. 序論
  2. ループやifなどの制御構造
  3. Cのデータ型
  4. Cのデータ構造
  5. 制御フロー (上級編): 再帰,例外,並列,シグナル,マクロ
  6. プロジェクト
  7. コーディング規約
  8. ドキュメント
  9. アーキテクチャ
  10. コードリーディングのツール
  11. 総合的な例

個人的には,1-4章と10章が特に有益だった。Cのデータ型やデータ構造が実コードでどのように使われているのか解説されていた。

用途が不明だった,unionも多態の実現にstruct内で使われていることを知れた。また,コードリーディングでは,変数や関数 (シンボル) の定義元,関数の呼び出し元を探すことがよくある。ここの作業に時間がかかっていて,どうにかしたいなと日頃から感じていた。今まで知らなかったソフトを多数を知れてよかった。

ただ,その他の6-9章は内容がやや高度であったので,自分ではあまり理解できなかった。

本書の最大の特徴は,大量のOSSで実際に使われているコーディング技法を大量に引用しているところだろう。ここまで細かくコード片を引用し,その出所も行数まで掲載されているのには驚いた。かなり労力のかかっている本だと思った。

引用

p. 13: 1.2.2 ダイアグラム

デザインダイアグラムには、事実上の業界標準となっているUML (Unified Modeling Language) を採用しました。本書を準備する段階で、UMLダイアグラムを生成するオープンソースの宣言型言語 <[注5] (https://www.spinellis.gr/umlgraph/)> を開発すると都合が良いことがわかり、それに伴いGraphVizツールのコードベースにも少し改良を加えました。

UMLの生成言語としてはPlantUMLを知っていたが,この他にもUMLGraphというものを知れた。

p. 66: 3.1 ポインタ

Cプログラムのポインタには次の用法があります。

  • リンクデータ構造を作る
  • 動的に割り当てられたデータ構造を参照する
  • 参照呼び出しを実装する
  • 一連のデータ要素にアクセスする
  • 配列を引数として渡す
  • 関数を参照する
  • 別名で参照する
  • 文字列を表現する
  • システムメモリに直接アクセスする

C言語のポインタの用法がまとまっていた。

p. 69: 3.1.4 データ要素へのアクセス

表3.1 T型の要素を持つ配列をインデックスまたはポインタで操作する

  • 配列インデックスによるコード | ポインタによるコード
  • int i; | T *p;
  • i = 0 | p = aまたはp = &a[0]
  • a[i] | *p
  • a[i].f | p->f
  • i++ | p++
  • i += K | p += K
  • i == N | p == &a[N]またはp == a + N

Cのポインタと配列は混同しやすいので対応が整理されていてよかった。

p. 102: 4.1 ベクタ

配列の要素は、Cライブラリ関数のfwriteでファイルに保存されることがよくあります。

if (fwrite(buf, sizeof(char), n, fp) != n) {
    message("write() failed, don't know how", 0);
}

ファイルに保存された要素をメインメモリに読み込むときは、fread関数を使用します。

if (fread(buf, sizeof(char), n, fp) != n) {
    clean_up("read() failed, don't know why");
}

変数内のデータを簡易的に出力・入力する方法が書かれていた。内部表現をファイルに出力する都合,同一アーキテクチャのマシンでしか機能しないが,手っ取り早い方法として悪くない。

p. 389: 10.7 コードブラウザと美化ツール

次に、よく知られているオープンソースブラウザをいくつか取り上げ、簡単に紹介しておきます。

  • cscope <注21>。Unixベースで、テキストインターフェイスを持つソースコードブラウザ。Cの解析用に設計されているが、パーサの柔軟性が高く、C++やJavaでも有用である。cscopeは、Emacs、nvi、vimなどのエディタと統合できる
  • cbrowser <注22>。C/C++ソースコードの検索と閲覧のためのグラフィカルツールで、関数呼び出しの階層表示もできる。cscopeを土台とし、その上に組み立てられている
  • Source-Navigator <注23>。C、C++、Tcl、FORTRAN、COBOLを始め、その他いくつかの言語を扱えるブラウザ
  • LXRブラウザ <注24>。Webベースのブラウザで、大量のコードコレクションの相互参照ができる。

コードリーディングのためのツールをいろいろ紹介していた。ctagsやcscopeは知っていて,特にcscopeはたいへん便利で重宝していた。ここでさらに,cbrowserというツールやその他のコードブラウザの存在を知れてとても良かった。

cscopeは関数ツリーをたどることはできないのが惜しいなと思っていたのだが,cbrowserでは関数ツリーをたどることができるとのことで,これは是非試したいと思った。

結論

学術的な要素があり,やや難易度の高い部分があり,中級者向け以上の本となっている。また,C言語のコードをベースにしているので,最低限のC言語の知識を前提としていることに注意が必要だ。

学術的な要素があり,2004年とやや古い出版であるが,多数のOSSのベースとなっているC言語をベースに,データ型や制御構造など実際のコード片を引用しながらコードリーディングの技術を解説していて,よかった。

個人的には,コードリーディングのツールをいろいろ知れたのがとても良かった。このあたりのツールは作業効率に影響出るのだが,あまりネット上にも情報が出ていない。cscopeは知っていたが,cbrowserは知らなかった。

ただし,労力がかかっているのは分かるが,プレミアムブックスは値段が高すぎる。図書館でどうにか借りて済ませるのがよいだろう。