第10回 ソースを読もう:まつもとゆきひろのハッカーズライフ(2/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よりずいぶんマシになっていると思います。例によって自画自賛ですが。
誰かのために、自分のために
ソースコードを読むことがハッカーの能力を高める。このことは最近になって知られてきました。ここではもう一歩踏み込んで、その効果的な読み方について考えてみました。
ソースコードを書く際は、読まれることを意識するのも重要です。あなたの書いたソースコードを読む必要があるのは、見知らぬ誰かだけではなく、半年後の自分自身なのかもしれませんから。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このページで出てきた専門用語
ctags
ソースコードに対する識別子をインデックス化するツール。基本的にctagsはvi用だが、Emacs用のetagsもある。最もこの2つのプログラムが作るインデックスは互換なので、どちらでも使える。現在では、両方ともRubyをサポートしている。
GLOBAL
エディタから独立したソースコード索引システム。C、C++、Yacc、Java、PHP4に対応。
Gonzui
検索エンジンNamazuの開発者と知られる高林哲さんが未踏プロジェクトで開発したソースコード検索エンジン。
関連記事
- まつもとゆきひろのハッカーズライフ:第1回 ハッカーとの遭遇
- まつもとゆきひろのハッカーズライフ:第2回 キーボードへのこだわり
- まつもとゆきひろのハッカーズライフ:第3回 ハッカーと仕事
- まつもとゆきひろのハッカーズライフ:第4回 Emacs対vi
- まつもとゆきひろのハッカーズライフ:第5回 ハッカー環境問題
- まつもとゆきひろのハッカーズライフ:第6回 言語の重要性
- まつもとゆきひろのハッカーズライフ:第7回 言語の重要性その2
- まつもとゆきひろのハッカーズライフ:第8回 ハッカーとオープンソース
- まつもとゆきひろのハッカーズライフ:第9回 測定狂時代
- まつもとゆきひろ――第1回:オープンソースという「お仕事」
オープンソースソフトウェアの開発にかかわっている人のインタビューをシリーズでお届けする「Open Source People」。記念すべき第1回はMatzのニックネームでも知られるまつもとゆきひろ氏の「人となり」に迫る。 - まつもとゆきひろ――第2回:Rubyを開発するということ
周囲がまつもと氏のまれたぐいまれなプログラミング言語アーキテクトとしての才能に気づき、まつもとがそれに専念できるような体制が自然に形作られつつある――Rubyはいま、そういう状況にあるように見える。今回は、Rubyの開発におけるまつもと氏の考えに迫る。 - まつもとゆきひろ――第3回:僕の存在価値はそこにある
過去2回にわたってお届けしてきたまつもとゆきひろ氏へのインタビューは今回が最終回となる。「誰かがRubyを実装し直したとしたら、いまのRubyよりもずっとエレガントで速いものができるはず」と語るまつもと氏は自身の存在価値をどのように見ているのかに迫る。
Copyright © ITmedia, Inc. All Rights Reserved.