Skip to content

Node.js con WebAssembly

WebAssembly è un linguaggio di tipo assembly ad alte prestazioni che può essere compilato da vari linguaggi, tra cui C/C++, Rust e AssemblyScript. Attualmente è supportato da Chrome, Firefox, Safari, Edge e Node.js!

La specifica WebAssembly descrive due formati di file, un formato binario chiamato modulo WebAssembly con estensione .wasm e una corrispondente rappresentazione testuale chiamata formato testo WebAssembly con estensione .wat.

Concetti chiave

  • Modulo - Un binario WebAssembly compilato, ovvero un file .wasm.
  • Memoria - Un ArrayBuffer ridimensionabile.
  • Tabella - Una typed array ridimensionabile di riferimenti non memorizzati nella Memoria.
  • Istanza - Un'istanza di un Modulo con la sua Memoria, Tabella e variabili.

Per utilizzare WebAssembly, è necessario un file binario .wasm e un set di API per comunicare con WebAssembly. Node.js fornisce le API necessarie tramite l'oggetto globale WebAssembly.

javascript
console.log(WebAssembly)
/*
Object [WebAssembly] {
  compile: [Function: compile],
  validate: [Function: validate],
  instantiate: [Function: instantiate]
}
*/

Generazione di moduli WebAssembly

Sono disponibili diversi metodi per generare file binari WebAssembly, tra cui:

  • Scrivere WebAssembly (.wat) manualmente e convertire in formato binario utilizzando strumenti come wabt.
  • Utilizzare emscripten con un'applicazione C/C++
  • Utilizzare wasm-pack con un'applicazione Rust
  • Utilizzare AssemblyScript se si preferisce un'esperienza simile a TypeScript

TIP

Alcuni di questi strumenti generano non solo il file binario, ma anche il codice "glue" JavaScript e i corrispondenti file HTML per l'esecuzione nel browser.

Come utilizzarlo

Una volta ottenuto un modulo WebAssembly, è possibile utilizzare l'oggetto WebAssembly di Node.js per istanziarlo.

javascript
const fs = require('node:fs')
const wasmBuffer = fs.readFileSync('/path/to/add.wasm')
WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
  // Le funzioni esportate si trovano in instance.exports
  const { add } = wasmModule.instance.exports
  const sum = add(5, 6)
  console.log(sum) // Output: 11
})

Interazione con il Sistema Operativo

I moduli WebAssembly non possono accedere direttamente alle funzionalità del sistema operativo autonomamente. Uno strumento di terze parti, Wasmtime, può essere utilizzato per accedere a queste funzionalità. Wasmtime utilizza l'API WASI per accedere alle funzionalità del sistema operativo.

Risorse