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 と相性が良い。

関連: _moc-systems / virtualization-hypervisor