本家の5倍速? Pythonで実装したRuby処理系の「Topaz」が登場
日本時間だと2013年2月7日未明のことですが、「Topaz」(トパーズ)と名付けられたPythonで実装されたRubyのバージョン0.1がリリースされました(リリースに関するブログ、プロジェクトのページ、GitHubのリポジトリ)。Ruby処理系はC、Java(JVM)、Ruby、CLI、JavaScript、Smalltalkなどによる実装がありましたが、Pythonというのは、ちょっと驚きです。ただ、Pythonといっても、Python言語で書くのが主眼なのではなく、Pythonエコシステムで高速処理を目指して作られた「PyPy(パイパイ)」の成果物の上に実装したというのがTopazのようです。現在のところコード作者リストに9人の名前が上がっていて、JRuby実装で知られるチャールズ・ナッター氏の名前も入っています。
Topazは正確にはPythonではなく、RPythonと呼ばれるPythonのサブセットの言語で書かれています。RPythonは2.7.3互換をなるべく保ちつつ、速度向上を目指した仕様・実装のようです。RPythonとPythonの互換性のページによれば、Django、Flask、SQLAlchemyなども動くようで、サブセットといっても互換性は高そうです。
【追記1】ライブラリの互換性が高いのはRPythonのほうではなくPyPyのほうでした。訂正してお詫びします。
【追記2】なぜPyPyが速いのか、ということについては、Ryotaro Ikeda氏の「流行りのJITコンパイラは嫌いですか?」という文書がコンパクトで参考になります。@objectxplosiveさん、情報ありがとうございます!
RPythonのRはRestricted(制約ありの)の意味で、Pythonを型推論による静的型付け言語のように扱うために作られたようです。RPythonで書かれたコードはCやJVM上のバイトコード、CILなどに変換でき、かつJITが効くので、RPythonは多くの場合、CPythonよりも高速だということです。以下、PyPyのマイクロベンチマークの表を1つ引用します。平均して5.6倍とあります。
つまり、RPythonを使って実装したTopazというRuby処理系もCRubyよりも速くなる可能性があるということかと思います。すでにあちこちで「全く科学的とは言いがたい」という前置き付きのベンチマークの結果をブログなどに貼る人が現れています。例えば、havenwoodさんのGistにある、差が6となる素数ペアをリストアップする(割とRubyっぽい?)コードの例だと、以下のような結果のようです。
- Topaz-dev: 9.65秒
- Ruby-1.9.3: 44.81秒
- Ruby-2.0.0: 44.09秒
- JRuby-1.7.2: 42.14秒
- Rubinius-2.0.0: 82秒
- MacRuby-0.1.3: 36.29秒
速度面では、だいぶ期待できそうです。
ただ、TopazはRuby 1.9.3互換ということですが、今のところ、ライブラリの大部分、標準メソッドの多くが未実装であるほか、スレッドやファイバ、call/ccは未サポート、メソッドの可視性制御も未サポートなど本当に始まったばかりのプロジェクトです(それでもリリース前に10カ月ほど取り組んでいたということですが)。
RubyとPythonは似たところの多い言語ですが、エコシステムはかなり違っています。特に自然言語処理や統計処理、機械学習など研究者方面ではPythonの利用が多く、ライブラリも充実しています。普及タイミングの問題もあったのかもしれませんが、この違いはかつてのRubyとPythonの処理速度の差から来ていた面もあるのではないでしょうか。RubyはWeb系では活発で大きなエコシステムを持っていますが、こうしたPythonの多様さには一歩及んでいないというのが私の印象です。
Topazのような「(制約付きながらも)速いRubyを目指す」プロジェクトが出てきたことで、これまでRuby界隈ではあまり見かけなかったようなライブラリや、既存ライブラリの移植が見られるようになるなら、これはRubyistや、「研究でもRubyが使いたいなぁ」と思っているような人にとっては朗報になるのではないかと想像しています。