WebAssembly - Formato de texto
WebAssembly tiene el código en formato binario llamado WASM. También puede obtener el formato de texto en WebAssembly y se llama WAT (formato de texto de WebAssembly). Como desarrollador, no se supone que debe escribir código en WebAssembly, sino que debe compilar lenguajes de alto nivel como C, C ++ y Rust en WebAssembly.
Código WAT
Escribamos el código WAT paso a paso.
Step 1 - El punto de partida en un WAT es declarar el módulo.
(module)
Step 2 - Ahora, agreguemos alguna funcionalidad en forma de función.
La función se declara como se muestra a continuación:
(func <parameters/result> <local variables> <function body>)
La función comienza con la palabra clave func seguida de parámetros o resultado.
Parámetros / Resultado
Los parámetros y el valor de retorno como resultado.
Los parámetros pueden tener el siguiente tipo admitido por wasm:
- i32: entero de 32 bits
- i64: entero de 64 bits
- f32: flotante de 32 bits
- f64: flotante de 64 bits
Los parámetros para las funciones se escriben como se indica a continuación:
- (parámetro i32)
- (parámetro i64)
- (parámetro f32)
- (parámetro f64)
El resultado se escribirá de la siguiente manera:
- (resultado i32)
- (resultado i64)
- (resultado f32)
- (resultado f64)
La función con parámetros y valor de retorno se definirá de la siguiente manera:
(func (param i32) (param i32) (result i64) <function body>)
Variables locales
Las variables locales son las que necesitas en tu función. Un valor local para la función se definirá de la siguiente manera:
(func (param i32) (param i32) (local i32) (result i64) <function body>)
Función Cuerpo
El cuerpo de la función es la lógica a realizar. El programa final se verá así:
(module (func (param i32) (param i32) (local i32) (result i64) <function body>) )
Step 3 - Leer y configurar parámetros y variables locales.
Para leer los parámetros y las variables locales, utilice get_local y set_local mando.
Example
(module
(func (param i32) (param i32) (local i32) (result i64) get_local 0
get_local 1
get_local 2
)
)
Según la firma de la función,
get_local 0 dará el param i32
get_local 1 dará el siguiente parámetro param i32
get_local 2 daré local value i32
En lugar de referirse a los parámetros y locales usando valores numéricos como 0,1,2, también puede usar el nombre antes de los parámetros, prefijando el nombre con un signo de dólar.
El siguiente ejemplo muestra cómo usar el nombre con parámetros y locales.
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 - Instrucción en el cuerpo de la función y ejecución.
La ejecución en wasm sigue la estrategia de pila. Las instrucciones ejecutadas se envían una a una en la pila. Por ejemplo, la instrucción get_local $ a empujará el valor, se lee en la pila.
La instrucción como i32.add que agregará los elementos de la pila.
(func (param $a i32) (param $b i32)
get_local $a
get_local $b
i32.add
)
La instrucción para i32.add es ($a+$b). El valor final de i32.add se colocará en la pila y se asignará al resultado.
Si la firma de la función tiene un resultado declarado, debe haber un valor en la pila al final de la ejecución. Si no hay un parámetro de resultado, la pila debe estar vacía al final.
Entonces, el código final junto con el cuerpo de la función será el siguiente:
(module
(func (param $a i32) (param $b i32) (result i32)
get_local $a
get_local $b
i32.add
)
)
Step 5 - Realización de llamada a la función.
El código final con el cuerpo de la función es como se muestra en el paso 4. Ahora, para llamar a la función, necesitamos exportarla.
Para exportar la función, se puede hacer con valores de índice como 0,1, pero también podemos dar nombres. El nombre tendrá el prefijo $ y se agregará después de la palabra clave func.
Example
(module
(func $add (param $a i32) (param $b i32) (result i32)
get_local $a
get_local $b i32.add
)
)
La función $ add debe exportarse, usando la palabra clave export como se muestra a continuación:
(module
(func $add
(param $a i32)
(param $b i32)
(result i32)
get_local $a get_local $b i32.add
)
(export "add" (func $add))
)
Para probar el código anterior en el navegador, deberá convertirlo en formato binario (.wasm). Consulte el siguiente capítulo que muestra cómo convertir.WAT to .WASM.