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.