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インタプリタは大きなダンプトラックのようなものだ。ときにちょっと遅いが、うまいこと動いてくれている。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使いとは話してない。笑われそうなんだもん。
- 結果として得られた成果
- 肝心なこと(赤の丸薬)
- さらにQ&A
Q.断片化の懸念はある?
A.はい。でも現在のインタプリタと可能な限り互換性をもたせたかった。
Q.RubiniusのバイトコードはYARVと互換性あるの?
A.いいえ。でもRubiniusにYARVへのブリッジを書くことができると思う。
Q.CコードのValgrindを見たことある?
A.はい。今後の方向性のよい可能性だよね。
Q.ちょっとくらいデモできる?
A.信じられないくらいつまらないよ。"ほら、MethodTableオブジェクトがあるよ、それを要求したからね"って感じ。