@ledsun blog

無味の味は佳境に入らざればすなわち知れず

最小限のWebAssemblyのバイナリファイルを書く

仕様

WebAssemblyのバイナリファイルはModuleと呼ばれます。 Modules — WebAssembly 2.0 (Draft 2023-07-24) に仕様があります。

  1. プリアンブル
  2. セクション

に分かれています。セクションは空でも良いです。 つまり、最小限のWebAssemblyモジュールはプリアンブルだけあればよいです。

WebAssemblyモジュールのプリアンブル

プリアンブルは0x00 0x61 0x73 0x6D 0x01 0x00 0x00 0x00の8バイトです。 これは前半の0x00 0x61 0x73 0x6DがASCIIのasmです。 後半の0x01 0x00 0x00 0x00はWebAssemblyモジュールのバージョンを表す1です。 1が1バイト目にあるのでリトルエンディアンの32ビット整数です。

バイナリファイルを書く

次のRubyスクリプトで書き出せます。

File.open("preamble.wasm", "wb") do
  _1.write [0].pack('C')          # 0x00
  _1.write 'asm'.bytes.pack('C3') # 0x61 0x73 0x6d
  _1.write [1].pack('I<')         # 0x01 0x00 0x00 0x00
end

hexdumpコマンドで確認してみます。

hexdump -C preamble.wasm
00000000  00 61 73 6d 01 00 00 00                           |.asm....|
00000008

良い感じに出来てそうです。

動作確認

WebAssemblyモジュールとして読み込めるか試してみます。 次のHTMLファイルを用意します。

<html>
  <title>Load wasm preamble</title>
  <script>
    fetch('./preamble.wasm')
      .then(response => response.arrayBuffer())
      .then(buffer => WebAssembly.compile(buffer))
      .then(module => console.log(module));
  </script>
</html>

作ったバイナリファイルを読み込んでWebAssembly.compileします。

ruby -run -e httpd .でHTTPサーバーを起動します。 ブラウザで http://localhost:8080/ を開きます。 開発コンソールを開きます。

開発コンソールのModuleと出力される

無事WebAssemblyモジュールとして認識されました。

不正な場合は?

もしかすると何もチェックされていないかもしれません。 間違ったWebAssemblyモジュールも試してみます。

asmじゃなくてackだったら

マジックワードが不正なWebAssemblyモジュールを読み込ませると

バージョンが2

バージョンにWebAssemblyモジュールを読み込ませると