Rubyアソシエーション開発助成金2022 メンター報告書
- プロジェクト: MRIのWebAssembly対応よるポータブルなRubyプログラムの実現
- 開発者: 齋藤 優太
- メンター: 遠藤 侑介
プロジェクト概要
WebAssembly System Interface(WASI)は、WebAssemblyにおける標準的なシステムAPIである。WASIに対応したWebAssemblyアプリケーションは、Webブラウザの上だけでなくデスクトップ環境、サーバ環境、エッジコンピューティング環境などでポータブルに動作する。また、WebAssembly/WASIは軽量なサンドボックス環境としても期待されている。WebAssembly/WASIが進化・普及するに従って、プログラミング言語処理系はWebAssembly/WASIに対応していくことが求められるようになっていくと考えられる。
このプロジェクトでは、MRIをWebAssembly/WASIに移植する。さらに、RubyスクリプトをWebAssembly実行ファイルにパッケージ化するためのツール開発や、Rubyスクリプトを各種WebAssembly/WASI環境で動作させるデモの開発を行う。
計画の達成状況
期待を大幅に上回る速度で進捗し、大きな成果を残した。コア開発、周辺開発、デモ開発の3点に分けて記述する。
コア開発
インタプリタをWebAssembly/WASIに対応させる変更はすでにRubyの開発ブランチにマージされている。 この開発は、当初見通せていなかった非自明な問題(setjmp/longjmpや保守的GCの対応など)の解決を含めて1ヶ月強で完了した。
加えて、次のような成果も残している。
- MRIのコミッタに就任し、WebAssembly/WASIのプラットフォームメンテナに任命された。
- btestや一部のrubyspecなど、Rubyに付属する一部のテストがパスするように作り込み、CIを構築した。
- デモの開発過程で判明した性能問題に対応するため、高速化の開発を行った。
- 作業の過程で発見したWebAssembly/WASIツールチェインの問題のバグ報告や修正提案を行った。
周辺開発
Rubyスクリプトやアセットをパッケージ化するためのwasi-vfsライブラリを開発・公開した。 このライブラリはRuby特化ではなく、WASI対応WebAssemblyアプリケーション全般で利用できるものとして設計されている。
また、WebAssembly/WASI実行ファイルにコンパイルしたRubyを"ruby-head-wasm-wasi"というnpmパッケージとして公開した。 これにより、WebAssembly/WASI対応のRubyを使いたいユーザは自分でビルドしなくてもよいようになっている。
デモ開発
irbやoptcarrotなど、ブラウザの上で非自明なRubyスクリプトを動作させるデモを複数開発した。 また、RubyスクリプトがFastly Compute@Edgeの上で実際に動作することを確認した。
メンターとして果たした役割
週1回、進捗を確認するオンラインミーティングを行い、問題や解決方法について議論した。 WebAssembly/WASIについては開発者自身が非常に詳しいので、メンターとしては主にMRI特有の注意点をコメントしたり、デモの見せ方について意見したりした。
今後の期待
従来のRubyの使い勝手と比べると、現時点のWebAssembly/WASI移植では主に次の3点が欠落している。
- Threadが利用できない
- 拡張ライブラリを動的にrequireできない
- 拡張ライブラリを含むRubyGemsに対応できていない
これらが実装できないのは現時点でWASIに機能が不足しているためであり、今後WASIが拡充されるに従って解決・緩和できるものと考える。WASIの発展とともに、今後改良されていくことを期待する。
まとめ
本プロジェクトでは、RubyのWebAssembly/WASI対応を行った。 また、RubyスクリプトをWebAssembly実行ファイルにパッケージ化するためのツール開発を行い、各種WebAssembly/WASI環境で動作することを確認できた。 今後WebAssembly/WASIがより隆盛した際に、Rubyが軽量な開発言語として選択肢になれるよう、使い勝手の改善やエコシステムの拡大が継続的に進んでいくことを期待する。