Sydney and Rubinius: Hardcore Ruby

  • Posted by Nick Sieger

http://blog.nicksieger.com/articles/2006/10/20/rubyconf-sydney-and-rubinius


Speaker: Evan Phoenix


Seattle.rbのEvan Phoenix(旧姓 Webb)は、Rubyインタプリタを改善する実験的な試み、SydneyとRubiniusについて発表した。正しくは、Sydneyはすでに息絶えており、その灰のなかからRubiniusが生まれている。

  • 背景
    • なぜ新しいRubyインタプリタを書くの? 楽しいから。面白い挑戦だよ。
    • 今あるインタプリタにまずいとこがあるの? Matzが嫌いなのかい?もちろんそんなことないさ。

今日のRubyインタプリタは大きなダンプトラックのようなものだ。ときにちょっと遅いが、うまいこと動いてくれている。YARVは赤く輝く消防自動車のようなものだ。いずれも大きくて複雑なんだよね。それと比べるとRubyniusはデューンバギー(砂丘・砂浜・砂漠での走行が可能なオープンカー)のようなものだよ。速くて軽くて、でもたくさん走ると目が砂だらけになるかも。


正直なところプロジェクトは単純だ。

    • シンプルなアーキテクチャと実装
    • 可能な限り裏で魔法は使ってない
    • 不明瞭なCのバックエンドはない
    • シンプルさのてこの原理===パワフル
    • 少ない魔法の代わりにイントロスペクション
      • 開発者にとっての扱いやすさ
      • 豊富なイントロスペクション: Backtrace、MethodTable オブジェクト
  • Sydneyとは?
    • 再入(reentrancy)とスレッドセーフを含む1.8.2の巨大パッチ
    • 悩みの種(PITA=pain in the ass)になってしまった
    • CRubyは追跡して修正しないといけない非常にたくさんのCのグローバル変数を使ってる
  • Rubiniusへの移行
    • RuvyはSmalltalkからいろいろ借りてきた。だったら同じコンセプトにもとづいて実装してみるのもいいのでは?
    • プロトタイプAはRubyにblue-book実装を移植した。
    • 動いたし、基本的なコンセプトとアプローチは妥当だった。
    • プロトタイプBはAからのアイデアに加えて、バイトコードインタプリタコンパイラを実装した。生のメモリを操作するためにRubyInlineを使ったよ。
    • この時点で、プロトタイプとブートストラップ自身をCのコードにするトランスレータを持つべきだってことがわかった。
    • プロトタイプSはプロトタイプBをCのコードに手動でトランスレートしたんだけど、実行速度はよくなった。
    • プロトタイプWはプロトタイプBにトランスレート部分を作りこみ、Rubyコードだけでメンテナンス可能となった。
  • Q&A

Q.一度やり直してから、処理を容易にするのにAPRのようなプラットフォーム非依存なライブラリを使った?
A.はい。現在のところ、glibからStringとPointerArrayを使ってる。


Q.性能はどう?
A.まだ話すのには時期尚早だな。カンファレンスの終わりまでには知りたいと思う。プロトタイプSはここへの空の旅の途中でようやく動いて使えるようになったんだ。


Q.ゴールをはっきりさせられる?
A.自身をCインタプリタにトランスレートできる、RubyによるRubyインタプリタをつくること。


Q.プラットフォーム非依存なやり方でどうやって外部ライブラリにつなぐか考えてる?
A.いいえ。私の願いとしては、システムコールを解釈する共通のフレームワークを書くという決断がなされることだ。たとえば、SWTみたいなもの。


Q.PyPy(Pythonの似たようなプロジェクト)はもう見た?
A.はい。複雑だった。心配になったよ。


Q.別の言語プラットフォーム(JavaバイトコードCLR)でバックエンドコードを生成できる?
A.はい。もちろんそう願うし、そうでなければ時間の無駄になってしまう。


Q.クロスプラットフォームで動かすためにネイティブスレッドをサポートする予定?
A.外部ツールをうまく利用することでそれをしなくて済むように願いたい。


Q.Ruby-Cトランスレータを作ってるなら、そもそもなんでRubyインタプリタを書いたの?
A.それをしてなかったら何をトランスレートするの?トランスレートすべきコアエンジンはやっぱり必要だよ。
Q.それはRubyのサブセットでもある?
A.はい。


Q.Squeakととてもよく似てるように思えるけど、Squeakのコードを見たり、Squeak使いと話したの?
A.コードはたくさん見たよ。アイデアを盗ませてもらったね。でもまだSqueak使いとは話してない。笑われそうなんだもん。

  • 結果として得られた成果
    • SydneyParser: Sydneyのpaserを使い、Rubyコードを表現するsexp(?)を生成するためのParseTreeのアルゴリズムを盗んだ。
    • SegfaultProtection: 拡張した部分で起きるsegfaultを検知し、代わりにメモリ障害の例外をあげることでRubyインタプリタを維持する。
  • さらにQ&A

Q.断片化の懸念はある?
A.はい。でも現在のインタプリタと可能な限り互換性をもたせたかった。


Q.RubiniusのバイトコードYARVと互換性あるの?
A.いいえ。でもRubiniusにYARVへのブリッジを書くことができると思う。


Q.CコードのValgrindを見たことある?
A.はい。今後の方向性のよい可能性だよね。


Q.ちょっとくらいデモできる?
A.信じられないくらいつまらないよ。"ほら、MethodTableオブジェクトがあるよ、それを要求したからね"って感じ。