WebAssembly - Estrutura do Programa
WebAssembly, também chamado de WASM, é um código de baixo nível em formato binário desenvolvido para ser executado dentro de navegadores da maneira mais eficiente. O código WebAssembly é estruturado com os seguintes conceitos -
- Values
- Types
- Instructions
Vamos aprendê-los em detalhes agora.
Valores
Os valores em WebAssembly destinam-se a armazenar dados complexos, como texto, strings e vetores. WebAssembly suporta o seguinte -
- Bytes
- Integers
- Ponto flutuante
- Names
Bytes
Bytes é a forma mais simples de valores com suporte no WebAssembly. O valor está em formato hexadecimal.
For exampleBytes representados como b , também podem receber números naturais n, onde n <256.
byte ::= 0x00| .... |0xFF
Inteiros
No WebAssembly, os inteiros suportados são os fornecidos abaixo -
- i32: inteiro de 32 bits
- i64: inteiro de 64 bits
Ponto flutuante
Em WebAssembly, os números de ponto flutuante suportados são os seguintes -
- f32: ponto flutuante de 32 bits
- f64: ponto flutuante de 64 bits
Nomes
Os nomes são sequências de caracteres, com valores escalares definidos por Unicode, que estão disponíveis no link http://www.unicode.org/versions/Unicode12.1.0/ dado aqui.
Tipos
As entidades em WebAssembly são classificadas como tipos. Os tipos suportados são os indicados abaixo -
- Tipos de valor
- Tipos de Resultado
- Tipos de Função
- Limits
- Tipos de memória
- Tipos de mesa
- Tipos Globais
- Tipos Externos
Vamos estudá-los um por um.
Tipos de valor
Os tipos de valores suportados pelo WebAssembly são mencionados abaixo -
- i32: inteiro de 32 bits
- i64: inteiro de 64 bits
- f32: ponto flutuante de 32 bits
- f64: ponto flutuante de 64 bits
valtype ::= i32|i64|f32|f64
Tipos de Resultado
Os valores escritos entre colchetes são executados e armazenados dentro dos tipos de resultado. O tipo de resultado é a saída da execução de um bloco de código composto de valores.
resulttype::=[valtype?]
Tipos de Função
Um tipo de função terá um vetor de parâmetros e retornará um vetor de resultados.
functype::=[vec(valtype)]--> [vec(valtype)]
Limites
Limites são o intervalo de armazenamento vinculado aos tipos de memória e tabela.
limits ::= {min u32, max u32}
Tipos de memória
Os tipos de memória lidam com memórias lineares e a faixa de tamanho.
memtype ::= limits
Tipos de mesa
Os tipos de tabela são classificados pelo tipo de elemento atribuído a ela.
tabletype ::= limits elemtype
elemtype ::= funcref
O tipo de tabela depende do limite de tamanho mínimo e máximo atribuído a ela.
Tipos Globais
Tipo global contém as variáveis globais que possuem o valor, que podem mudar ou permanecer as mesmas.
globaltype ::= mut valtype
mut ::= const|var
Tipos Externos
Tipos externos lidam com importações e valores externos.
externtype ::= func functype | table tabletype | mem memtype | global globaltype
Instruções
O código WebAssembly é uma sequência de instruções que segue um modelo de máquina de pilha. Como o WebAssembly segue um modelo de máquina de pilha, as instruções são colocadas na pilha.
Os valores do argumento para uma função, por exemplo, são retirados da pilha e o resultado é colocado de volta na pilha. No final, haverá apenas um valor na pilha e esse é o resultado.
Algumas das instruções comumente usadas são as seguintes -
- Instruções Numéricas
- Instruções Variáveis
Instruções Numéricas
As instruções numéricas são operações realizadas com base em valores numéricos.
For examplenn, mm ::= 32|64
ibinop ::= add|sub|mul|div_sx|rem_sx|and|or|xor
irelop ::= eq | ne | lt_sx | gt_sx | le_sx | ge_sx
frelop ::= eq | ne | lt | gt | le | ge
Instruções Variáveis
As instruções de variáveis são sobre como acessar as variáveis locais e globais.
For example
Para acessar variáveis locais -
get_local $a
get_local $b
Para set variáveis locais -
set_local $a
set_local $b
Para access variáveis globais -
get_global $a
get_global $b
Para set variáveis globais -
set_global $a
set_global $b