Skip to content

Latest commit

 

History

History
71 lines (51 loc) · 3.21 KB

50.node_com_webassembly.md

File metadata and controls

71 lines (51 loc) · 3.21 KB

Node.js com WebAssembly

Índice

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.

Chaves de conceito

  • 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]
}
*/

Gerando Módulos WebAssembly

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.

Como usá-lo

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
});

Interagindo com o Sistema Operacional

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.

Fontes para consulta