WebAssembly - API JavaScript
Neste capítulo, vamos entender como carregar o código wasm e executá-lo no navegador usando a ajuda da API javascript webassembly.
Aqui estão algumas APIs importantes, que usaremos ao longo do tutorial para executar o código wasm.
- API de navegador fetch ()
- WebAssembly.compile
- WebAssembly.instance
- WebAssembly.instantiate
- WebAssembly.instantiateStreaming
Antes de discutirmos a API javascript do WebAssembly, para testar a API e a saída, vamos usar o seguinte programa C e o código .wasm gerado a partir do programa c usando o wasm explorer.
Um exemplo para o Programa C é o seguinte -
#include<stdio.h>
int square(int n) {
return n*n;
}
Faremos uso do WASM explorer, para obter o código do wasm -
Baixe o código WASM e use-o para testar o API.
API de navegador fetch ()
A API fetch () destina-se a carregar o recurso de rede .wasm.
<script>
var result = fetch("findsquare.wasm");
console.log(result);
</script>
Ele retorna uma promessa conforme mostrado abaixo -
Você também pode usar o método XMLHttpRequest para buscar o recurso de rede wasm.
WebAssembly.compile ()
A responsabilidade da api é compilar os detalhes do módulo buscados em .wasm.
Sintaxe
A sintaxe é a seguinte -
WebAssembly.compile(buffer);
Parâmetros
Buffer - Este código de .wasm deve ser convertido em um array digitado ou arraybuffer, antes de fornecer como entrada para compilar.
Valor de retorno
Ele retornará uma promessa de que terá o módulo compilado.
Exemplo
Vejamos um exemplo, que fornece a saída como um módulo compilado usando webAssembly.compile ().
<script>
fetch("findsquare.wasm") .then(bytes => bytes.arrayBuffer())
.then(mod => {
var compiledmod = WebAssembly.compile(mod);
compiledmod.then(test=> {
console.log(test);
})
})
</script>
Resultado
O console.log, quando verificado no navegador, fornecerá os detalhes do módulo compilado -
O módulo possui um objeto construtor com importações, exportações e customSections. Vamos ver a próxima API, para obter mais detalhes do módulo compilado.
WebAssembly.instance
Usando WebAssembly.instance, a API fornecerá a instância executável do módulo compilado que pode ser executado posteriormente para obter a saída.
Sintaxe
A sintaxe é a seguinte -
new WebAssembly.Instance(compiled module)
Valor de retorno
O valor de retorno será um objeto com a função de matriz de exportações que pode ser executada.
Exemplo
<script>
fetch("findsquare.wasm")
.then(bytes => bytes.arrayBuffer())
.then(mod => WebAssembly.compile(mod)).then(module => {
let instance = new WebAssembly.Instance(module);
console.log(instance);
})
</script>
Resultado
A saída nos dará uma matriz de funções de exportação, conforme mostrado abaixo -
Você pode ver a função quadrada, que obtivemos do código C que é compilado.
Para executar a função quadrada, você pode fazer o seguinte -
<script>
fetch("findsquare.wasm")
.then(bytes => bytes.arrayBuffer())
.then(mod => WebAssembly.compile(mod))
.then(module => {
let instance = new WebAssembly.Instance(module);
console.log(instance.exports.square(15));
})
</script>
A saída será -
225
WebAssembly.instantiate
Esta API se encarrega de compilar e instanciar o módulo junto.
Sintaxe
A sintaxe é a seguinte -
WebAssembly.instantiate(arraybuffer, importObject)
Parâmetros
arraybuffer - O código de .wasm deve ser convertido em array digitado ou arraybuffer antes de fornecer como entrada para instanciar.
importObject- O objeto de importação deve conter detalhes da memória, funções importadas para serem utilizadas dentro do módulo. Pode ser um objeto de módulo vazio, caso não haja nada a ser compartilhado.
Valor de retorno
Ele retornará uma promessa, que terá detalhes do módulo e da instância.
Exemplo
<script type="text/javascript">
const importObj = {
module: {}
};
fetch("findsquare.wasm")
.then(bytes => bytes.arrayBuffer())
.then(module => WebAssembly.instantiate(module, importObj))
.then(finalcode => {
console.log(finalcode); console.log(finalcode.instance.exports.square(25));
});
</script>
Resultado
Ao executar o código, você obterá a saída mencionada a seguir.
WebAssembly.instantiateStreaming
Essa API cuida da compilação e também da instanciação do módulo WebAssembly a partir do código .wasm fornecido.
Sintaxe
A sintaxe é a seguinte -
WebAssembly.instantiateStreaming(wasmcode, importObject);
Parâmetros
wasmcode - Resposta de busca ou qualquer outra API que forneça o código wasm e retorne uma promessa.
importObject- O objeto de importação deve conter detalhes da memória, funções importadas para serem utilizadas dentro do módulo. Pode ser um objeto de módulo vazio caso não haja nada a ser compartilhado.
Valor de retorno
Ele retornará uma promessa, que terá detalhes do módulo e da instância.
Exemplo
Um exemplo é discutido abaixo -
<script type="text/javascript">
const importObj = {
module: {}
};
WebAssembly.instantiateStreaming(fetch("findsquare.wasm"), importObj).then(obj => {
console.log(obj);
});
</script>
Ao testar no navegador, você verá um erro -
Para fazê-lo funcionar na extremidade do servidor, você terá que adicionar o tipo MIME application / wasm ou então usar WebAssembly.instantiate (arraybuffer, importObject).