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
.
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.
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.