- Chaves de conceito
- Gerando Módulos WebAssembly
- Como usá-lo
- Interagindo com o SO
- Fontes para recursos
WebAssembly é uma linguagem semelhante a assembly de alto desempenho que pode ser compilado a partir de uma infinida de linguagens, incluindo C/C++, Rust e AssemblyScript. A partir de agora, é suportado pelo Chrome, Firefox, Safari, Edge e Node.js!
A especificação WebAssembly detalha dois formatos de arquivo, um formato binário chamado Módulo WebAssembly com uma extensão .wasm
e uma representação de texto correspondente chamado Formato de texto WebAssembly com uma extensão .wat
.
- Módulo - Um binário WebAssembly compilado, ou seja, um arquivo
.wasm
. - Memória - Um ArrayBuffer redimensionável.
- Tabela - Uma matriz tipada redimensionável de referências não armazenadas na memória.
- Instância - Uma instanciação de um módulo com sua memória, tabela e variáveis.
Para usar o WebAssembly, você precisa de um arquivo binário .wasm
e um conjunto de APIs para se comunicar com o WebAssembly. O Node.js fornece as APIs necessárias por meio do objeto WebAssembly global.
console.log(WebAssembly);
/*
Object [WebAssembly] {
compile: [Function: compile],
validate: [Function: validate],
instantiate: [Function: instantiate]
}
*/
Existem vários métodos disponíveis para gerar arquivos binários do WebAssembly, incluindo:
- Escrevendo um WebAssembly (
.wat
) manualmente e convertendo para formato binário usando ferramentas como wabt. - Usando emscripten com um aplicativo C/C++.
- Usando wasm-pack com um aplicativo Rust.
- Usando AssemblyScript se você preferir uma experiência semelhante ao TypeScript.
Algumas dessas ferramentas geram não apenas o arquivo binário, mas o código JavaScript "glue" e os arquivos HTML correspondentes para serem executados no navegador.
Depois de ter um módulo WebAssembly, você pode usar o objeto WebAssembly
Node.js para instanciá-lo.
// Suponha que exista um arquivo add.wasm que contém uma única função adicionando 2 argumentos fornecidos.
const fs = require('fs');
const wasmBuffer = fs.readFileSync('/path/to/add.wasm');
WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
// função exportada ao vivo em instance.exports
const { add } = wasmModule.instance.exports;
const sum = add(5, 6);
console.log(sum); // Outputs: 11
});
Os módulos WebAssembly não podem acessar diretamente a funcionalidade do sistema operacional por conta própria. Uma ferramenta de terceiros Wasmtime pode ser usada para acessar essa funcionalidade. Wasmtime
utiliza a API WASI para acessar a funcionalidade do sistema operacional.