## はじめに

本書のテーマはいくつかある。

- `ruby`の構造を知ること
- 言語処理系一般についての知識を身に付けること
- ソースコードを読む技術を身に付けること

Rubyとはまつもとゆきひろ氏の手によって開発されたオブジェクト指向言語で ある。`ruby`はそのRuby言語の公式実装であり、コミュニティベースで活発に 開発が進められている。その`ruby`の内部構造を明らかにするのが第一の目標だ。 この本を通して`ruby`の全貌を明らかにしよう。

またRubyの処理系について知ることは言語処理系一般の知識にもつながる。ハッ シュテーブル、スキャナとパーサ、評価の手法などなど、言語を実装するのに 必要なものは全て盛り込んだ。本書は教科書ではないのであらゆる分野・概念 を漏れなく尽くすというわけにはいかなかったが、しかし、言語処理系の骨格 にあたる部分は十分に解説してある。またRuby言語自体についても簡単なまと めを挿入し、Rubyを知らない読者にも読めるよう配慮した。

さて、目的の第一点、第二点は確かにその通りであるし、本書のメインテーマ である。だが実は筆者が最も強調しておきたいのは三点目、「ソースコードを 読む技術を身に付けること」なのだ。言ってみると裏テーマである。どうして これが必要だと思ったのか、説明しよう。

「プログラミングに習熟するためには他人のソースコードを読め」ということ はよく言われる。確かにその通りなのだ。しかし「では実際にどうしたらいい のか」という問いに答えてくれる本は見たことがない。OSのカーネルや言語処 理系の内部を解説した本は何冊もあるが、そこにはいきなり構造が、つまり答 えが、書いてあるだけで、その答えをどうやって探すべきか書いていないのだ。 これは明らかに片手落ちである。

それともプログラムを読むということは、プログラムを書ける人間なら当然で きることなのだろうか。実はコードを読むのはとても簡単で、世の中の人達は 誰もが余裕で人のコードを読めてしまっているのだろうか。そうは思えない。 プログラムを読むのは確かに、プログラムを書くのと同じくらい難しいことな のだ。

そこで本書では`ruby`を解説するにしてもただ既知のものとして解説するので はなく、解析する過程をできるだけ生々しく紹介することにした。筆 者はRuby言語自体についてはそれなりに腕に覚えがあるものの、執筆開始時点 では`ruby`の内部構造について完全に理解しているわけではなかった。つまり `ruby`の中身に関してはできるだけ読者と近い立場から出発したのだ。そこ から始めた解析の過程とその結果をまとめたのが本書である。

なお、`ruby`の作者のまつもとゆきひろ氏自身に監修をしていただいたのだが、 本人にチェックしてもらいながら解析していたのでは本書の「生々しさ」が失 われてしまう。そのため監修査読は執筆の最終段階からと限定した。これによっ て、ソースコードを読んでいく臨場感を失うことなく内容の確かさも同時に確 保できたと思う。

正直に言って、この本は易しくはない。少なくとも、対象の持つ本質的な難し さ以上には易しくはなっていない。しかし、だからこそ本書は面白い（かもし れない）のだ。自分の能力より劣るものばかり相手にして面白いわけがない。 見た瞬間に答えがわかるパズルを解く奴はいない。半分で犯人がわかる推理小 説はつまらない。能力をギリギリまで使い切り問題を解いてこそ本当に知識を 自分のものにできる。本書はそんな理想論をバカみたいに実践した本である。 「難しいから面白い。」本書を通じ、そう思ってくれる人が一人でも増えてく れたら嬉しい。

## 対象とする読者

まずRuby言語の知識は前提としない。だが構造の解説のためにはどうしても Ruby言語の知識が必要になるため、解説の章をいくつか狭んで補ってある。

C言語についてはそれなりの知識が必要である。構造体を実行時に`malloc()` で割り当ててリストやスタックを作ることができ、関数ポインタを何度かくら いは使ったことがある、という程度を前提とした。

またオブジェクト指向の基礎についてもあまり真面目には説明しないので、な んらかのオブジェクト指向言語は使ったことがないと苦しいだろう。本文中で はJava/C++での例えを多く使うよう心掛けた。

## 本書の構成

本書の主要部分は四部構成になっている。

第1部『オブジェクト』 |
第2部『構文解析』 |
第3部『評価』 |
第4部『評価器の周辺』 |

である。各部の頭では適宜基礎知識を補うための章を挿入し、 言語処理系の仕組みやRubyに馴染みがない方でも読めるよう配慮した。

ではその主要四部の構成を以下に示す。説明のあとに括弧付きで入って いる記号は難易度を表している。C B Aと難しくなりSが最高難度である。

#### 第1部 オブジェクト

第1章 |  | 第1部を読むのに必要になるRubyの基礎部分だけを話す。（C） |
第2章 |  | Rubyオブジェクトの具体的な内部構造を解説する。（C） |
第3章 |  | ハッシュテーブルについて話す。（C） |
第4章 |  | Rubyのクラスシステムについて述べる。この章は抽象的な話が多いので最初は軽く読み流してもらってもよい。（A） |
第5章 |  | オブジェクトの生成と解放を司るガーベージコレクタを見る。低水準シリーズ第一話。（B） |
第6章 |  | グローバル変数・クラス変数・定数の実装を解説する。（C） |
第7章 |  | Rubyのセキュリティ機能の大枠について。（C） |

#### 第2部 構文解析

第8章 |  | 第2部・第3部に備えRuby言語のほぼ完全な仕様について話す。（C） |
第9章 |  | 文法ファイルを読むのに必要な最低限の`yacc`の知識を説明する。（B） |
第10章 |  | パーサの物理構造と規則を読む。（A） |
第11章 |  | パーサの難所`lex_state`の周辺を探索する。本書最難関。（S） |
第12章 |  | 第2部の総仕上げと第3部への連結。（C） |

#### 第3部 評価

第13章 |  | 評価器の基本的な仕組みついて述べる。（C） |
第14章 |  | Rubyのメインコンテキストを作りだす評価器スタックを読む。（A） |
第15章 |  | メソッドの探索と起動について話す。（B） |
第16章 |  | Ruby最大の特徴、イテレータの実装に挑む。（A） |
第17章 |  | eval系メソッドの実装を解説する。（B） |

#### 第4部 評価器の周辺

第18章 |  | RubyとCのライブラリの実行時ロードについて。（B） |
第19章 |  | コア最終章はスレッドの実装について述べる。（A） |

## 環境

本書で解説するのは`ruby` 1.7.3 2002-09-12版である。この版は アーカイブを添付CD-ROMに収録した。トップディレクトリにある `ruby-rhg.tar.gz`、`ruby-rhg.lzh`、`ruby-rhg.zip`のうちいずれか 都合のよいものを選んでいただきたい。内容はどれも同じである。 他に本書のサポートサイト \footnote{本書のサポートサイト `http://i.loveruby.net/ja/rhg/`}からも 入手可能になっている。

また本書の出版に先立ち、以下のようなビルド環境でコンパイルと基本的な動 作の確認を行った。このビルドテストの詳細は添付CD-ROMの `doc/buildtest.html`に記載してある。 ただしこの表に載っていても「同じ環境なら確実に動く」というわけでは ないし、`ruby`が動作することに関して筆者はいかなる類の保証もしない。

- BeOS 5 Personal Edition/i386
- Debian GNU/Linux potato/i386
- Debian GNU/Linux woody/i386
- Debian GNU/Linux sid/i386
- FreeBSD 4.4-RELEASE/Alpha（本書のローカルパッチが必要）
- FreeBSD 4.5-RELEASE/i386
- FreeBSD 4.5-RELEASE/PC98
- FreeBSD 5-CURRENT/i386
- HP-UX 10.20
- HP-UX 11.00 (32bit mode)
- HP-UX 11.11 (32bit mode)
- Mac OS X 10.2
- NetBSD 1.6F/i386
- OpenBSD 3.1
- Plamo Linux 2.0/i386
- Linux for PlayStation2 Release 1.0
- Redhat Linux 7.3/i386
- Solaris 2.6/Sparc
- Solaris 8/Sparc
- UX/4800
- Vine Linux 2.1.5
- Vine Linux 2.5
- VineSeed
- Windows 98SE (Cygwin, MinGW+Cygwin, MinGW+MSYS)
- Windows Me (Borland C++ Compiler 5.5, Cygwin, MinGW+Cygwin, MinGW+MSYS, Visual C++ 6)
- Windows NT 4.0 (Cygwin, MinGW+Cygwin)
- Windows 2000 (Borland C++ Compiler 5.5, Visual C++ 6, Visual C++.NET)
- Windows XP (Visual C++.NET, MinGW+Cygwin)

これだけの数のテストはとても筆者一人でこなせるものではない。 このビルドテストにあたっては以下の方々に多大な御協力を頂いた。 ここに名前を記し感謝を捧げたい。

Tietewさん |
kjanaさん |
nyasuさん |
sakazukiさん |
さとうまさひろさん |
たむらけんいちさん |
もりきゅうさん |
加藤勇也さん |
久保健洋さん |
後藤謙太郎さん |
下村智之さん |
助田雅紀さん |
新井康司さん |
西山和広さん |
川路信也さん |
渡辺哲也さん |
藤本尚邦さん |

ただし、このテストに関する全責任は筆者にある。以上の方々に コンタクトをとるようなことは絶対にしないでいただきたい。 もし何か不具合があれば筆者まで直接メールを送ってくださるよう \footnote{筆者のメールアドレス `aamine@loveruby.net`}お願いする。

## ウェブサイト

本書のウェブサイトは`http://i.loveruby.net/ja/rhg/`である。 関連プログラムに関する情報や追加文書、 それに誤殖などがあれば逐一ここに載せていく。また出版と 同時に本書始めの数章を公開する予定である。その後も順次時期を 見て公開し、最終的には全文公開することを考えている。

## 謝辞

誰よりもまず、まつもとゆきひろさんに感謝します。Rubyを作ってくださった こと、それをオープンソースソフトウェアとして公開してくださったこと、 `ruby`を解析する本を出すのを快く了解してくださったばかりか 監修まで引き受けていただいたこと、ついでに言うと フロリダで同時通訳をしてもらったこと、などなど、お礼を言いたいことは山 ほどあるのですが、あまりに多すぎて言い切れません。その代わりにこの本を 贈ります。

次に、この本の出版を最初に提案してくれたartonさんに感謝します。artonさ んの言葉にはいつでも影響されっぱなしです。おかげで.NETなマシンが欲し くなってしかたないじゃないですか。

Ruby界のドキュメント隊長・新井康司さんには、いつの間に この本の編集担当に就職したのだろうと思うほど綿密な査読を していただきました。ありがとうございました。

また執筆中には本当に多くの方々からコメントや間違いの指摘、 構成の提案を頂きました。 Tietewさん、 Yuyaさん、 かわじさん、 ごとけんさん、 たむらさん、 ふなばさん、 もりきゅうさん、 石塚さん、 下村さん、 久保さん、 助田さん、 西山さん、 藤本さん、 柳川さん、 もし抜けがあったらごめんなさい。 全ての方々の御協力に感謝します。

最後になりましたが、大塚さん、春田さん、金光さん、四度に渡る締切破りと 200ページの原稿超過にもめげず最後まで付き合ってくださって ありがとうございました。

この本に関った人すべての名前をここで挙げることはできませんが、 みなさんの力がなければこの本は出版できませんでした。この場を お借りして全ての方に感謝します。本当にありがとうございました。

御意見・御感想・誤殖の指摘などは 青木峰郎 <aamine@loveruby.net> までお願いします。

『Rubyソースコード完全解説』 はインプレスダイレクトで御予約・御購入いただけます (書籍紹介ページへ飛びます)。

Copyright (c) 2002-2004 Minero Aoki, All rights reserved.