第10回 ソースを読もうまつもとゆきひろのハッカーズライフ(2/2 ページ)

» 2007年12月26日 03時51分 公開
[Yukihiro“Matz”Matsumoto,ITmedia]
前のページへ 1|2       

ソースコードの読み方テクニック

 ソースコードを読み解くときは、まずプログラム全体の枠組みを理解することが有効でしょう。プログラム全体を読む必要はないのですが、自分の欲しい情報がどこにあるのかを見つけ出すには、プログラム全体の構造のイメージをつかんでおくと便利なのです。ここで最も役に立つのはソースファイル名です。

 たいていのソフトウェアのソースコードは幾つかのファイルに分割されていますし、各ファイルにはプログラムの機能に関連した名前がついています。例えば、メモリ管理について知りたいときには「memory.c」とか「gc.c」などという名前の付いたファイルが怪しいといえます。

 それで見つからない場合には、プログラムのスタートであるmain関数(Cの場合)からたどっていくことになります。ここでもプログラム全体を読む必要はないので、個別の関数の働きは関数名から推測して、必要そうなところを探すのに集中します。

 ソースコード探索における最大の武器はgrepです。grepは「正規表現にマッチする行を見つける」という単純なツールですが、適当なキーワードを検索するとか、関数やメソッド、変数を探すなど、いろいろな目的に活用できます。Emacsなどgrep機能を支援するエディタでは、見つけた行に直接ジャンプすることも可能です。そのほか、関数定義に直接ジャンプするctags*や、プログラムをハイパーテキストとして参照するGLOBAL*なども役に立ちます。

 プログラム読解向けツールのニューフェイスは、ソースコード検索エンジンGonzui*でしょう。プログラム中の識別子をインデックス化するctagsやGLOBALとは違い、Gonzuiはさまざまな検索を支援しています。関数定義だけでなく、関数の呼び出しを見つけることもできますから、「関数呼び出しの実例から使い方を学ぶ」というような使い方にも向いています。

良いソースコード/悪いソースコード

 このように、ソースコード読解の経験を積むと、読みやすいソースコードと読みにくいソースコードがあることに気がつくと思います。わたしが最悪と思ったのは、(失礼ながら)Perl5のソースコードです。

  • ライブラリ手続きがpp.c、pp_ctl.c、pp_hot.c、pp_sys.cなどに分散しており、ファイル名が手続きを探すヒントにならない
  • 関数定義にマクロが使われているため、ctagsのたぐいが使えない
  • 内部データのアクセスにもマクロが多用されており、また極端な省略形が使われているため、名前から機能が想像できない。SvUVX()やSvPOK_only_UTF8()など数百の名前の意味を理解するまではソースコードを把握できないような気がする

 もちろん、このソースコードを書いたラリー・ウォールは一流のハッカーで、前記の点にはそれなりの理由があるのです。例えば、ソースコードファイルが機能別になっていない点は「Perl開発当時の古いマシンではオブジェクトファイルの配置によって関数呼び出し速度が異なっていたため、少しでも速度を稼ぐ意味で、頻繁に呼び出される関数を目的によらず1つのファイルに集めた」という理由がありますし、マクロの多用も「コードの繰り返しを避け、ソースコードをコンパクトにまとめる」という理由があります。分からないでもないのですが、ソースコードを読み解くという観点からは、やはりつらいものがあります。

 このことから、良いソースコード、読みやすいコードの書き方を学ぶことができます。ラリーには悪いけど、Perlのソースコードのちょうど反対をすればよいのです。Rubyを開発する際、Perlのソースコードも参考にしましたが、この悪い点はまねしないようにと決めていました。これによって、RubyのソースコードはPerlよりずいぶんマシになっていると思います。例によって自画自賛ですが。

誰かのために、自分のために

 ソースコードを読むことがハッカーの能力を高める。このことは最近になって知られてきました。ここではもう一歩踏み込んで、その効果的な読み方について考えてみました。

 ソースコードを書く際は、読まれることを意識するのも重要です。あなたの書いたソースコードを読む必要があるのは、見知らぬ誰かだけではなく、半年後の自分自身なのかもしれませんから。

このページで出てきた専門用語

ctags

ソースコードに対する識別子をインデックス化するツール。基本的にctagsはvi用だが、Emacs用のetagsもある。最もこの2つのプログラムが作るインデックスは互換なので、どちらでも使える。現在では、両方ともRubyをサポートしている。

GLOBAL

エディタから独立したソースコード索引システム。C、C++、Yacc、Java、PHP4に対応。

Gonzui

検索エンジンNamazuの開発者と知られる高林哲さんが未踏プロジェクトで開発したソースコード検索エンジン。


本記事は、オープンソースマガジン2006年1月号「まつもとゆきひろのハッカーズライフ」を再構成したものです。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ