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 exampleLos 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 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
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