こんにちは!WantedlyのEngagementで開発している、エンジニアの渡邉(@eityans)です。
私達は今、長野の松本で開催されている RubyKaigi2023 に参加しています。早いものでもう3日目ですね!現地の状況を皆さんにお伝えしたく、メンバーと共にたくさんブログを書いているので見てください!
本記事では、3日目の講演である、 Load gem from browser の内容を紹介します!
本講演はruby.wasmでサードパーティ製の gem を呼ぶための取り組みに関する話です。発表者はラグザイアの中島 滋 (@ledsun) さんです。
wasm でサードパーティ製gemを使いたい動作するバイナリ形式のコードで、ブラウザ上での実行が可能です。プレゼンテーションの始めで、@ledsun さんはパズルゲーム "Wordle" を解くためのアプリケーションを紹介していました。発表後に久しぶりに Wordle で遊んでしまいました。
https://wordle-search.onrender.com/
wasm でサードパーティ製 gem を使いたい
次に、@ledsun さんは wasm で Ruby の gem を利用する方法について話しました。現時点で、 Ruby の標準 gem は問題なく利用することができます。しかし、サードパーティ製の gem は現状では利用できません。その理由は、ruby.wasm のファイルシステムには読み取り専用の制限があるためです。
この制限を突破するために、@ledsun さんは JavaScript の歴史を参考にしたとのことです。歴史から考えられるアプローチとして、「予め bundle するアプローチ」と、「import-maps のように、実行時に必要な gem を探し出すアプローチ」の選択肢があり、このうち後者の方針を選択したとのことです。その理由として、「スクリプト言語らしさを維持していきたい」や、「バンドリングのチューニングにエンジニアの注意が行ってほしくない」という思いが語られておりました。
require_relative で gem を呼び出す
import-maps の方針でサードパーティ製の gem を呼び出すために、@ledsun さんは wasm で require_relative で gem を呼び出す仕組みを実装している最中であると説明していました。require_relative を使った gem の呼び出しが実現できれば、import-maps 相当のものを用意することでサードパーティ製の gem を呼び出すことができるという算段です。
発表では require_relative の実装の概要と難しさが語られていました。ファイルの読み込みは fetch が使われますが、これは Promise を返すため、それを Ruby で扱うために Fiber を使って実装したとのことです。スタックサイズが小さいという問題から、今呼び出している Ruby ファイルの位置を覚えておかないと行けなかったりと、実装の難易度が伺えました。
発表では、 wasm 上で呼び出す Ruby ファイルから別のRuby ファイルを require_relative を利用して呼び出すデモが紹介されていました。デモを見て、もうすぐ実現できるのでは...?と期待していましたが、いくつか課題が残っているようです。現時点では、require_relative で呼び出した Ruby ファイルから別の Ruby ファイルを require_relative するとうまく動かない問題があるようです。現時点では再帰的な require_relative ができない状況ではありますが、デモを見て、wasm でサードパーティ製 gem を呼び出すための準備が進んでいることを実感し、ワクワクしております。
サードパーティ製の gem が呼べるようになった後の世界
上記のような require_relative の実装が wasm で行われ、import-map のような仕組みができると、サードパーティ製の gem を呼び出すことができます。@ledsunさんはその後の世界のイメージを話してくれました。
まず、UNpkgのような仕組みの gem 版が必要になりそうです。これは、npm リポジトリで公開されているパッケージを CDN で取得する URL を返してくれる仕組みで、これの gem 版を用意することで gem をインストールしなくても様々な gem が使える世界になるだろうと語っていました。
「Ruby のプログラミングをもっと楽しくしていきたい」
発表の最後に、@ledsunさんの思いが語られます。Ruby でのブラウザのプログラミングを、JS と同じぐらい簡単にしていきたいと語っていました。Ruby のプログラミングをもっと楽しくしていき、wasm を通して一人でも多くの人にRuby の楽しさが伝わると良いなと語っていました。
感想
wasm は個人的に気になっている技術です。発表でサードパーティ製の gem が使えるようになるまでの道筋が語られていて、話を聞いていてワクワクしました!早く使えるようになっていじってみたいですね!