WebAssembly
wasm

コンパイルターゲットとしてのWebAssembly


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ビットアクセスは、ロックフリーのアトミックな演算が可能