Rubyソースコード完全解説


天才の名にふさわしい人物。「Rubyソースコード完全解説」の青木峰郎氏である。青木氏はこの著者として、Ruby の内部構造について全19章、まさに渾身の解説を加えている。青木氏の頭脳の汗が飛び散るような迫力にみちた作品である。私は、この本の落ち着いた文体からして、青木氏を40過ぎのベテラン技術者かなにかと思っていた。ところが、彼はまだ一橋大学社会学部の学生さんだそうである。実に恐ろしい。


出色の作品であるにもかかわらず、なぜか出版元のインプレスでは絶版してしまっている。(これもまたなんとも不思議だ)るびまのインタービューによれば、たしかにあまり売れなかったらしい。やれやれ。とるに足らない本があふれる中、こんなすばらしい著作が消えてしまうのは悲しい。悪貨は良貨を駆逐するのか。


絶版という経緯のせいか、寛大にも青木氏はこの著作をインターネットで全公開している。
http://i.loveruby.net/ja/rhg/book/


内容もさることながら、文章のレイアウトが絶妙によい。非常にシンプルな HTML を使っていながら、実に読みやすい。また、簡潔な文体もよい。説明対象は非常に複雑だが、文章は一個一個短いのでわかりやすい。私もいろいろと是非見習いたいと思う。


技術書でありながら、文章が詩的なのである。ときどき文学作品を読んでいる錯覚におそわれた。たとえば、switch 文の分岐について、次のような記述がある。

EXEC_TAG()の返り値が0以外ならlongjmp()で戻ってきたということなので自分が必要なジャンプだけcaseで漉し取り、残りは通す(default)。(第13章 評価器の構造)

惚れ惚れするような文ではないか。「case で漉し取り、残りは通す(default)」なんて、なかなかいえるものではない。


章立ては以下の通り。



第 1 部「オブジェクト」

* 第 1 章「Ruby言語ミニマム」
* 第 2 章「オブジェクト」
* 第 3 章「名前と名前表」
* 第 4 章「クラス」
* 第 5 章「ガーベージコレクション」
* 第 6 章「変数と定数」
* 第 7 章「セキュリティ」

第 2 部「構文解析

* 第 8 章「Ruby言語の詳細」
* 第 9 章「速習yacc
* 第 10 章「パーサ」
* 第 11 章「状態付きスキャナ」
* 第 12 章「構文木の構築」

第 3 部「評価」

* 第 13 章「評価器の構造」
* 第 14 章「コンテキスト」
* 第 15 章「メソッド」
* 第 16 章「ブロック」
* 第 17 章「動的評価」

第 4 部「評価器の周辺」

* 第 18 章「ロード」
* 第 19 章「スレッド」


この作品は、ボリュームがある上に内容が複雑なので、読むのに骨が折れる。しかし、Ruby という言語の詳細を知る上では避けて通れない道であろう。


第1部では、Ruby の基本的なデータ構造について解説を加えている。私は第4章「クラス」を読んで、初めて特異クラスやモジュールのインクルードの原理を理解した。


第2部「構文解析」ではいったん Ruby から離れ、yacc による構文解析の密林を分け入っていく。第11章「状態付きスキャナ」は難しくて泣きそうになった。おそらく著者も泣きながら書いていたのかもしれない。ただ構文解析の目的は第12章で詳述される構文木を作ることであり、そういう意味では、第2部は第12章「構文木」を読んで構文木が何なのか分かれば十分なのかもしれない。


第3部「評価」が本書のメインであり、第1部と第2部はその準備にすぎないといえる。第3部の各章は、いずれも Ruby のプログラムの正確な振る舞いを理解するには、非常に重要である。私が理解したのは、タグスタック・FRAME スタック・BLOCK スタック等、各種のスタックが重要な働きをしているということ。スタックフレームは、あるコード(構文木)が実行されるコンテキストを示しており、コンテキストに応じて動きも変わる。正直にいうと第16章「ブロック」はまだきちんと読み終わっていない。第17章「動的評価」は飛ばし読みしただけ。なんとかイタレータブロックと Proc の正確な関係を理解するところまでもっていきたいのだが。


正直私にとっては、すべてを理解する必要はなく、Railsソースコードを解読するのに必要かつ十分な Ruby の知識が得られればよかった。とてもじゃないが、こんな本を一度で理解するのは不可能だ。また時折戻ってきては参照したい。ただ、Ruby の「使いやすさに最適化する」という設計思想がどう実現されているか、よくわかったような気がする。


こんなに複雑なプログラムをメンテナンスしている Ruby の開発チームに改めて敬意を表したい。