WebAssembly-テキスト形式
WebAssemblyには、WASMと呼ばれるバイナリ形式のコードがあります。WebAssemblyでテキスト形式を取得することもできます。これはWAT(WebAssemblyテキスト形式)と呼ばれます。開発者は、WebAssemblyでコードを作成することは想定されていません。代わりに、C、C ++、Rustなどの高級言語をWebAssemblyにコンパイルする必要があります。
WATコード
WATコードを段階的に記述してみましょう。
Step 1 − WATの開始点は、モジュールを宣言することです。
(module)
Step 2 −ここで、関数の形でいくつかの機能を追加しましょう。
関数は次のように宣言されます-
(func <parameters/result> <local variables> <function body>)
関数はfuncキーワードで始まり、その後にパラメーターまたは結果が続きます。
パラメータ/結果
結果としてのパラメータと戻り値。
パラメータは、wasm −でサポートされている次のタイプを持つことができます。
- i32:32ビット整数
- i64:64ビット整数
- f32:32ビットフロート
- f64:64ビット浮動小数点
関数のパラメータは次のように記述されます-
- (param i32)
- (param i64)
- (param f32)
- (param f64)
結果は次のようになります-
- (結果i32)
- (結果i64)
- (結果f32)
- (結果f64)
パラメータと戻り値を持つ関数は次のように定義されます-
(func (param i32) (param i32) (result i64) <function body>)
ローカル変数
ローカル変数は、関数で必要な変数です。関数のローカル値は次のように定義されます-
(func (param i32) (param i32) (local i32) (result i64) <function body>)
機能本体
関数本体は、実行されるロジックです。最終的なプログラムは次のようになります-
(module (func (param i32) (param i32) (local i32) (result i64) <function body>) )
Step 3 −パラメータとローカル変数を読み取って設定します。
パラメータとローカル変数を読み取るには、次を利用します get_local そして set_local コマンド。
Example
(module
(func (param i32) (param i32) (local i32) (result i64) get_local 0
get_local 1
get_local 2
)
)
関数シグネチャに従って、
get_local 0 与える param i32
get_local 1 次のパラメータを与えます param i32
get_local 2 あげる local value i32
0、1、2などの数値を使用してパラメーターとローカルを参照する代わりに、パラメーターの前に名前を使用して、名前の前にドル記号を付けることもできます。
次の例は、パラメータとローカルで名前を使用する方法を示しています。
Example
(module
(func
(param $a i32)
(param $b i32)
(local $c i32)
(result i64) get_local $a get_local $b get_local $c
)
)
Step 4 −関数本体と実行の命令。
wasmでの実行は、スタック戦略に従います。実行された命令は、スタック上で1つずつ送信されます。たとえば、命令get_local $ aは値をプッシュし、スタックで読み取ります。
のような命令 i32.add これにより、スタックから要素がポップされます。
(func (param $a i32) (param $b i32)
get_local $a
get_local $b
i32.add
)
の指示 i32.add です ($a+$b)。i32.addの最終値はスタックにプッシュされ、結果に割り当てられます。
関数シグニチャに結果が宣言されている場合、実行の最後にスタックに1つの値が存在する必要があります。結果パラメータがない場合、スタックは最後に空である必要があります。
したがって、関数本体を含む最終的なコードは次のようになります。
(module
(func (param $a i32) (param $b i32) (result i32)
get_local $a
get_local $b
i32.add
)
)
Step 5 −関数を呼び出します。
関数本体を含む最終的なコードは、手順4に示すとおりです。次に、関数を呼び出すために、関数をエクスポートする必要があります。
関数をエクスポートするには、0、1などのインデックス値を使用して実行できますが、名前を付けることもできます。名前の前には$が付き、funcキーワードの後に追加されます。
Example
(module
(func $add (param $a i32) (param $b i32) (result i32)
get_local $a
get_local $b i32.add
)
)
以下に示すように、exportキーワードを使用して、関数$ addをエクスポートする必要があります。
(module
(func $add
(param $a i32)
(param $b i32)
(result i32)
get_local $a get_local $b i32.add
)
(export "add" (func $add))
)
上記のコードをブラウザでテストするには、バイナリ形式(.wasm)に変換する必要があります。変換する方法を示す次の章を参照してください.WAT to .WASM.