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 example

Bytes 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 example
nn, 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