Avevo già parlato di Emscripten, con un esempio che converte un programma in C, in Node.js e lo esegue a terminale. Vediamo oggi WebAssembly, uno standard complicato ma efficiente (avevo fatto solo un piccolo accenno qui), che converte in binario il precedente codice, rendendolo disponibile per una pagina web, lato client (in modo molto più efficiente rispetto a JavaScript). La procedura è complicata e ha senso usarla solo quando sono richieste operazioni molto complesse, che richiedono un grande impiego di risorse computazionali (guarda caso, non lo usa quasi nessuno 😅 ); anche la manutenzione e modifica del codice non è per niente semplice, rispetto agli altri linguaggi. Vediamo comunque un bell'esempio 🙂
Da C a WebAssembly, come procedere step by step
Per prima cosa dobbiamo avere un software come Emscripten (sito ufficiale), disponibile multipiattaforma e per Linux Debian-based possiamo installare anche semplicemente con sudo apt install emscripten
. Ora siamo pronti:
- abbiamo il nostro file C, ad esempio nomefile.c
- da terminale, dobbiamo compilare questo file con il seguente comando:
emcc nomefile.c -o nomefile.html
(NB: se invece scriviamo solamente emcc nomefile.c
verrà generato un file disponibile per Node.js chiamato a.out.js che, se abbiamo installato Node.js da terminale possiamo lanciare con il comando node a.out.js
, ma stiamo parlando di una cosa diversa)
- vengono generati dei file che dobbiamo mantenere (nomefile.wasm è il file WebAssembly, che verrà caricato da nomefile.html, la pagina HTML che poi noi apriamo semplicemente con il browser)
- politiche CORS: come già spiegato nella discussione Web 3D, per questioni di "sicurezza" potrebbero esserci dei blocchi all'esecuzione di codice di questo tipo, quindi occorre una procedura per risolvere questo limite (es. tramite un'apposita estensione); per semplicità io ho risolto prima creando un Local Server ovvero
python3 -m server.http
dalla directory dove sono salvati questi file, poi da browser andiamo su localhost:8000 come URL e compaiono i file della nostra cartella, avviamo nomefile.html ed è fatta! 🙂
Come esempio, avevo fatto girare un codice di ProjectEuler n.205 (simile a ProjectEuler n.232 di cui avevo già parlato). I dettagli non importano, sta di fatto che in termini di efficienza computazionale questo codice eseguito all'interno del browser è ineguagliabile rispetto ad un tradizionale codice JavaScript.
Vediamo infine qualche immagine, screenshot per vedere un po' tutta la procedura (come si vede l'efficienza è davvero molto buona, si avvicina al linguaggio C come prestazioni e per essere eseguito nel browser è ottimo! JavaScript può risultare anche 4-5 volte più lento di C, in programmi complessi la cosa diventa rilevante).
Conoscevate WebAssembly? 🙂
