WebAssemblyをターゲットにコンパイルする
WebAssemblyはブラウザの上で動作可能なバイナリフォーマットです。ネイティブコードと同様、大半の場合はコンパイラを使って作成します。
コンパイラを動かすアーキテクチャとは異なるCPUアーキテクチャ向けにバイナリを出力することがあります。これをクロスコンパイルと呼びます。クロスコンパイルの例の1つがiOS向けの開発です。コンパイラの動くMacBook ProのCPUアーキテクチャと、iPhoneのCPUアーキテクチャは異なります。それでもコンパイルを行うと、iPhone向けのバイナリファイルが出力されます。
クロスコンパイルをして得られるバイナリが動作するCPUアーキテクチャのことを、ターゲットアーキテクチャ、または略してターゲットと呼びます。先ほどのiOSアプリの例だと、ターゲットアーキテクチャはARM64、もしくはARM64eとなります。
WebAssemblyの開発も、iOSアプリと同様です。つまりソースコードを、WebAssemblyをターゲットとしてクロスコンパイルします。
wasm32とwasm64
使えるメモリのサイズ上限に応じて、WebAssemblyには2種類のアーキテクチャがあります。
アーキテクチャ | 上限メモリサイズ | メモリのインデックスサイズ |
---|---|---|
wasm32 | 4GiB | 32bit |
wasm64 | 1680万TiB | 64bit |
WebAssemblyでは、メモリを巨大なバイトの配列として扱います。特定の領域に値をメモリサイズの上限は、メモリにアクセスす
2018年末現在でwasm64に対応したコンパイラはありません。そのため、wasm32をターゲットとしてクロスコンパイルすることになります。
wasm32の特徴
wasm32の特徴は次の通りです。
- 1バイトは8ビット
- メモリのアクセスはバイト単位。アラインしてなくてもいい
- 32bitと64bitの符号付整数型が使える
- IEEE 754-2008の32ビット/64ビット浮動小数点
- バイトオーダはリトルエンディアン
- 32ビットのインデックスによるメモリアクセス
- 8ビット/16ビット/32ビットアクセスは、ロックフリーのアトミックな演算が可能