Ruby under a microscope image with misaki. (image by @BookMisaki)

Rubyのしくみ」を読みました。この記事では、「Rubyのしくみ」がどのような本なのかという紹介と、僕がこの本を読んで得た感想について書きます。

「Rubyのしくみ」とはどのような本か

「Rubyのしくみ」は、Rubyの処理系と組み込みライブラリの動作や実装について解説した本です。この本では以下の事項が解説されています。

  • rubyコマンドがRubyのソースコードを読み込んで、YARVの命令列に変換するまでの過程
  • Rubyの処理系がYARVの命令列を実行する方法
  • Rubyの処理系内におけるオブジェクトやクラスの表現
  • ブロックの実現方法
  • メタプログラミング
  • MRI以外のRuby処理系
  • ガベージコレクション

感想

読みづらい

この本は読みづらいです。特に、YARVの命令列の実行方法の章については正直な所全く理解できませんでした(飛ばした)。 なんで読みづらいのか考えたんですが、いくつか理由があります。

まず、不要な図1が多くて読みづらいです。文章の途中でおもむろに次のページにある図を参照されたりして、行ったり来たりしなくてはならないことが何度もあり、読解を阻害されました2。その割に、これは説明に必要ないだろみたいな図も結構あって、そのたびに「これは俺が読み解けてないだけなのか、それとも単に不要な(冗長な)図が貼ってあるだけなのか?」と惑わされました。

また、「実験」という節の位置づけがわかりづらいです。この本には「実験」という節が頻繁に出てきて、実際にRubyのコードを書いて動作やパフォーマンスを検証するんですが、読み飛ばして良いものなのかわからないんですね。それまでに解説された動作を検証しているだけなのかと思って読み飛ばしたら、実は次の節で解説する事項への伏線になっていて、実験を読んでないと理解できない、みたいなことが何度かありました。

特に厳しかったのがYARVの章で、まだ解説されてないものがおもむろに出てきて、これについてどこで解説されるのか(あるいはすでに解説されていて、僕が読み逃しているだけなのか)ということがわからないまま、次の事項の解説が始まります。これが繰り返されることで、「わからないこと」が積み重なっていき、しかもその分からなさが一向に解決されないので、僕はあるタイミングで「なんもわからん」となって理解を投げ出すことになりました。

古い

原著である Ruby under a microscope が2013年の出版ということもあり、内容が若干古くなっているように感じました。あまり多くの人が読む本ではないという特性から重版がかかりづらい3というのも理解できるのですが、さすがにRuby 1.9 ~ 2.1あたりがメインの処理系として出てくるのはちょっと古いのではないかと思いました。6年前ですからね…

考えたことなど

Ruby処理系についてもっと学ぼうと思った

僕は今年の3月ぐらいからRubyの処理系に興味があって、これを理解するために「Rubyのしくみ」を購入しました。しかし、前述のようにこの本は難しく、僕にはその半分ぐらいしか理解できませんでした。特にスタックマシンについて興味があったのですが、難しくて理解できなかったのはとても残念です。

一方で、この難しさは僕の能力の低さやYARVそのものの複雑さに起因するものではなく、この本の分かりづらさが原因ではないかという疑いがあります。つまり、他の文献やRubyの処理系のソースコードそのものを読めば、本書の解説で理解できなかったところも理解できるのではないかと僕は考えています4

ひとまずは、「Rubyのしくみ」の訳者あとがきで挙げられていた、以下の文献をあたってみようと思います。これらの文献をあたった後、Rubyの処理系のソースコードリーディングに取り掛かれたらいいなというのが新しい目標です5

総評

酷評してしまいましたが、ためになる部分はかなりためになりました。特にオブジェクトとクラスについての説明は非常にわかりやすく、今まで雰囲気で理解していたオブジェクトとクラスの関係、継承ツリー、特異クラス、特異メソッドへの理解が深まりました。

読んで損になることはないと思いますが、全部理解しようと思って頭から読むと読みきれないだろうなと思います。読めないところは素直に飛ばして、読めそうなところから読んだほうがいいのかなと思います。

  1. 私にはそう感じられた。 

  2. これは図があるのが悪いというよりは本のレイアウトの問題かもしれない。 

  3. 同様にRubyの処理系について解説している本である「Rubyソースコード完全解説」も同様に重版がかかっていない(入手困難である)ことからも類推される。 

  4. 当然、YARVそのものが難しいために説明も難しいという可能性もある。 

  5. いきなり処理系のコードを読み始めても意外に読めたりするのではないかという気もしますが…