WebAssembly - Formato de Texto

WebAssembly possui o código em um formato binário denominado WASM. Você também pode obter o formato de texto em WebAssembly e é chamado WAT (WebAssembly Text format). Como desenvolvedor, você não deve escrever código no WebAssembly; em vez disso, você deve compilar linguagens de alto nível como C, C ++ e Rust para WebAssembly.

Código WAT

Vamos escrever o código WAT passo a passo.

Step 1 - O ponto de partida em um WAT é declarar o módulo.

(module)

Step 2 - Vamos agora adicionar alguma funcionalidade a ele na forma de função.

A função é declarada conforme mostrado abaixo -

(func <parameters/result> <local variables> <function body>)

A função começa com a palavra-chave func, seguida por parâmetros ou resultado.

Parâmetros / Resultado

Os parâmetros e o valor de retorno como resultado.

Os parâmetros podem ter o seguinte tipo compatível com o wasm -

  • i32: inteiro de 32 bits
  • i64: inteiro de 64 bits
  • f32: flutuação de 32 bits
  • f64: flutuação de 64 bits

Os parâmetros para as funções são escritos conforme abaixo -

  • (param i32)
  • (param i64)
  • (param f32)
  • (param f64)

O resultado será escrito da seguinte forma -

  • (resultado i32)
  • (resultado i64)
  • (resultado f32)
  • (resultado f64)

A função com parâmetros e valor de retorno será definida da seguinte forma -

(func (param i32) (param i32) (result i64) <function body>)

Variáveis ​​Locais

As variáveis ​​locais são aquelas de que você precisa em sua função. Um valor local para a função será definido da seguinte forma -

(func (param i32) (param i32) (local i32) (result i64) <function body>)

Corpo de Função

O corpo da função é a lógica a ser executada. O programa final será semelhante a este -

(module (func (param i32) (param i32) (local i32) (result i64) <function body>) )

Step 3 - Para ler e definir parâmetros e variáveis ​​locais.

Para ler os parâmetros e variáveis ​​locais, use get_local e set_local comando.

Example

(module 
   (func (param i32) (param i32) (local i32) (result i64) get_local 0 
      get_local 1 
      get_local 2 
   ) 
)

De acordo com a assinatura da função,

  • get_local 0 vai dar o param i32

  • get_local 1 dará o próximo parâmetro param i32

  • get_local 2 darei local value i32

Em vez de se referir aos parâmetros e locais usando valores numéricos como 0,1,2, você também pode usar o nome antes dos parâmetros, prefixando o nome com um cifrão.

O exemplo a seguir mostra como usar o nome com parâmetros e locais.

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 - Instrução no corpo e execução da função.

A execução no wasm segue a estratégia da pilha. As instruções executadas são enviadas uma a uma na pilha. Por exemplo, a instrução get_local $ a empurra o valor, ele lê na pilha.

A instrução gosta i32.add isso irá adicionar os elementos da pilha.

(func (param $a i32) (param $b i32) 
   get_local $a 
   get_local $b 
   i32.add
)

A instrução para i32.add é ($a+$b). O valor final de i32.add, será colocado na pilha e será atribuído ao resultado.

Se a assinatura da função tiver um resultado declarado, deve haver um valor na pilha no final da execução. Se não houver nenhum parâmetro de resultado, a pilha deve estar vazia no final.

Portanto, o código final junto com o corpo da função será o seguinte -

(module 
   (func (param $a i32) (param $b i32) (result i32) 
      get_local $a
      get_local $b 
      i32.add
   )
)

Step 5 - Fazendo chamada para a função.

O código final com o corpo da função é mostrado na etapa 4. Agora, para chamar a função, precisamos exportá-la.

Para exportar a função, isso pode ser feito com valores de índice como 0,1, mas também podemos fornecer nomes. O nome terá o prefixo $ e será adicionado após a palavra-chave func.

Example

(module 
   (func $add (param $a i32) (param $b i32) (result i32) 
      get_local $a 
      get_local $b i32.add
   ) 
)

A função $ add deve ser exportada, usando a palavra-chave export como mostrado abaixo -

(module 
   (func $add 
      (param $a i32) 
      (param $b i32) 
      (result i32) 
      get_local $a get_local $b i32.add
   ) 
   (export "add" (func $add))
)

Para testar o código acima no navegador, você terá que convertê-lo para a forma binária (.wasm). Consulte o próximo capítulo que mostra como converter.WAT to .WASM.