サイトマップ
-
Contents
-
Information
RHG 片手に Ruby 1.9 を読む集い(The RHG Strikes Back)に参加した(1) - 第1回 RHG の逆襲
どうも、あかさたです。昨年末の Ruby 1.9 がリリースにあわせて、Ruby の処理系を理解するためのソースコード読書会「The RHG Strikes Back」が行われました。本記事では、そのイベントの模様を簡単にお伝えします。
The RHG Strikes Back とは?
Ruby の実装を解説した本として、「Ruby ソースコード完全解説(通称 RHG)」という本が非常に有名です。この本は Ruby 1.8 を理解するところまでは、大変便利です。しかし、今回 Ruby 1.9 では YARV が統合されるなど、大幅な変更が行われています。
そこで、Yugui さんの呼びかけで Ruby 1.9 のコードリーディングを通じて RHG ではカバーしきれない部分を理解する勉強会をすることになりました。RHG を書き換える勢いでやろうということで、「The RHG Strikes Back(RHG の逆襲)」と名づけられています。
この勉強会には、Ruby 1.9 の中心的開発者の一人であり、おそらくこの勉強会を開くきっかけとなった VM 部分(YARV)を開発した東大の笹田さんも監修的(?)な立場で参加してくださるようです。開発者の意見も聞けるこの場は非常に貴重な場と言えるでしょう。
第1回 RHG の逆襲
記念すべき第1回は、2008/1/27(日)にミラクル・リナックス株式会社の会議室と東京大学大学院情報理工学系研究科 秋葉原拠点 大会議室の二拠点で行われました。本来は一拠点で行う予定だったのですが、40 人程度を上限に募集を開始したら、当日にキャンセル待ち発生という「どこのアーティストのコンサートですか」という状態になり、二拠点に分けて開催されました。近年の Ruby に対する注目度の上昇のおかげでしょう。
私も参加申し込みで出遅れて、第二会場での参加になってしまいました。多少キャンセルはあったものの、少なくとも 50 人以上が参加するイベントになったようです。二会場は ustream でお互いを中継し合う形になりました。二拠点開催は、ネットワークトラブルなど様々な問題があったのですが、それは瑣末なことなのでここでは置いておくこととしましょう。
前半「Ruby のコードリーディングのとっかかりと、RHG 第2章」
発表者は Yugui さんで、多少の前置きはあったものの基本的には RHG の内容に沿ってソースコードを追っていくというやり方になりました。適宜、笹田さんなどから補足が入り、わかりにくい部分を埋めていくという感じでした。
さて、ここからは勉強会の模様を書こうと考えていたのですが、ソースコード読書会を時系列にレポート記事に起こすことは難しいため、私の視点で勉強会当日と事前学習から得られた Ruby ソースコードの読み方(あくまで第1回 RHG の逆襲の範囲内で)をまとめます。
今回の勉強会のターゲットは、「Ruby のオブジェクト構造の基本を理解する」です。以下の内容は、RHG 第2章を片手にお願いします。
どのコードを対象にすべきか?
私のように Cygwin を使わずに Windows で Ruby のソースコードを追う人は、trunk よりも 1.9.0 のソースコードを使用するといいでしょう。Windows 環境の Ruby はビルドで躓くこともたまにあるので、確実にビルドできるコードを選択すべきです。
ただし、この日は基本的に静的なコードの読書会(動かしたり書き換えたりしない)なので、 trunk だからといって問題になることもないでしょうが。
readme.EXT.ja を読むべし
Ruby のソースコードには、readme.EXT.ja という拡張ライブラリを開発するためのドキュメントが含まれています。拡張ライブラリからも Ruby のオブジェクトを操作することができます。この際提供されている API(例:rb_ivar_get 関数はインスタンス変数の値を参照する関数です)を掘り下げていくことで、Ruby が何をしているのか理解することができます。
Ruby は C 言語で実装されているが完全にオブジェクト指向で実装されている
RHG 第2章は Ruby のオブジェクト構造を C 言語でどのように実現しているかを説明しています。Ruby に登場する Object や Class や String といったクラスは、C 言語レベルでもクラスとして登場するため、Ruby のコードリーディングのとっかかりとして適しています。(RHG には、データを理解してからの方がソースを理解しやすいと書いてあります。私も同感です。)もちろん、C 言語にはクラスがありませんから、クラスの構造は構造体を使って疑似的に実現されています。
RString クラスの実現例(by Kodougu)
構造体を取り扱うためのマクロ(例:継承元クラスを手繰る RClass 用マクロは RCLASS_SUPER)が大量に定義されているので、こうした構造を理解するには、構造体の構造を把握してから、マクロを理解していくという方法がいいでしょう。同時に、readme.EXT.ja に書かれているクラスやインスタンスを操作する関数から掘り下げていくことで、さらに理解を深めることができるでしょう。
また、「もし自分が C 言語でオブジェクト指向を実現するとしたらどうするだろう」と考えながら読み進めると面白いかもしれません。
性能という観点から理解する
Ruby は汎用言語です。Ruby 自身の実装の理解容易性よりも性能向上(処理速度やメモリ効率)を取っている部分があります。コードの読み手としては、こうした実装は読みにくくなると同時に勉強になる面でもあります。
たとえば、Ruby 1.8 までは、オブジェクトごとにインスタンス変数の定義を作成していましたが、Ruby 1.9 ではメモリ効率の観点からクラスに定義を移動しているようです。(このため、メンバ変数へのアクセスは少し遅くなっているそうです。)このため、インスタンス変数を設定するメソッド(rb_ivar_set)などは 1.8 とかなり変わっており、RHG があっても何も知らずにこの部分を追うのは少し難しくなっています。推理しながら読み進めてください。
1 2
このサイトについて
TrackBack URL :
