はじめての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を実行可能にするのは以下のみ。
-
@ruby/wasm-wasi
をCDN経由で読み込む https://github.com/uchinokot/ruby-playground/blob/a7169b4a641054396e02c94cdaa51d114a69bd6d/index.html#L48-L49 -
<script type="text/ruby">
内にRubyコードを記述する https://github.com/uchinokot/ruby-playground/blob/a7169b4a641054396e02c94cdaa51d114a69bd6d/index.html#L70-L106
これだけで、ブラウザ上でRubyが動作する。すごい。
今後
今回はブラウザ上でruby.wasmを動かしたが、今後はブラウザ外の環境でも試してみたい。特に、CLIツールをスタンドアローンなWasmファイルとして自作するのは便利そう。 また、WebAssemblyの仕組み自体についてもさらに理解を深めていきたい。