仕様
WebAssemblyのバイナリファイルはModuleと呼ばれます。 Modules — WebAssembly 2.0 (Draft 2023-07-24) に仕様があります。
- プリアンブル
- セクション
に分かれています。セクションは空でも良いです。 つまり、最小限の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ビット整数です。
バイナリファイルを書く
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/ を開きます。
開発コンソールを開きます。
無事WebAssemblyモジュールとして認識されました。
不正な場合は?
もしかすると何もチェックされていないかもしれません。 間違ったWebAssemblyモジュールも試してみます。