最近Spotifyによってオープンソース化されたRuvyは、RubyコードをWasmモジュールに変換するWebAssemblyツールチェーンである。ruby.wasm
をベースに、RuvyはRustで実装され、パフォーマンスを向上させ、Wasmモジュールの実行を簡素化するための最適化が含まれている。
Ruvyは、ruby.wasm
が提供するRubyインタプリタモジュールを活用し、wasi-vfs
(WASI仮想ファイルシステム)を使用して、指定されたすべてのRubyソースファイルとともに単一のモジュールにパッケージ化する。wasi-vfs
は、.wasm
バイナリに埋め込まれた仮想ファイルシステムを作成し、WebAssemblyランタイムでホストファイルシステムへのアクセスを有効にすることなく、Rubyソースファイルをruby.wasm
で読めるようにする一般的なメカニズムを提供する。
Ruby.wasm
/wasi-vfs
でデフォルトで行われるように、実行のためにメモリにロードされるときとは逆に、WasmモジュールがビルドされるときにRuby VMを事前に初期化することで、Ruvyがパフォーマンスを向上させる。ShopifyのシニアWasm開発者Jeff Charles氏は、これにより実行時のパフォーマンスが20%向上したと説明する。
さらにCharles氏は、RuvyはCraneliftコンパイラを使ってWasmからネイティブコードにコンパイルするのに必要な時間を30%に短縮すると説明する。
Ruvyを使用するもう一つの利点は、WASIの引数としてファイルパスを必要とせずに、実行構文を簡素化できることだ。これは、必要なファイルをまとめてパッケージ化しているおかげである。これは例えば、メインのエンドポイント関数に追加のWASI引数を与えることができない様々なエッジ・コンピューティング・サービスに特に関連する。
現時点では、Ruvyはソース配布版としてのみ提供されており、使用する前にビルドする必要がある。必要な依存関係(rustup
、wasm32-wasi
、cmake
、macOSホスト用のRosetta 2
など)をすべてインストールすれば、ビルドの手順は基本的にとても簡単だ。あとはmakeを
実行し、以下の例のようにRuvyを実行してruby_examples/hello_world.rb
ソースからindex.wasm
モジュールを作成するだけだ。
$ cargo run --package=cli ruby_examples/hello_world.rb -o index.wasm
前述したように、--preload
コマンドラインフラグを使って、Ruby VMに渡すべきRubyファイルを含むディレクトリを指定できる。
Charles氏は、Ruvyは現時点では単純なRubyプログラムしか実行できないことを強調している。具体的には、まだRuby gemsをrequire
できないため、Ruby標準ライブラリの大部分を利用できない。将来的には、この制限を取り除くために、標準ライブラリからのコードのロードと、非ネイティブのサードパーティ製gemのロードを可能にする予定だという。