考察(ホスト側プログラム)
で、ここからはホスト側プログラムの話。 Lua は歴史があるだけあって(?) 各言語でバインディングのライブラリが結構豊富にあるし、テーブルがあるので階層があったりする構造も比較的渡しやすい。mlua も然り
2020-11-14 13:51:35一方 WASM は [if](32|64) ぐらいしかホスト側と直接やりとりできるデータが(今のところ)ない。 externref というのもあるにはあるけど、あれは opaque type としてしか扱えないので、中身を WASM で直接いじくりたい(e.g. 数値計算)場合には不向きっぽいし、Interface Types はまだ Proposal
2020-11-14 13:54:12そのかわり、ホスト側で登録した関数からは WASM 側の memory (ヒープみたいな領域)にアクセスできるので、そこと read/write すればバイト列はやりとりできる。この時渡すべきパラメーターは offset, length で、よくある C 言語の配列操作みたいな感じ
2020-11-14 13:56:09まあでもこれ Rust から操作すると unsafe は避けられない感じがする。今回はこういう感じのグルーを作って楽をした pic.twitter.com/4WGvVDCfJt
2020-11-14 13:57:57unsafe だとしても memcpy で任意のデータをやりとりできるので、最悪 msgpack のバイト列でもコピーすればいい。今回みたいに 24MiB を 2 回コピーしても致命的なほど遅くはならなかったので。
2020-11-14 13:59:15そしたら後は Rust で serde with no_std でもすればどうとでもなるだろうし、実際 kbS3 の Playground はどうにかなってる(あの WASM バイナリには regex, serde, serde_json などの外部依存が含まれている)
2020-11-14 14:00:39と、まあこんな感じかな。wasm-bindgen はもうかなり便利だけど、あれのベアメタル版があったら化けるなあと思った(もうあるのかな)。
2020-11-14 14:01:29