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)を使うと、wat2wasmwasm2watでテキスト・バイナリ形式を変換できる
    • リファレンス実装という感じかも
    • wasm-toolsの下位互換かなあ
  • wasm-toolsはなんでもできる
    • Wasmのパースに wasmparser を使っている
      • wasm-tools/crates 下にあるが単独でもcrateとして公開されている
    • wasm-tools dump : Wasmバイナリをセクションごとに見れる
    • wasm-tools parse text.watwat2wasmと同じ、テキスト形式をバイナリ形式にして出力
    • wasm-tools print bin.wasmwasm2watと同じ、バイナリ形式をテキスト形式にして出力
      • -oオプションで出力ファイルを指定しないと標準出力に表示される
      • 色が付いていて、うれしい!!