Node JS e 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 di WebAssembly dettaglia due formati di file, un formato binario chiamato WebAssembly Module con estensione .wasm
e una rappresentazione testuale corrispondente chiamata formato di testo WebAssembly con estensione .wat
.
Concetti chiave
- Module (Modulo): Un modulo WebAssembly compilato, ovvero un file
.wasm
. - Memory (Memoria): Un ArrayBuffer ridimensionabile.
- Table (Tabella): Un array tipizzato ridimensionabile di riferimenti non archiviati in memoria.
- Instance (Istanza): Un’istanza di un modulo con la sua memoria, tabella e variabili.
Per utilizzare WebAssembly, è necessario un file binario .wasm
e un insieme 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]
}
*/
Generare moduli WebAssembly
Esistono diversi metodi disponibili per generare file binari WebAssembly, tra cui:
- Scrivere WebAssembly (
.wat
) a mano e convertire nel formato binario usando strumenti come wabt. - Utilizzare emscripten con un’applicazione C/C++.
- Utilizzare wasm-pack con un’applicazione Rust.
- Utilizzare AssemblyScript se preferisci un’esperienza simile a TypeScript.
Alcuni di questi strumenti generano non solo il file binario, ma anche il codice “collante” JavaScript e i file HTML corrispondenti per eseguirli nel browser.
Come utilizzarlo
Una volta che hai un modulo WebAssembly, puoi utilizzare l’oggetto WebAssembly
di Node.js per istanziarlo.
// Supponiamo che esista un file add.wasm che contiene una singola funzione che somma 2 argomenti forniti
const fs = require("node:fs");
const wasmBuffer = fs.readFileSync("/percorso/di/add.wasm");
WebAssembly.instantiate(wasmBuffer).then((wasmModule) => {
// La funzione esportata è disponibile in instance.exports
const { add } = wasmModule.instance.exports;
const somma = add(5, 6);
console.log(somma); // 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.