前の記事 に続いてRubyKaigi2007をレポートする。
Ruby 1.9実装の現状と今後
東京大学講師になった笹田耕一さんによるYARVまわりの発表。
- Ruby1.9は現在鋭意作成中。
- 昨年のRubyKaigiで既に宣言されているように、1.9.1を2007年のクリスマスにリリースする予定。
とのことだ。
Rubyを開発するということで東大に雇われているので、発表実績作りのために今回は「ささだこういち」ではなく「笹田耕一」の名前で発表する、とのこと。研究者の実績作りにおける名前の取り扱いの大切さはなんか、体験はしてるけどよく分からない。私も名前をローマ字で書くときの綴りをどうするか、わざわざ教授から確認の連絡をいただいてしまったものなー。で、「研究者社会におけるジェンダー」に関する研究では夫婦別姓の選択肢が存在せずに結婚時に改姓を強いられると実績が途絶えてしまう、とか、そんな問題が深刻に報告されていたりする。まあ、伺い見る限りはその報告も針小棒大な話ではなくて実際に深刻らしく、ささださんもYARVの実績に紐付いて「笹田耕一」の名前が知れ渡らないときっと困るんだろう。「笹田耕一」「笹田耕一」「笹田耕一」。
1.8と1.9の違い
- VMの採用
- 文法の変更
- M17N
- クラスの拡張
- そのほか
VM、つまりYARVと呼ばれていたものをRubyの開発本流に取り込んだ。ささださんのサイトで開発されていたYARVが今年の1月1日に1.9の開発リポジトリにmergeされた。これまでRubyはソースコードをparseして作ったAbstract Syntax Tree(AST)をそのままつかって、木をたどりながら(再帰して)処理していたが、1.9からはASTを構築後にさらにバイトコードにコンパイルして、そのバイトコードを実行する。バイトコードを実行する仮想マシンは主にvm.cに実装されている。
ASTからJIT compileしたりAOT compileしたりするのは難しかったが、バイトコードからなら比較的簡単なのでそれらを通じて性能改善の余地がある。また、その他にもVM化に伴って細々とした様々な最適化を施した。例えば末尾呼び出しの最適化。多分、現在のところ最速のRuby処理系であるとのこと。(JRubyのほうが速いとか言う出所不詳な変な風評に反して)
また、ネイティブスレッドに対応した。RubyのThreadはOSが提供するスレッドに対応づけられて、今までのグリーンスレッド方式は廃止される。ただし、オプションとして残したり、ネイティブスレッド内で更にグリーンスレッドを動かしたり(大変そう)という話はアイディアレベルでは検討されている模様。
Rubyの新しいスレッド実装はPOSIX ThreadとWin32 Threadを利用できる。ので、DOS Extendedのようにこれらのいずれも提供されていない環境ではRubyは動かなくなる。また、Global VM lockするので、マルチプロセッサ環境においてもプロセス内で同時に動いているネイティブスレッドは1つだけである。他のスレッドは停止状態になる。これは拡張ライブラリも含めてスレッドセーフでないところが沢山あるため。
それから、新しいDebugger APIができて、実装はだいたいできている。
更に、ごく最近になって継続(Kernel#callcc)とFiberが実装された。これは結局、元のグリーンスレッドのサブセットがネイティブスレッド内で動いているような形。「継続って何さ?」という向きは定番ながら「 何でも継続 」を参照されたい。 『 プログラミング言語SCHEME 』の説明も分かりやすかった。
なお、今回の実装は完全な継続ではなく欠けている機能があるのでRuby Levelで安全なプログラムを書くのは不可能だそうだ。
従来ささださんの方針としては継続は1.9で廃止予定であった。問題が多くて手間も掛かるわりに実りが少ないということで。そこで私(yugui)が言い出したのが「継続かわいいよ継続」なわけだが。とはいえ私もあきらめかけていた矢先になんか突然継続が実装されてしまった。ささださん曰く、「心が弱っていたときについ出来心でやってしまった」だそうだ。ちなみにRubyKaigi打ち上げの席では「廃止したい」「今は反省している」と言っていた。
『 JavaからRubyへ 』は早く言うとBruce Tateが継続に萌えて愛の力で淡々と技術評価を進めていく物語だったわけだ。(違う?) この本が書店でもしばしば平積みになってたり、角谷さんの翻訳の良さも手伝って売れに売れてしまったのが心を弱らせたのではないかと推察する。
Fiberのほうは1.8にはなかった新機能。これは自動的に処理が切り替わる機能を持たない軽量なスレッドで、 Generator を作るのが目的である。ただ、Generatorを作るためだけにしてはオーバースペックだそうだ。他には状態繊維機械を記述するのに使えたりもするけれども、実際の使いどころを良く考え合わせて仕様をきちんと議論する必要があるとのこと。ゲームやシミュレーションで対象物の挙動を記述するには便利だという意見は出てるけれどもね。
FAQ
ここで、FAQとしてささださんから予め次が提示された。
YARV?
「これってYARVの話だよね?」「YARVは何と発音するの?」という質問だと思われる。ささださんのVM実装は「Yet Another Ruby VM」と呼ばれていたが、Rubyに取り込まれて既にYet Anotherでなくなっている。発音についてはRubyに取り込まれる見通しができたあたりから「本体に取り込まれればさしずめ"The Ruby VM"とでもなるので、発音は適当に」という話だった。世間では「やるぶ」とか「やーぶ」とか発音していた。ささださんは「The Ruby VM: TRVって俺が言い出したのか?」と言っていたけれども、うん、ささださんが発祥だと思う。
並列化?
「マルチコアの時代だから並列化を見越してネイティブスレッドに対応したのか?」 ライブラリがスレッドセーフでないので真の並列実行はしない。
JITはしないのか?
JITに夢を持ちすぎている。JITしてもそこまで速くない。AOT(Ruby to C Translator)に対応する予定である。
(Javaの)classファイルみたいなものはないのか?
あまり需要がないみたい。
私はclassファイル欲しいんだけどな。需要がないからYARV時代にあったバイトコード出力ユーティティが今は消えてるのか。
今後の開発方針など
Rubyのコアなコミッタで開発合宿を開いて、集中的に開発方針を決定したりもしている。主に仕様の議論。
- 1.9では「なるべく」1.8に対する互換性を保つように
- M17Nの方針
- RubyGemsの標準添付
2007年2月に松江で、2007年6月に東京で合宿を行なった。Matz曰く「あと数回やりたい」とのこと。
Ruby 1.9.1を12月25日にリリースする方針。とにかくリリースして使って貰う。少しぐらい品質が悪くてもリリースするとのこと。現在、1.8.6は大変安定しているけれども、1.9系統がこのレベルまで安定するにはまだ時間が掛かるらしい。
御利益紹介
なんかここでジョークが。
「Rubyを開発している方々からこんな喜びの声をいただいています」
- Rubyを作ったらフェローになれました: Matzだよね
- 就職できました: ささださん。JRubyのNutterさん, EneboさんがSunへ。あと、RubyCLRの作者もMicrosoftだっけ?
- 彼女ができました: ささださん?
質疑応答
Multi-VMはどうなった?
1.9.1には入れない。それはadditionalなので、1.9.5から1.9.6あたりに入れるだろう。
最適化って具体的には何を主眼にしているのか?
記号処理を速くする。これでメソッド呼び出し、iteratorなどが速くなれば全ての処理に影響がある。今まで遅かった数値計算が速くなると良い。
Multi-VMというは、1つのプロセス内で複数のRuby処理系をインスタンス化するというやつ。スタックやオブジェクト空間が完全に別物になる。Rubyではオープンクラスの代償としてライブラリのロードで生じた作用を取り消すのがひどく難しいのだけれども、オブジェクト空間が別なら一方へのライブラリロードは他へは影響を及ぼさない。スレッド間のリソース競合もあまり心配しなくて済む。
Pythonなんかでは当たり前にMulti-VMできるらしいのだけれども、Rubyの場合処理系の実装の都合上従来は難しかった。それでYARVがIPA未踏事業の支援を受けたときの開発目標にMulti-VMが入ってたのだ。今はMulti-VMできないのでmod_rubyなんかは結構無理をしているけれども、できるようになればそういうあたりの実装がより自然で効率的になる。