Sun Dec 27 2020

cumin/wasm, try-cumin-online

cumin を wasm にビルドして web ページの上で遊べるようにした.

wasm にビルド出来るようにした変更はこれ:

実際の変更はかなり小さくて, Cargo.toml にちょっと設定増やして, wasm-pack build を叩くようにするだけ. ビルド時にブラウザで読めるような wasm を生成するために --target no-modules が必要. ある文書によればこれは古い方法で --target web で生成するらしいけど, それで生成する wasm をブラウザで読む方法が分からなかった. wasm 周りで一番大変だったのが, ブラウザ上でロードする部分. さて wasm-pack したら ./pkg 以下に出来る wasm ファイルが欲しかった wasm ファイル本体.

非本質的な変更として. wasm にエクスポートするインターフェイスとなる関数は原始的な型しか扱えない. 例えば Result 型なんてもってのほかで, タプルなんかを返り値にする関数をそのままエクスポートできない. (自分で IntoWasmAbi トレイトを実装すればこの限りではないが.) 今はものすごく簡単に, Fn(&str) -> String な関数一個をエクスポートしている. Cumin コードを受け取ったら JSON をシリアライズした文字列を返す. これは失敗し得る処理なのでエラーも返せないといけないんだけど, JSON 文字列が返ってきたら成功で, JSON 文字列でなかったら失敗時のエラーメッセージになっていることとしている(!). また元の eval ではファイルシステムを扱う. なぜなら use 文でファイルを参照して読み込むような機構が用意してあるからだ. ブラウザで動く wasm は当然ファイルシステムを持たない. これをビルドしようとしたら静かに失敗してしまった. 応急的な処置として, eval からファイルシステムを抜いただけの eval_wasm を新たに生やした.

wasm を読む web ページの例はこれ:

wasm-pack で生成した pkg フォルダごと丸々コピーして置いちゃってる. これの index.htmlwasm_bindgen 云々が本質.

この web ページは次のURLから実際にアクセスできる:

URL の hash 部分 (#...) に Cumin コードを埋め込むことが出来るようにしておいた. Cumin のドキュメントの端々にコードを埋め込んだリンクを置いておけば, すぐにそれを実行することが出来て便利じゃないかと思っている.

こんな感じ: