WebAssembly (Wasm / WASI)
ブラウザおよびブラウザ外で動く、ポータブルでセキュアなバイナリ命令フォーマットと実行環境。
構成
- Wasm = Core + JS API + Web API。ブラウザでは V8 等が実行する。
- WASI(ワジ) = Core + WASI API の仕様。ブラウザ以外で Wasm を動かすための、POSIXに似たシステムインターフェース。ホワイトリストでアクセス可能なディレクトリを指定する(ケイパビリティベース、linux 由来のFFIは難)。
- ランタイム: wasmer、wasmtime(Bytecode Alliance のリファレンス実装)、純Go の wazero、Erlang 風の非同期ランタイム Lunatic など。
セキュリティと設計思想
- セキュアであることが目的で、組み込み関数を持たず DOM を直接操作するAPIは実装されない方針(参照型でDOM操作の壁は下がってきた)。
- 線形メモリモデルを持ち、GC は提案段階(GC Proposal、実験言語 Waml)。
- 複数インスタンスを安易に混ぜると危険な場合がある。
位置づけ
- 「Wasm/WASI が2008年にあれば Docker は要らなかった」(Solomon Hykes)とされ、言語差を吸収するポータビリティ層として virtualization-hypervisor のコンテナと対比される。
- Envoy proxy のプラグイン(Proxy-Wasm)、CDN エッジ、サーバーレスで利用。パッケージは WAPM や warg(レジストリプロトコル)。
- Rust→Wasm は wasm-bindgen / wasm-pack で行い、rust-lang と相性が良い。