書籍紹介『Rubyのしくみ Ruby Under a Microscope』

書いた人:森田尚(オーム社開発部)、編集:ささだ

書籍情報

: rumja_cover.png

書籍名
Rubyのしくみ Ruby Under a Microscope
著者、訳者
Pat Shaughnessy著、島田浩二・角谷信太郎共訳
発売日
2014年11月28日
ISBN
ISBN978-4-274-05065-7
原書
Ruby Under a Microscope (No Starch Press)

推薦のことば

『Rubyのしくみ』を読んだあと、郷愁に駆られてRHGを読み返してみたら、12年前のわたしが若さに任せてめっちゃカッコいい前書きを書いていた。その内容がそっくりそのまま『Rubyのしくみ』にも適用できそうなので、引用して本書の推薦文に替える。

“正直に言って、この本は易しくはない。少なくとも、対象の持つ本質的な難しさ以上に易しくはなっていない。しかし、だからこそ本書は面白い(中略)。自分の能力より劣るものばかり相手にして面白いわけがない。見た瞬間に答えがわかるパズルを解く奴はいない。半分で犯人がわかる推理小説はつまらない。(中略)「難しいから面白い。」本書を通じ、そう思ってくれる人が一人でも増えてくれたら嬉しい。”

――青木峰郎 (『Rubyソースコード完全解説』通称 RHG 著者)

RHGに間に合わなかったぼくが、ぼくに読ませたくって訳した一冊です。ぜひ、この本を片手に、Rubyの内側を覗いてみてください。

――島田浩二(訳者)

I started writing Ruby Under a Microscope just because I was curious about how Ruby worked. How could someone have built such a simple and elegant programming language? Later, after learning more about Ruby internals, I realized the tremendous amount of hard work that the Ruby core team had done to build it. I decided to continue writing the book because I thought this was a story that no one knew, and that needed to be told. I wanted to shine a light on all of the amazing work the Ruby core team did. Finally, as I learned more and more about how Ruby works internally, I began to learn about the Computer Science behind Ruby. I think Ruby developers often don’t study Computer Science and instead come to Ruby from a different path because the language is so accessible and easy to learn. However, it’s important that all of us understand and appreciate the Computer Science Ruby uses.

I had so much fun learning all of these things while researching and writing Ruby Under a Microscope. I hope readers can have fun while learning along with me!

――Pat Shaughnessy (原著者)

簡単に読めるかどうかは微妙だし、買ってすぐ役に立つレシピブックのようなものとは正反対の性格の本だが、仕事でまじめに(つまりRubyで開発したアプリケーションを継続的に、最終的にはお金を目的として使い、つまりは安定していて高速な実行が必要な)Rubyのプログラミングをしているのであれば、読んだほうが良い。また、その価値はある。

――arton (http://www.artonx.org/diary/20141212.html#p01 より引用)

自分はまだ Ruby の内部(Cの部分)については勉強途中で、ちょっとしたビルドエラーや typo、メソッドの修正くらいしか出来ない人間なんだけど、この本を読んで内部のデータ構造についてはだいぶ詳しくなれたと思う。ただ、中盤はだいぶぼんやりした理解なので、もう何回か読み返そうと思う。

――hsbt (http://www.hsbt.org/diary/20141204.html より引用)

わたしはだいたいRubyというかRailsでプログラミングを覚えた、いわゆる文系プログラマなので、いろいろ基礎知識が足りてなくてですね。いつも“使って”だけいるRubyが、こんなふうに動いてるんだそうか…! という展開は、かなりわくわくしました。

ちゃんとRubyの実装読んでみたいけど、どっから手を付けていいか分からないな、という人にとてもおすすめです。

――yakitorii (https://gist.github.com/yakitorii/423c6b2bd7e60f9a88f2 より引用)

書籍の紹介

公式ページより。

本書ではRubyがコードをどのように解釈し、どうやって実行するかを解説した書籍です。図版と短いコードの実験を多用した構成により、豊富な事前知識がなくても、プログラミング言語処理系の実装の仕組みを無理なく学ぶことができます。

実務でRubyは使えるけれど、基礎があまり得意ではないので機会があればきちんと学びたいと考えている人や、向上心はあるものの目の前の仕事が忙しくてじっくり時間がとれないなどの、職業プログラマの方へ向けた書籍です。

日本語版には、Rubyの開発者であるまつもとゆきひろ氏の序文とYARVの開発者である笹田耕一氏の付録が加筆されています。

編集部による紹介記事もご覧ください。

このRubyist Magazine記事では、許可をいただいて、まつもとさんの日本語版序文と、 訳者のお二人による訳者あとがきを転載します。

『Rubyのしくみ』日本語版序文

私が小学生のときに読んで記憶に残っている一冊として、マーク・トウェインに よる『アーサー王とあった男』1というSF作品があります。1880年代のアメリ カ人がアーサー王時代にタイムスリップしてしまうものの、現代(出版当時)の 知識を活用して活躍するというストーリーです。5世紀に電話や自転車、銃など の知識を持ち込めばさぞかし無敵でしょう。しかし、仮に21世紀の我々が5世紀 にタイムスリップしたとして、我々の持っている知識をどれだけ活用することが できるでしょう。自転車くらいならともかく、何もないところからコンピュータ やネットワークを構築することなどできそうもありません。現代のテクノロジー は個人レベルで再現するには高度化しすぎています。普段はなにげなく使ってい る技術でも中身までは理解していないものです。

私たちが普段使っているRubyもそのような現代テクノロジーのひとつです。Ruby を便利に使っていても、その中がどうなっていて、どのように実行されているの か、あるいはRubyのような言語をどうすれば再現できるのか正確な知識を持って いる人はほとんどいないでしょう。本書はそのような謎に包まれている「Rubyの 中身」を明らかにしてくれる一冊です。

本書はRubyのソフトウェア構造から、オブジェクトシステムの構成、性能を向上 させるための工夫まで解説されています。さらにCRubyだけでなく、JRubyや Rubiniusについてまでカバーしています。このような知識を学べる書籍はなかな かありません。日本には類書として『Rubyソースコード完全解説』2がありま すが、入手困難になって久しいですし、対象のRubyバージョンも1.7と古いので、 YARVのような新しい技術については当然解説されていません。このような書物の 登場は、Rubyの内部知識の一般化に貢献すると信じます。

本書の知識をもとにして、もしかすると本書の読者のうちの誰か、もしかすると あなたがRubyの開発に関わるようになるかもしれませんし、そうなれば我々は大 歓迎します。あるいは、次世代の言語処理系を開発するきっかけになるかもしれ ません。そのような未来が見たいものです。

2014年10月、松江にて

まつもと ゆきひろ

『Rubyのしくみ』訳者あとがき

本書は、2013年11月に出版されたPat Shaughnessy著“Ruby Under a Microscope: An Illustrated Guide to Ruby Internals”の全訳です。原書はまず、著者のサ イトで自主出版の電子書籍として出版され、その後、加筆修正されてNo Starch Pressより出版されました。原書は、Ruby言語処理系について本格的に解説した 初の英語書籍となります。

お読みいただいて、いかがでしたでしょうか。普段私たちが楽しくプログラミン グしているその舞台裏で、一体どんなことが起こっているのか。Rubyがどんなふ うに動いているのか。また、それはどういうアイデアに基づくものなのか。そう したことの輪郭が、全部ではないにしてもつかめたのではないかと思います。も し、本書を読み終えた後で、自分の書いたRubyスクリプトが今までとは少し違っ た景色として映るようになっていたのなら、訳者としては嬉しいかぎりです。

本書を読み終えた後で、より深く「Rubyのしくみ」を学びたいと感じられた方は、 まつもとさんの序文や笹田さんの付録でも触れられている『Rubyソースコード完 全解説』にも、ぜひチャレンジしてみてください。紙の書籍は残念ながら入手が 難しくなっていますが、初稿をベースとした原稿は、ありがたいことにWebから 閲覧できるようになっています1。また、日本Rubyの会の有志によって運営さ れているWebマガジンRubyist Magazineには、笹田さんがご自身で書かれたYARV についての連載2があり、YARVについての理解を深めるのにとても良いテキス トとなっています。本書の復習も兼ねてお楽しみください。

また、本書を通して言語処理系自体に興味を持たれた方は、本書以外の書籍へと ぜひ研究を進めてください。たとえば、『ふつうのコンパイラをつくろう』3 は、Rubyソースコード完全解説の著者でもある青木峰郎さんによって書かれた書 籍で、実際に言語処理系を作りながら、コンパイルと実行環境の仕組みを学ぶこ とができます。また『言語実装パターン』4は、構文解析器生成系ANTLRの開発 者であるTerence Parr氏が言語実装のパターンについて解説した書籍で、コンパ イラについて基本から体系的に学ぶことができます。あるいは、もし言語処理系 の開発者について興味を持った方がいれば、言語設計者たちが考えることが、き っとその興味を満たしてくれるでしょう。

それでは、さらなる研究の旅を、どうぞお楽しみください。もし本書が、この魅 力的な舞台裏をあなたが存分に楽しむきっかけになれたのならば、幸いです。

謝辞

本書の刊行にあたり、多くの方々に多大なご協力をいただきました。記して感謝 いたします。

株式会社オーム社開発局の森田尚さん、高尾智絵さんに感謝します。さまざまな 編集作業はもちろん、私たちの仕事を全方位でサポートしていただきました。あ りがとうございました。

翻訳原稿をレビューしていただいた皆さんに感謝します。笹田耕一さん、鳥井雪 さん、前田智樹さん、北村大助さん(順不同)。皆さんからは翻訳のこと、技術 のこと、日本語のこと、そしてRubyのことをたくさん学ばせていただきました。 皆さんがいなかったら、本書は形にできていませんでした。本書を共に作ってく ださって、本当にありがとうございました。一緒に仕事ができたことを光栄に思 います。

そして、日本語版序文をご執筆くださったまつもとゆきひろさんと、日本語版付 録をご執筆くださった笹田耕一さんに。お二人にしか書けない、とても素敵なメ ッセージをどうもありがとうございました。原書を読んだときから、日本語版を 出すなら前書きと付録はお二人において他にはない、と思っていました。お忙し い中、快く引き受けてくださり、本当に感謝いたします。

2014年11月

島田浩二・角谷信太郎

詳細目次

 * 日本語版序文
 * 序文
 * 謝辞
 * はじめに
 * 第1章 字句解析と構文解析
   - 字句解析:Rubyを構成する言葉
   - 実験1-1:Ripperを使ってさまざまなRubyスクリプトを字句解析する
   - 構文解析:Rubyはコードをどのように理解するか
   - 実験1-2:Ripperを使ってさまざまなRubyスクリプトを構文解析する
   - まとめ
 * 第2章 コンパイル
   - Ruby 1.8 にコンパイラはない
   - Ruby 1.9 以降はコンパイラを導入する
   - 単純なスクリプトをRubyはどうコンパイルするか
   - ブロック呼び出しのコンパイル
   - 実験2-1:YARV 命令を表示する
   - ローカルテーブル
   - 実験2-2:ローカルテーブルを表示する
   - まとめ
 * 第3章 Rubyはどのようにコードを実行するか
   - YARVの内部スタックとRubyのコールスタック
   - 実験3-1:Ruby 2.0/Ruby 1.9 とRuby 1.8 のベンチマーク比較
   - Ruby変数のローカルアクセスと動的アクセス
   - 実験3-2:特殊変数を調査する
   - まとめ
 * 第4章 制御構造とメソッドディスパッチ
   - Rubyがどうやってif 文を実行するか
   - あるスコープから別のスコープへジャンプする
   - 実験4-1:Rubyがループを内部でどう実装しているかをテストする
   - send 命令:Rubyで最も複雑な制御構造
   - 通常のメソッド呼び出し
   - 組み込みメソッド呼び出し
   - 実験4-2:Rubyがキーワード引数をどう実装しているかの調査
   - まとめ
 * 第5章 オブジェクトとクラス
   - Rubyオブジェクトの内側
   - 実験5-1:新しいインスタンス変数を保存するのにどれくらい時間がかかるか?
   - RClass 構造体の内側は何
   - 実験5-2:Rubyはクラスメソッドをどこに保存する?
   - まとめ
 * 第6章 メソッド探索と定数探索
   - Rubyがモジュールをどう実装しているか
   - Rubyのメソッド探索アルゴリズム
   - 実験6-1:インクルードした後でモジュールを変更する
   - 定数探索
   - Rubyにおけるレキシカルスコープ
   - 実験6-2:Rubyはどの定数をはじめに見つけるのか?
   - まとめ
 * 第7章 ハッシュテーブル:Ruby内部の働き者
   - Rubyにおけるハッシュテーブル
   - 実験7-1:さまざまなサイズのハッシュテーブルから値を取り出す
   - ハッシュテーブルを拡張して、より多くの値を格納する仕組み
   - 実験7-2:さまざまなサイズのハッシュに新しい要素を1つ追加する
   - Rubyはハッシュ関数をどう実装しているか
   - 実験7-3:ハッシュのキーとしてオブジェクトを使用する
   - まとめ
 * 第8章 Lisp から借用したアイデア
   - ブロック:Rubyにおけるクロージャ
   - 実験8-1:whileループとeachにブロックを渡すのとどちらが速いか
   - ラムダとProc:関数を第一級市民として扱う
   - 実験8-2:ラムダを呼び出した後でローカル変数を変更する
   - まとめ
 * 第9章 メタプログラミング
   - メソッドを定義する別のやり方
   - 実験9-1:わたしは誰? レキシカルスコープを使うとselfはどう変わるか
   - メタプログラミングとクロージャ:eval、instance_eval、binding
   - 実験9-2:メソッドを定義するためにクロージャを使う
   - まとめ
 * 第10章 JRuby:JVM上のRuby
   - MRIとJRubyでプログラムを実行する
   - 実験10-1:JRubyのJITコンパイラを観察する
   - JRubyとMRI における文字列
   - 実験10-2:コピー・オン・ライトの性能を計測する
   - まとめ
 * 第11章 Rubinius:Rubyで実装されたRuby
   - Rubiniusカーネルと仮想マシン
   - 実験11-1:MRIとRubiniusのバックトレースの比較
   - RubiniusとMRIの配列
   - 実験11-2:RubiniusのArray#shiftの実装を調査する
   - まとめ
 * 第12章 MRI・JRuby・RubiniusにおけるGC
   - ガベージコレクションは3つの問題を解決する
   - MRIにおけるガベージコレクション:マークスイープ
   - 実験12-1:MRIのガベージコレクションを実際に見ていく
   - JRubyとRubiniusにおけるGC
   - コピーGC
   - 世代別GC
   - 並行GC
   - 実験12-2:JRubyのVerbose GCモードを使う
   - 参考文献
   - まとめ
 * 付録A さらにそのほかのRuby仮想マシン
   - YARV:Yet Another RubyVM
   - YARVの設計方針
   - YARVの開発までの経緯
   - さらにそのほかのRuby仮想マシン
 * 訳者あとがき
 * 著者・訳者について

おわりに

Rubyの内部に興味があるという方は、ホリデーシーズンの読書にいかがでしょうか。

なお本書をお読みになって、お気づきの点がありましたら、サポートページへ お知らせいただけるとありがたいです。