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.