VMはゴールではない、それはスタートだ
ささだ氏のセッションで語られた内容は、表面的には、
- Ruby-1.9.1(1.9正式版)を2008年12月20日にリリースする予定である
- HPC分野や、MVMの実装など、いくつかの実験的な実装を行っている
といった点であり、耳に聞こえてくるメッセージは、YARV(ささだ氏が開発した仮想マシン――以降、仮想マシンはVMと略す)を組み込んだことによるRubyの高速化と安定性の向上である。
しかし、Ruby 1.9の真価は、YARVを組み込んだためにマイクロベンチマークテストの結果が向上したことではない、とささだ氏は強調する。Ruby 1.9の価値は、YARVを組み込んで高速になったことではなく、YARVを組み込んだことで、高速なRubyを開発するための基盤が整った点なのだ。言葉を変えると、Ruby 1.9によって、やっとスタートラインに立ったということである。つまり、まだまだ全然速くない、ということだ。
まつもと氏がRubyの開発を開始した1990年代初頭には、まだJavaというVMを利用したプログラミング言語は見えるかたちでは存在していなかったということを思い出して欲しい。この時点で個人が実用的なプログラミング言語を開発するための戦略としてまつもと氏がとった方法は、まったく正当だったからだ。しかも、ご存知のように多数の開発者を投入して開発しているJavaでさえ、高速性を獲得するのは、1990年代も後半になってからである。
従って、現時点から見ると速度面で足を引っ張っているいくつかの特徴、たとえばCによる移植性を確保するためのsetjmpを利用したブロックやスレッドの実装などは、言語の機能と実用性、実行速度のバランスからは賢い方法であったと言える。
しかし、それはそのまま21世紀の現在では高速化への足かせなのだ。
ささだ氏の言葉を借りると、まつもと氏の実装戦略はスタート地点をあらかじめ高いところに設定することで実装の負荷を軽減したものだが、その代償として高速化の伸びしろが短かかった。しかしYARVを組み込むことで、スタート地点をはるかに引き下げることができた。したがって伸び白を飛躍的に長く取れるようになったということらしい。
たとえばRubyのうち、比較的簡単に交換可能なモジュールであるガベージコレクタ(以降GC)の別実装という提案はこれまでにいくつか行われている。しかし、Rubyそのものの処理速度が遅いため、GCの交換は全体的な処理速度の向上にそれほど寄与せず、結局、これらの提案は受け入れられないままとなっている。
それに対して、Ruby 1.9では全体的な実行速度の向上により、GCによる速度低下が明らかにインパクトとして認められるようになった。こういったことが、新たなGCの開発に対するモチベーションとなるのである。
では、VMを組み込むと何が起きるだろうか?
ひとつの例が、浜地氏(0日目に行われたゴルフ場のオウナー)によるYajitというJITコンパイラである。Yajitは、Xbyak(カイビャック)を利用したx86とx86 64用のJITコンパイラで、Rubyに対する拡張ライブラリとして組み込める。
これまでのRubyに対してもJITの組み込みは不可能ではなかったかも知れないが、VMという基盤の導入によって、そのような取り組みがはるかにしやすくなった、つまり種々の実験や研究がしやすくなったという点が1.9の特徴なのだ。
これは、ささだ氏のミッションである、世界中の人が使えるものを作るというテーマにもマッチしている。世界中の人が使えるものというと漠然とし過ぎているが、高速なRuby実装の提供が当面のゴールである。つまりは、YARVの組み込みによって、Rubyというゼロベースで実装しなくとも良いという意味で低コストな、研究のためのインフラが提供できるようになったということである。
しかも、研究のインフラとしてのRubyには、もう1点、極めて大きな長所がある。それはRubyが現実に世界中で利用されていて、しかも利用者がより高速な実装を求めているという点だ。これは、良い実装を提供できれば、すぐにでも利用される可能性があるということを意味する。研究のための研究ではなく、利用シーンが見えている研究ができるということである。
Rubyの3つの面
Ruby 1.8までのRubyは、基本的にハッカー向きの実用性に富んだプログラミング言語という面が主だったと言えよう。
それが、Railsの登場により――まさにDHHというフレームワークハッカーがハッカー向きの実用言語を利用してWebアプリケーション用フレームワークを開発したということだが――ビジネスでも利用できる実用的なプログラミング言語としての面が要求されるようになった。しかし、現状の1.8の実装では、この要求に完全に答えることは難しい(かも知れない)。
そこに、1.9というVMを組み込んだRubyの登場によって、研究インフラとしてのプログラミング言語という面も加わった。
つまり、VMの搭載は、Rubyが持つ最初の面と2番目の面からは一見するとゴールに見えるかも知れないが、そうではなく、新たに加わった3番目の面のスタートであり、それは結果的に、最初の面と2番目の面に対して、よりすぐれたRubyの提供という将来に対する約束になる――これがささだ氏のセッションの真のメッセージなのだ。
# 1から10までの合計を求めるプログラム(多様性の例) # Rubyハッカー (1..10).inject {|r,e| r + e } # 実務プログラマー x = 0 for i in (1..10) x += i end return x # 研究者 lambda{fn=lambda{|x| return 0 if x==0; x+fn.call(x-1)}}.call.call(10)