【レポート】

未踏ソフトウェア創造事業 千葉PM 成果報告会 - Ruby 2.0の新仮想マシンYARVとは?

    後藤大地  [2006/02/28]

    未踏ソフトウェア創造事業 千葉滋PMは24日、電通国際情報サービス品川本社ホールにおいて、2005年度上期未踏ソフトウェア創造事業公募において採択した4案件に関する最終成果報告「平成17年度上期未踏ソフトウェア創造事業 千葉PM 成果報告会」を開催した。

    本レポートでは、なかでも笹田耕一氏によって取り組まれた「オブジェクト指向スクリプト言語Rubyの処理系の刷新」について報告する。

    東京農工大学大学院 工学部 博士後期課程 笹田耕一氏

    YARV

    YARV(Yet Another Ruby VM、ヤルブと読む)は、笹田耕一氏によって開発されているRuby仮想マシン実装のひとつ。標準のRuby仮想マシンに比べて特定の場合をのぞき、ほぼすべての場合において処理が高速になるという特徴がある。世界中でもっとも高速に動作するRuby仮想マシンを目指して開発がおこなわれているもので、22日には最新のYARV 0.4.0が公開されている。

    YARV: Yet Another Ruby VM

    YARV 0.4.0はRubyと同じライセンスのもとで公開されているオープンソースソフトウェア。RubyはGNU GENERAL PUBLIC LICENSE Version 2かもしくはライセンスファイルに記載されている条件に従って再配布や変更をおこなうことができる。YARV 0.4.0においても同様だ。

    YARV 0.4.0では、標準のビルドプロセスがサポートされたほか、リリースに向けてきわめて多くのバグ修正が施されている。現在のRubyに対する実装はほぼ網羅されたとされており、次期Ruby 2.0の仮想マシンとして期待されている。

    YARV開発の動機

    Rubyはオブジェクト指向のスクリプト言語。まつもとゆきひろ氏によって開発されたプログラミング言語で、優れた設計思想やスクリプト言語におけるオブジェクト指向の実現などの特徴があり、国内でも高い人気を誇る。現在では日本に限らず、世界中でもちいられている代表的なスクリプト言語のひとつになった。

    しかもここ1, 2年、Webアプリケーション開発システムであるRuby on Railsの爆発的な人気によって、スクリプト言語として一気に認知の幅を広げた。Ruby on Railsに限るものではないが、Rubyの認知が広がり採用されるシーンが増えるに従って、Rubyの弱点として実行速度が指摘されることも増えてきている。YARVの開発はこの指摘に対する改善を目指して行われたものだという。

    笹田耕一氏は、Rubyで実装した仮想マシンRavaの開発者でもあるなど、仮想マシンの設計実装などに精通している。同氏はRubyの仮想マシンを開発した理由のひとつとして、Rubyの開発者であるまつもとゆきひろ氏と日本語で議論できる利点なども強調した。

    YARVの基本方針

    Rubyの現在の実装は実はそれほど遅いというものではない。文字処理などはほかのスクリプト言語と同等の処理速度を実現している。ただし、数値や記号処理で遅い面があり、仮想マシンにおいて再帰的な処理を用いているところなどは本質的に遅くなってしまう面もあるという。とくにベンチマークではこのあたりの実装による遅さが出てしまう。

    YARVではRubyコードはいったんYARV命令セットと呼ばれる命令セットに変換される。YARV仮想マシンは最終的に変換されたYARV命令を実行するという仕組みを採用している。

    スタックを使った処理の高速化

    YARVでは、仮想マシンにおいて再帰的に処理している部分をスタック構造を使った処理に変更。このほか各種最適化を施して処理の高速化を実現している。場合にもよるが、だいたい2倍から50倍の高速化が実現されているという。

    未踏プロジェクト

    YARVの開発は、今回未踏プロジェクトに採択されたものがはじめてではない。1年前の2004年度未踏採択案件「Rubyプログラムを高速に実行するための処理系の開発」においてすでに取り組まれている。2005年度上期未踏ソフトウェア創造事業として採択された「オブジェクト指向スクリプト言語Rubyの処理系の刷新」は、実質的に前回の採択を継続したものといえる。

    未踏プロジェクト主要採択内容

    採択したテーマの主な内容は次のとおり。

    • Ruby処理系へYARVのマージ
    • ネイティブスレッドへの対応
    • マルチ仮想マシン化

    前回の採択時にはYARVをRuby処理系に外部モジュールとして追加する形で実現していたため、いくつかの問題があった。YARVの効果を発揮するにはYARVとRuby処理系をマージする必要があり、今回の案件内容として挙げられている。

    ネイティブスレッドへの対応やマルチ仮想マシン化などは、PCプロセッサのマルチコア化や、RubyのWebアプリケーションプログラミング言語としての用途拡大に対する機能拡張にあたるもの。どちらも今後のRubyの発展を考えるうえで重要。以降ではそれぞれのテーマについて、今回のプロジェクトで取り組まれた内容を紹介する。

    Ruby処理系へYARVのマージ

    当初開発されたYARVは、Ruby処理系に対して外部モジュールを追加する形で実装されていた。RubyインタプリタがYARVを拡張ライブラリとしてコールし、YARVからはRuby APIを使ってRubyを使うといった仕組みである。

    外部モジュールとして実装されていたYARV

    この方法にはいくつか問題があった。このまま拡張モジュールというスタイルで問題を解決することは難しく、Rubyインタプリタの評価器部分を直接YARVに適したものに変更する必要があるなど、統合する必要があったという。

    Ruby処理系と統合したYARV

    統合にあたっては多くの変更を必要としたため手間のかかる作業であったが、問題点を解決し、22日にリリースされたYARV 0.4.0ではノーマルビルドが可能なところまで整理が進められている。

    ネイティブスレッドへの対応

    Rubyはこれまでスレッドの実装としてユーザレベルスレッドを採用していた。これはユーザランドライブラリレベルでスレッド処理を実現するというもので、移植性が高く、スレッドの切り替えが高速、また、どの環境でも同様の性能を発揮しやすいという特徴がある。

    反面、ユーザランドスレッドでは、マルチコアやマルチプロセッサシステムの性能をほとんど発揮させることができないという問題がある。PCのプロセッサは、動作周波数の引き上げによる性能向上戦略が物理的な限界に近づいていることから、今後はマルチコア、マルチプロセッサ化による性能向上に移るとみられている。このため、マルチコアやマルチプロセッサの性能を発揮できるOSやアプリケーションでなければ、今後のPCの性能を活かすことができない。

    Rubyにおける現在のスレッド実装は、Javaにおけるグリーンスレッドによく似ている。Javaはこの問題を解決するためにネイティブスレッド化を実施し、マルチコアやマルチプロセッサシステムにおいてもスケーラブルに性能の向上が望める仕組みに変更している。YARVにおける今回の取り組みは、これと同様の試みとみることができる。現在対応しているスレッドライブラリはPOSIX ThreadおよびWin32 Thread。

    現在のRubyにおけるスレッドモデル

    ただし今回の実装では、スレッドをそのままネイティブスレッドに対応させ、スレッドに対し制御をおこなうというスタイルではなく、能動的に実行されるスレッドを切り替える方式で実装している。仕組みとしては実質的にシングル処理と変わらないことになる。

    YARVにおいて実現したネイティブスレッドモデル

    これは将来的に完全に並列処理を実装するにあたっての、移行途中としての段階という位置づけだという。たしかに、このあたりの設計実装はかなり難しい。OSが提供しているスレッドの実装も、互換性があるようで細かい違う点があり、移植が難しくなるという問題や、挙動がOSによって左右されるようになるという問題もはらんでいる。

    マルチ仮想マシン化

    YARVにおけるマルチ仮想マシン化の実現は、mod_rubyにおける性能向上を実現するものだと考えるとわかりやすい。Rubyプロセスにおいて複数の仮想マシンを動作させようとするものである。

    現在のRubyの実装は、C言語のグローバル変数を多用する仕組みになっているため、複数の空間を実現することが難しいという。YARVではこれを受けて、1プロセスにおいて複数の仮想マシンが実行できるように設計実装されている。

    マルチ仮想マシンが実現するとなにが便利になるかというと、mod_rubyを考えるともっともわかりやすい。mod_rubyはApache HTTPd ServerにおいてRubyで開発されたWebアプリケーションとHTTPd Serverの架け橋を実現するもの。1つのプロセスにおいて複数のRuby仮想マシンが実現できれば、最初に一度だけRubyを起動したら、あとはその中で仮想マシンを起動するだけで処理を実現できるようになる。

    マルチ仮想マシンの実現

    システムにおけるプロセスの生成処理は重たい処理に分類される。要求ごとにRubyプロセスを起動するにはそれだけ負荷がかかる。マルチ仮想マシンが実現できれば、一度立ち上げたプロセスで複数の仮想マシンが実行できるようになり、処理を軽減することができる。

    ベンチマーク例

    笹田耕一氏からはYARVの効果を示す目的で、いくつかの性能評価が例が紹介された。特定の場合における処理の評価であり普遍的包括的な評価ではないが、YARVの効果が現われていることを伺うことができる。

    YARV 0.4.0実行例 – 仮にRubyのバージョンが2.0.0と表示されていることがわかる

    YARV 性能評価例

    Future work

    現在Rubyの最新安定リリース版は2005年12月24日に公開されたRuby 1.8.4。次期Rubyとしては言語仕様の整理などを実施したRuby 2.0が計画されており、次期Ruby公式実装としてRiteの開発が進められている。

    YARVでは実行速度の大幅な改善、ネイティブスレッドへの対応、マルチ仮想マシン化など、Ruby 2.0へ向けて課題として挙げられていたいくつかの点が解決されており、このままいけばRuby 2.0における仮想マシンとしてYARVが採用されるとみられている。

    ネイティブスレッドの実装に関し、現在の実装のように主導的に実行するスレッドを逐次切り替えながら処理する方式から、スレッドを並列を実行させながらスレッドの停止や開始、スレッド間通信などを実現する方法に移行する時期については、人的資源の問題などから今のところ明確な目処は立っていない状況のようである。

    また同氏からは、短い処理である場合、ネイティブスレッドよりもユーザスレッドを使った方が処理が高速であることもあるため、将来的には2つの方法のどちらを使用するか選択できるようにするかもしれないといったことや、Javaのようにプリコンパイルを実現し最初のパース&コンパイルにかかる処理時間を短縮する方法も考えられるといった示唆に富んだ発言もあった。

    今後も目がはなせないスクリプト言語 - Ruby

    エンタープライズシステムやWebアプリケーションの開発にはJavaやPHPが欠かせない状況だ。特に、この分野における最大の採用言語とみられるJavaを取り巻く開発や技術動向は目まぐるしい状況にあり、今後も目をはなすことができない。

    一方、Ruby on Railsが爆発的な話題をさらっていったように、Webアプリケーション開発においてスクリプト言語に持たれている期待も、並々ならぬものがある。現にJavaもスクリプト言語の特徴を実現しようとスクリプトの提供に取り組んでおり、スクリプト言語に対する期待は膨れ続けている。

    エンタープライズシステムやWebアプリケーションの開発に採用されそうなスクリプト言語の候補をいくつかあげれば、PHPはもちろんだが、それ以外ではPython、Ruby、Perlなどがある。どの言語も活発に開発が行われているが、これらスクリプトのなかであるいはもっとも今後の発展が期待できるのはRubyかもしれない。

    Webアプリケーション開発におけるスクリプト言語の採用動向が今後どのように発展していくかはわからないが、一つの方向性として重要であることに変わりはないだろう。YARVからもわかるように、Rubyの今後の開発にも期待が持たれる。今後も技術動向から目がはなせないといえるだろう。

    関連記事

    関連サイト

    新着記事

    特設サイトの情報

      求人情報

      人気記事

      一覧

      イチオシ記事

      新着記事

      特別企画

      転職ノウハウ

      あなたの仕事適性診断

      4つの診断で、自分の適性を見つめなおそう!

      Heroes File ~挑戦者たち~

      働くこと・挑戦し続けることへの思いを綴ったインタビュー

      はじめての転職診断

      あなたにピッタリのアドバイスを読むことができます。

      転職Q&A

      転職に必要な情報が収集できます

      スカウト転職する

      企業からアプローチのメッセージが届きます。

      マイナビニュースマガジン