YARV: on Rails?

  • Posted by Nick Sieger

http://blog.nicksieger.com/articles/2006/10/23/rubyconf-yarv-on-rails


Speaker: Koichi SASADA


発表資料はこちら。
http://www.atdot.net/yarv/rc2006_sasada_yarv_on_rails.pdf


  • 自己紹介
    • 東京大学YARVを開発する仕事を得ました。今はおたくの街、秋葉原で働いています。
    • 日本Rubyの会のメンバーです。
    • RubyKaigi2006(3時間で200枚のチケットが完売)を開きました。RubyKaigi2007は6/9,10(土日)開催の予定です。
    • 日本Perlの会のメンバーです。
    • 日本のParrotのためのPerl本の共著者です。
  • デモ
    • [Railsアプリを作成するデモ]
    • YARVでアプリケーションを作成します。(rails foobar)
    • config/boot.rbを編集し、GCを使えなくします(ここにはバグがあるので、日本に帰ったら修正します。)
    • WEBRickを開始し、ほら動きました!
  • 用語解説
    • Rite: Ruby2.0のコードネーム(ベイパーウェアとしても知られています)
    • YARV: Yet Another Ruby VM


最適化には、コンパイル時最適化、ネイティブスレッド、特殊命令、命令統一、インラインメソッドキャッシュ、スタックキャッシュを含みます。YARVはconfigure/makeできますが、AC2.6ではうまくいきません(誰か理由を知っていますか?)。ほとんどのRubyテストをパスしていますが、実装の違いによる(テストの)失敗もあります。
[ここでWindows上でのYARVとWin32/OLEを用いたiTunesを制御するデモとIRBでネイティブスレッドを扱うシナリオを披露しました。]


YARVにまつわる俗説: YARVはすごい!YARVはあらゆる問題を解決します!Rubyプログラムを50倍速くします!文字コード問題を解決します!ガールフレンドが見つかります!

真実: YARVRubyプログラムを速く走らせるためのものです。あるアルゴリズムベンチマーク(たとえば、Ackermann, Fib)では20倍の性能向上をもたらしますが、ほかではそうではありません。YARVの命令シーケンスを組み立てたり、バラバラに分解したりできます。あるいはそれらを直列化したり、非直列化します。単なるRubyリテラルで、YAML形式やその他の人間が読める形式に詰められます。

     require 'yasm'
     require 'yaml'

     iseq = YASM.toplevel([:a, :b]) {|ib|
         ib.answer
         ib.leave
     }

     p iseq.to_a.to_yaml # => (gave a readable YAML view of the assembly)
  • スレッド
    • Rubyスレッドはネイティブスレッドに1対1でマップされます。
    • POSIXとWin32をサポートします。
    • 多くの現存するRubyライブラリはCレベルで同期化されていません。そのため多くのCライブラリは同期化を追加する必要があります。
    • スレッドモデル2: Giant Lock(GL)を使って1対1にマッピングします。ロックをもつスレッドだけが走ることができます、同期化の必要はありませんが、並列性がありません。
    • スレッドモデル3: Rubyスレッドは並列実行されますが、スレッドセーフでないコードが実行されるときはGLが取得されなければなりません。
    • Mutexクラスはビルトインになります。
    • Thread criticalはなくなります(廃止はされませんが、非推奨になります)。[一部の者にとっては異論があったようです。コメントとしては、ネイティブスレッドモデルで維持するのは不可能だけど、2つのスレッドモデルは互換性がある、とのことです。]


Matz: 2007年のクリスマスにリリースのRuby1.9.1には、YARVがマージされる予定です。そのため、2007年の春か夏までにはマージを完了したいでしょう。スレッドモデル2がまず適用されることになります。

  • 今後
    • set_trace_func フック関数 - ここですべきことは?[取り除くことをCharles Nutterは提案していますが、代わりとなるよいデバッグAPIがあるならOKだとMatzは答えています]
    • Ruby1.9に追いつくこと
    • JIT/AOTコンパイラ(AOTコンパイラははじめたけど完成していない)
    • 関連プロジェクト: high-performance Ruby(HPCなコードを簡単に書けることが目的)


より多くの開発者とテスターが必要です。ぜひプロジェクトに参加してください。