はじめてのruby.wasm

Ruby 3.2でWASIベースのWebAssemblyサポートが実装された。
https://www.ruby-lang.org/ja/news/2022/12/25/ruby-3-2-0-released/

興味はあったものの実際に触れる機会がなかったが、今回、Ruby Goldの学習中にふと異なるバージョン間での動作の違いを確認したいと思い、ruby.wasmを試してみることにした。

(注: 現在のRuby Goldの対象バージョンはRuby 3.1.x)
ref: https://www.ruby.or.jp/ja/certification/examination/

WebAssembly/WASIとは

WebAssembly/WASIについて、WEB+DB PRESS Vol.133の「速習Ruby 3.2」の内容をもとに改めて整理する。

  • WebAssembly(Wasm)は新しいバイナリフォーマット。ブラウザ上での実行を主眼に設計されており、サイズが小さく、高速で安全な実行が特徴。
  • WASI(WebAssembly System Interface)は、WebAssemblyにシステムレベルの機能を提供するAPI。WasmバイナリはWASIを通じて、システムの様々な機能を利用できる。
  • Wasm/WASIのバイナリは、C/C++やRustなどからコンパイルして生成できる。C/C++からのコンパイルにはwasi-sdkというツールチェーンがあり、Ruby 3.2でRubyインタプリタのCコードをwasi-sdkでビルドできるようにした。このようにビルドされたRubyをruby.wasmと呼ぶ。

ブラウザでRubyを動かす

ブラウザ上でRubyを実行できる簡単なプレイグラウンドを作成した。 https://uchinokot.github.io/ruby-playground/

Rubyを実行可能にするのは以下のみ。

  1. @ruby/wasm-wasi をCDN経由で読み込む https://github.com/uchinokot/ruby-playground/blob/a7169b4a641054396e02c94cdaa51d114a69bd6d/index.html#L48-L49

  2. <script type="text/ruby"> 内にRubyコードを記述する https://github.com/uchinokot/ruby-playground/blob/a7169b4a641054396e02c94cdaa51d114a69bd6d/index.html#L70-L106

これだけで、ブラウザ上でRubyが動作する。すごい。

今後

今回はブラウザ上でruby.wasmを動かしたが、今後はブラウザ外の環境でも試してみたい。特に、CLIツールをスタンドアローンなWasmファイルとして自作するのは便利そう。 また、WebAssemblyの仕組み自体についてもさらに理解を深めていきたい。

参考