/note/social

大規模ソースコードの読み方

■はじめに

  • 大規模ソースコード(以下単にソースと記載)を、未経験者が知識を持たないまま読もうとすると、ほぼ確実に挫折する
  • 例えばLinux kernelの場合一千万行をゆうに超える

■設計思想の理解

  • 闇雲にソースの字面を眺めるだけでは内容の理解は困難
  • いきなりソースを見る前に、それが何のための処理で、どういう方針で設計されているのかという意図がわかるドキュメントを見るとよい
  • 例:マニュアルやソースのコメント、および パッチのコミットログ
  • 設計思想がわかれば、ソースを読む効率が飛躍的に向上

■読むソースの絞り込み

  • 「全ソースを理解しなくては!」「とりあえずmain()から見てみよう」という考えかたでは挫折する
  • まずは、自分が何を理解したいのかを明確にして、ソース全体のうち、どこを読めばいいのか、及び、どこを読まなくてよいのかを絞り込み。余計なところを”読まない”ことが重要
  • 大規模ソースは大抵複数、かつ階層状のモジュールに細 分化されているので、なるべく小さく、かつ、少ないモジュール(できれば1つ)のソースのみを読む対象にする
  • 全ソースを完璧に理解している開発者は少ない/いないし、それは別に恥ずかしいことではない

■絞り込みの例

  • 興味のある機能の実行中に出てくるメッセージを使ってgrepをかけることによって、関連ソースの位置を知る
  • デバッガを使ってプログラム内の興味のある機能を動かしてみることによって、当該機能のソース上の位置を知る

■実際に読む作業の効率化

  • タグジャンプツールの使用
  • プログラムを動かしてみる

■タグジャンプツールの使用

  • いざソースを読むにあたって、テキストエディタと基本コマンドだけを使ってソースを読むのは非常に面倒
  • これを解決するのがタグジャンプツール
  • タグジャンプツールには、cscope/GNU Global/ctags/etagsなどがある
  • タグジャンプ相当機能を内蔵している開発環境もある(例: eclipse)

■プログラムを動かしてみる

  • ソースを読むときにプログラムを動かしてはいけないというルールは無い。むしろ極めて有用
    • デバッガを使ってプログラムを動かしてみて、関数の呼び出し関係、引数、およびデータ構造の意味を知る
    • 興味のある箇所にprintf()などのデバッグメッセージを突っ込んで実行してみる
    • ソースを少し変更した上で挙動の変化を見る
  • ソースの読み/書き、実行を行き来することによってソースの内容を理解

■まとめ

  • 大規模ソースを読むためには、様々なコツが必要
    • 設計思想の理解
    • 既存ドキュメントを読む
    • 読むソースの絞り込み
    • 余計なところは読まない
    • 読む作業の効率化
    • タグジャンプツールを活用
    • ソースの読み/書き、実行を行き来
  • 最終目標はただソースを読み切ることではなく、あらゆる手段を使って必要箇所を効率良く理解すること