ソースコードを読み解くときは、まずプログラム全体の枠組みを理解することが有効でしょう。プログラム全体を読む必要はないのですが、自分の欲しい情報がどこにあるのかを見つけ出すには、プログラム全体の構造のイメージをつかんでおくと便利なのです。ここで最も役に立つのはソースファイル名です。
たいていのソフトウェアのソースコードは幾つかのファイルに分割されていますし、各ファイルにはプログラムの機能に関連した名前がついています。例えば、メモリ管理について知りたいときには「memory.c」とか「gc.c」などという名前の付いたファイルが怪しいといえます。
それで見つからない場合には、プログラムのスタートであるmain関数(Cの場合)からたどっていくことになります。ここでもプログラム全体を読む必要はないので、個別の関数の働きは関数名から推測して、必要そうなところを探すのに集中します。
ソースコード探索における最大の武器はgrepです。grepは「正規表現にマッチする行を見つける」という単純なツールですが、適当なキーワードを検索するとか、関数やメソッド、変数を探すなど、いろいろな目的に活用できます。Emacsなどgrep機能を支援するエディタでは、見つけた行に直接ジャンプすることも可能です。そのほか、関数定義に直接ジャンプするctags*や、プログラムをハイパーテキストとして参照するGLOBAL*なども役に立ちます。
プログラム読解向けツールのニューフェイスは、ソースコード検索エンジンGonzui*でしょう。プログラム中の識別子をインデックス化するctagsやGLOBALとは違い、Gonzuiはさまざまな検索を支援しています。関数定義だけでなく、関数の呼び出しを見つけることもできますから、「関数呼び出しの実例から使い方を学ぶ」というような使い方にも向いています。
このように、ソースコード読解の経験を積むと、読みやすいソースコードと読みにくいソースコードがあることに気がつくと思います。わたしが最悪と思ったのは、(失礼ながら)Perl5のソースコードです。
もちろん、このソースコードを書いたラリー・ウォールは一流のハッカーで、前記の点にはそれなりの理由があるのです。例えば、ソースコードファイルが機能別になっていない点は「Perl開発当時の古いマシンではオブジェクトファイルの配置によって関数呼び出し速度が異なっていたため、少しでも速度を稼ぐ意味で、頻繁に呼び出される関数を目的によらず1つのファイルに集めた」という理由がありますし、マクロの多用も「コードの繰り返しを避け、ソースコードをコンパクトにまとめる」という理由があります。分からないでもないのですが、ソースコードを読み解くという観点からは、やはりつらいものがあります。
このことから、良いソースコード、読みやすいコードの書き方を学ぶことができます。ラリーには悪いけど、Perlのソースコードのちょうど反対をすればよいのです。Rubyを開発する際、Perlのソースコードも参考にしましたが、この悪い点はまねしないようにと決めていました。これによって、RubyのソースコードはPerlよりずいぶんマシになっていると思います。例によって自画自賛ですが。
ソースコードを読むことがハッカーの能力を高める。このことは最近になって知られてきました。ここではもう一歩踏み込んで、その効果的な読み方について考えてみました。
ソースコードを書く際は、読まれることを意識するのも重要です。あなたの書いたソースコードを読む必要があるのは、見知らぬ誰かだけではなく、半年後の自分自身なのかもしれませんから。
ソースコードに対する識別子をインデックス化するツール。基本的にctagsはvi用だが、Emacs用のetagsもある。最もこの2つのプログラムが作るインデックスは互換なので、どちらでも使える。現在では、両方ともRubyをサポートしている。
エディタから独立したソースコード索引システム。C、C++、Yacc、Java、PHP4に対応。
検索エンジンNamazuの開発者と知られる高林哲さんが未踏プロジェクトで開発したソースコード検索エンジン。
Copyright © ITmedia, Inc. All Rights Reserved.