📢 Nuovo Corso Bootstrap Completo disponibile!

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.