汎用プラグインとしての WASM (WebAssembly) の可能性の模索 with LuaJIT 対決

昨日 WASM で色々実験していたのでその記録。もうちょっと型が強くなれば化けそう。
7

考察(ホスト側プログラム)

ロングもみあげガール推進部 @kb10uy

で、ここからはホスト側プログラムの話Lua は歴史があるだけあって(?) 各言語でバインディングのライブラリが結構豊富にあるし、テーブルがあるので階層があったりする構造も比較的渡しやすい。mlua も然り

2020-11-14 13:51:35
ロングもみあげガール推進部 @kb10uy

一方 WASM [if](32|64) ぐらいしかホスト側と直接やりとりできるデータが(今のところ)ない。 externref というのもあるにはあるけど、あれは opaque type としてしか扱えないので、中身を WASM で直接いじくりたい(e.g. 数値計算)場合には不向きっぽいし、Interface Types はまだ Proposal

2020-11-14 13:54:12
ロングもみあげガール推進部 @kb10uy

そのかわり、ホスト側で登録した関数からは WASM 側の memory (ヒープみたいな領域)にアクセスできるので、そこと read/write すればバイト列はやりとりできる。この時渡すべきパラメーターは offset, length で、よくある C 言語の配列操作みたいな感じ

2020-11-14 13:56:09
ロングもみあげガール推進部 @kb10uy

まあでもこれ Rust から操作すると unsafe は避けられない感じがする。今回はこういう感じのグルーを作って楽をした pic.twitter.com/4WGvVDCfJt

2020-11-14 13:57:57
拡大
拡大
ロングもみあげガール推進部 @kb10uy

unsafe だとしても memcpy で任意のデータをやりとりできるので、最悪 msgpack のバイト列でもコピーすればいい。今回みたいに 24MiB を 2 回コピーしても致命的なほど遅くはならなかったので。

2020-11-14 13:59:15
ロングもみあげガール推進部 @kb10uy

そしたら後は Rust で serde with no_std でもすればどうとでもなるだろうし、実際 kbS3 の Playground はどうにかなってる(あの WASM バイナリには regex, serde, serde_json などの外部依存が含まれている)

2020-11-14 14:00:39
ロングもみあげガール推進部 @kb10uy

と、まあこんな感じかな。wasm-bindgen はもうかなり便利だけど、あれのベアメタル版があったら化けるなあと思った(もうあるのかな)。

2020-11-14 14:01:29