これは WebAssembly Advent Calendar 2022 の 9 日目の記事です。*1
RubyKaigi 2022 で ruby.wasm の話を聴いてから、いろいろと触っていたのですが、意外と cygwin native な wasm 実行環境でも動かせたため、手順をまとめます。
ruby.wasm
ruby.wasm 自体は README に書いてあるとおりにすれば、自前アプリ (& ライブラリ) 込みの wasm を作成できます。
作成した wasm がきちんと動くかを wasmtime (brew でインストール可能) で確認します。
$ uname -mrs Darwin 22.1.0 x86_64 $ wasmtime --version wasmtime-cli 3.0.1 $ wasmtime ./myruby.wasm -- -v ruby 3.2.0dev (2022-12-07T12:27:36Z master f725bf358a) [wasm32-wasi]
wasm 実行環境 on cygwin
cygwin で動く wasm 実行環境として wasm3 を用意することにしました。*2
ちなみに依存関係として wasm3 -> uvwasi -> libuv
が必要ですが、libuv は cygwin 公式パッケージがあり、wasm3 と uvwasi はそれらを使って、とりあえずビルドできるようにはしました。
$ uname -mrs CYGWIN_NT-10.0-19044 3.4.0-1.x86_64 x86_64 $ /usr/bin/wasm3 --version Wasm3 v0.5.0 on x86_64 Build: Sep 9 2022 21:58:18, GCC 11.3.0 $ file /usr/bin/wasm3.exe /usr/bin/wasm3.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows $ ldd /usr/bin/wasm3.exe ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffd858f0000) KERNEL32.DLL => /cygdrive/c/WINDOWS/System32/KERNEL32.DLL (0x7ffd84720000) KERNELBASE.dll => /cygdrive/c/WINDOWS/System32/KERNELBASE.dll (0x7ffd82ff0000) cygwin1.dll => /usr/bin/cygwin1.dll (0x7ffd54f30000) cyguvwasi-0.dll => /usr/bin/cyguvwasi-0.dll (0x3674c0000) cyguv-1.dll => /usr/bin/cyguv-1.dll (0x3674e0000) $ /usr/bin/wasm3 ./myruby.wasm --version ruby 3.2.0dev (2022-12-07T12:27:36Z master f725bf358a) [wasm32-wasi]
version 表示は別にライブラリを同梱していなくてもできるため、ライブラリをきちんと参照できるかどうかも確認してみました。
まとめ
意外と動く。(ただし実行はまだまだ遅いです。)