WebAssembly - Estructura del programa

WebAssembly, también llamado WASM, es un código de bajo nivel en formato binario desarrollado para ser ejecutado dentro de los navegadores de la manera más eficiente. El código de WebAssembly está estructurado con los siguientes conceptos:

  • Values
  • Types
  • Instructions

Aprendamos ahora en detalle.

Valores

Los valores en WebAssembly están destinados a almacenar datos complejos como texto, cadenas y vectores. WebAssembly admite lo siguiente:

  • Bytes
  • Integers
  • Punto flotante
  • Names

Bytes

Bytes es la forma más simple de valores admitida en WebAssembly. El valor está en formato hexadecimal.

For example

Los bytes representados como b también pueden tomar números naturales n, donde n <256.

byte ::= 0x00| .... |0xFF

Enteros

En WebAssembly, los números enteros admitidos son los que se indican a continuación:

  • i32: entero de 32 bits
  • i64: entero de 64 bits

Punto flotante

En WebAssembly, los números de punto flotante admitidos son los siguientes:

  • f32: punto flotante de 32 bits
  • f64: punto flotante de 64 bits

Nombres

Los nombres son una secuencia de caracteres, con valores escalares definidos por Unicode, que está disponible en el enlace http://www.unicode.org/versions/Unicode12.1.0/ adjunto.

Tipos

Las entidades en WebAssembly se clasifican como tipos. Los tipos admitidos son los que se indican a continuación:

  • Tipos de valor
  • Tipos de resultados
  • Tipos de funciones
  • Limits
  • Tipos de memoria
  • Tipos de tablas
  • Tipos globales
  • Tipos externos

Estudiémoslos uno por uno.

Tipos de valor

Los tipos de valores admitidos por WebAssembly son los que se mencionan a continuación:

  • i32: entero de 32 bits
  • i64: entero de 64 bits
  • f32: punto flotante de 32 bits
  • f64: punto flotante de 64 bits
valtype ::= i32|i64|f32|f64

Tipos de resultados

Los valores escritos entre corchetes se ejecutan y almacenan dentro de los tipos de resultados. El tipo de resultado es la salida de la ejecución de un bloque de código compuesto por valores.

resulttype::=[valtype?]

Tipos de funciones

Un tipo de función tomará un vector de parámetros y devuelve un vector de resultados.

functype::=[vec(valtype)]--> [vec(valtype)]

Limites

Los límites son el rango de almacenamiento vinculado con la memoria y los tipos de tabla.

limits ::= {min u32, max u32}

Tipos de memoria

Los tipos de memoria tratan con memorias lineales y el rango de tamaño.

memtype ::= limits

Tipos de tablas

Los tipos de tabla se clasifican por el tipo de elemento que se le asigna.

tabletype ::= limits elemtype
elemtype ::= funcref

El tipo de tabla depende del límite para el tamaño mínimo y máximo asignado.

Tipos globales

El tipo global contiene las variables globales que tienen el valor, que pueden cambiar o permanecer igual.

globaltype ::= mut valtype
mut ::= const|var

Tipos externos

Tipos externos se ocupa de las importaciones y los valores externos.

externtype ::= func functype | table tabletype | mem memtype | global globaltype

Instrucciones

El código de WebAssembly es una secuencia de instrucciones que sigue un modelo de máquina apiladora. Como WebAssembly sigue un modelo de máquina apiladora, las instrucciones se insertan en la pila.

Los valores de los argumentos para una función, por ejemplo, se extraen de la pila y el resultado se devuelve a la pila. Al final, solo habrá un valor en la pila y ese es el resultado.

Algunas de las instrucciones de uso común son las siguientes:

  • Instrucciones numéricas
  • Instrucciones variables

Instrucciones numéricas

Las instrucciones numéricas son operaciones que se realizan con un valor numérico.

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

Instrucciones variables

Las instrucciones de variables tratan sobre el acceso a las variables locales y globales.

For example

Para acceder a las variables locales:

get_local $a
get_local $b

A set variables locales -

set_local $a
set_local $b

A access variables globales -

get_global $a
get_global $b

A set variables globales -

set_global $a
set_global $b