Wasmともいう(公式サイトに “abbreviated Wasm” と書いてある)
Webブラウザ等で動くバイナリ形式
- spec
- バイナリ形式とテキスト形式(WAT)がある
(module (func (param i32 i32) (result i32) local.get 0 local.get 1 drop ) (func (export "_start") (result i32) i32.const 2 i32.const 5 call 0 ) ) - Wasmはスタックマシンとして表現されるVMの上で実行される
- 上の例だと、
i32.const命令でスタックに2と5を積む→それらを引数として上にある関数を呼ぶ→local.get命令で2つの引数を取り出してスタックに積む→片方をdropでスタックから消す→最後に残った1つの要素を関数の戻り値(result i32)とする
- 上の例だと、
- WASIというインタフェースが策定されており、ソケットやI/Oを扱う場合はこれに従うと良いとされている
ツール群
wabt(WebAssembly Binary Tool)を使うと、wat2wasmやwasm2watでテキスト・バイナリ形式を変換できる- リファレンス実装という感じかも
wasm-toolsの下位互換かなあ
wasm-toolsはなんでもできる- Wasmのパースに wasmparser を使っている
wasm-tools/crates下にあるが単独でもcrateとして公開されている
wasm-tools dump: Wasmバイナリをセクションごとに見れるwasm-tools parse text.wat:wat2wasmと同じ、テキスト形式をバイナリ形式にして出力wasm-tools print bin.wasm:wasm2watと同じ、バイナリ形式をテキスト形式にして出力-oオプションで出力ファイルを指定しないと標準出力に表示される- 色が付いていて、うれしい!!
- Wasmのパースに wasmparser を使っている