Node.js con WebAssembly
WebAssembly è un linguaggio simile all'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 in dettaglio due formati di file, un formato binario chiamato Modulo WebAssembly con estensione .wasm
e la corrispondente rappresentazione testuale chiamata formato testo WebAssembly con estensione .wat
.
Concetti chiave
- Module - Un binario WebAssembly compilato, ad esempio un file
.wasm
. - Memory - Un ArrayBuffer ridimensionabile.
- Table - Un array tipizzato ridimensionabile di riferimenti non memorizzati in Memory.
- Instance - Un'istanza di un Modulo con la sua Memory, Table 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
.
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
) a mano e convertire in formato binario utilizzando strumenti come wabt. - Utilizzo di emscripten con un'applicazione C/C++
- Utilizzo di wasm-pack con un'applicazione Rust
- Utilizzo di AssemblyScript se preferisci 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 usarlo
Una volta che hai un modulo WebAssembly, puoi utilizzare l'oggetto WebAssembly
di Node.js per istanziarlo.
const fs = require('node:fs')
const wasmBuffer = fs.readFileSync('/path/to/add.wasm')
WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
// La funzione esportata risiede 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 da soli. Uno strumento di terze parti, Wasmtime, può essere utilizzato per accedere a questa funzionalità. Wasmtime
utilizza l'API WASI per accedere alle funzionalità del sistema operativo.