WebAssembly: che cos’è e quali sono i vantaggi
Nel corso degli ultimi decenni, internet è divenuta una risorsa indispensabile per la nostra vita quotidiana: ha trasformato il modo in cui lavoriamo, comunichiamo, giochiamo e socializziamo. La maggior parte di queste operazioni sono eseguite grazie all’utilizzo di Web browser. Nel corso del tempo, i browser sono diventati il terreno fertile per applicazioni sempre più complesse, consentendo operazioni come la manipolazione di tracce audio o video, transazioni finanziarie sicure e persino lo sviluppo di sofisticati giochi online. Il numero di applicazioni web è cresciuto esponenzialmente, abbracciando sia i dispositivi desktop che quelli mobili.
JavaScript (JS) è “un linguaggio di scripting lato client utilizzato per rendere interattive le pagine web”. Per più di due decenni, JavaScript è stato lo standard de facto per il linguaggio web di scripting, quindi per lo sviluppo di applicazioni web. Nonostante negli anni sia migliorato grazie all’implementazione di runtime più sofisticati, JS continua a soffrire di limitazioni notevoli, soprattutto in termini di prestazioni. Inoltre, in quanto unico linguaggio “embedded” nel web, JS mostra delle lacune e vulnerabilità anche in termini di efficienza e sicurezza, che non possono essere ignorate.
È in risposta a questi vincoli e sfide che il World Wide Web Consortium (W3C) ha dato vita a WebAssembly (Wasm), un formato bytecode standardizzato che promette di rivoluzionare l’esecuzione di programmi nel contesto web. Vediamo nel dettaglio che cosa vuol dire.
Che cos’è WebAssembly
WebAssembly (Wasm) è un formato bytecode: fa parte della famiglia dei linguaggi di programmazione che per essere eseguiti richiedono la presenza di uno “strato” speciale: un runtime, o una macchina virtuale. Altri linguaggi noti che fanno parte di questa categoria sono, ad esempio: C#, che viene eseguito dal CRL (Common Language Runtime), e Java, che richiede la presenza della JVM (Java Virtual Machine). L’idea fondamentale dietro WebAssembly è la sua capacità di essere eseguito da qualsiasi runtime compatibile, permettendo così ai browser web di integrare nativamente questa tecnologia. Wasm è cross-browser: offre cioè un comportamento uniforme su tutti i browser principali (Google Chrome, Firefox, Edge e Safari).
WebAssembly è stato progettato seguendo questi principi:
- Portabile
- Estendibile
- Integrato con gli standard Web
- Basato su tool esistenti (ad esempio: LLVM, Emscripten e Binaryen.)
Un aspetto fondamentale di WebAssembly è la sua integrazione nativa nei browser web, eliminando la necessità di plugin di terze parti. Il codice compilato può essere facilmente utilizzato all’interno del browser tramite le API di JavaScript, ereditando così le politiche di sicurezza del browser stesso. Inoltre, WebAssembly si distingue per le seguenti caratteristiche intrinseche, direttamente influenzate dall’ambiente dei browser:
- Sicurezza: WebAssembly eredita le politiche di sicurezza dell’ambiente in cui è integrato. In un browser, questo significa l’adozione delle politiche di sicurezza di quest’ultimo.
- Leggerezza: I bytecode generati da WebAssembly sono file binari compatti, ottimizzati per un trasferimento rapido attraverso la rete.
- Velocità: Tempo di caricamento e di risposta molto ridotti
- Supporto per i principali sistemi operativi e architetture
- Interoperabilità con il browser: WebAssembly interagisce con l’HTML, il CSS e ovviamente, con Javascript
Queste caratteristiche hanno reso WebAssembly sicuramente interessante non solo per il browser, ma anche per una vasta gamma di applicazioni web e scenari di sviluppo.
Come funziona WebAssembly nel browser
Prendiamo, ad esempio, un’applicazione scritta in C++ o in Rust. Una volta scritto il codice sorgente è necessario utilizzare un compilatore (Emscripten) per convertirlo in WebAssembly. Questo processo di compilazione genera un file binario ottimizzato (bytecode), che può essere eseguito all’interno del browser e incorporato in una pagina web tramite elementi HTML, come “script” e “canvas”. Quando l’utente visita la pagina web, il browser è in grado di eseguire il codice WebAssembly in modo efficiente e veloce.
In termini più semplici, Wasm fornisce un ambiente di sviluppo universale per creare e scrivere applicazioni in qualsiasi linguaggio utilizzato dagli sviluppatori. Vari linguaggi di sviluppo, come Rust, C/C++, Python e Go, possono quindi comunicare tra di loro.
Come funziona WebAssembly lato server
Esistono runtime di Wasm che possono essere eseguiti al di fuori del browser, su sistemi operativi tradizionali come Linux, Windows e macOS, che consentono di eseguire applicazioni Wasm direttamente sul server. Non potendo fare affidamento su un motore JavaScript disponibile, questi runtime comunicano con il mondo esterno utilizzando diverse interfacce, ad esempio WASI (WebAssembly System Interface), che permette alle applicazioni Wasm di interagire con il sistema ospite.
Una caratteristica fondamentale che distingue i moduli WebAssembly è la loro straordinaria portabilità. Una volta che un’applicazione è stata compilata in un modulo Wasm, il risultato è un binario che può essere eseguito senza modifiche su una vasta gamma di sistemi operativi e ambienti server. Questo significa che le applicazioni server diventano incredibilmente portabili e flessibili, semplificando notevolmente il processo di distribuzione su varie infrastrutture.
WebAssembly nel cloud
Grazie alle potenti caratteristiche di cui abbiamo discusso precedentemente, WebAssembly si configura come la soluzione ideale per la creazione di applicazioni leggere, altamente distribuibili, sicure e interconnesse da implementare nel cloud. Le applicazioni basate su WebAssembly, infatti, sono più piccole, più veloci, più sicure e più portabili dei container tradizionali, posizionandosi come il tassello perfetto per la prossima fase di evoluzione del cloud computing.
In particolare, la portabilità di WebAssembly consente a una funzione Wasm compilata di essere eseguita ovunque sia presente un runtime compatibile. Il Wasm può essere compilato con diverse strategie, alcune delle quali raggiungono velocità di esecuzione quasi native, in grado di competere con il richiamo di funzioni all’interno di un container Docker. Inoltre, le funzioni Wasm possono essere create e disattivate in microsecondi.
Grazie a questa versatilità, WebAssembly si sta affermando come un tassello importante nelle architetture distribuite e rappresenta il prossimo passo logico nell’evoluzione delle infrastrutture software lato server.
Va inoltre notato che Docker ha recentemente annunciato l’integrazione del supporto per WebAssembly attraverso il runtime WasmEdge. Questo significa che, a differenza dei tradizionali container, le immagini non devono più includere il sistema operativo, il runtime e le librerie necessarie per l’applicazione. È sufficiente un singolo binario Wasm.
I principali attori della community di W3C stanno attivamente lavorando all’integrazione di WebAssembly con Kubernetes, suggerendo che vedremo presto applicazioni WebAssembly integrate anche all’interno delle piattaforme Kubernetes. Questa prospettiva promette di evolvere ulteriormente il panorama dell’orchestrazione delle applicazioni nel cloud.
Grazie alle sue peculiarità, WebAssembly ha aperto le porte alla creazione di applicazioni web avanzate alla distribuzione agilmente scalabile nel cloud. L’idea di poter scrivere applicazioni per il web in diversi linguaggi di programmazione, senza compromettere le prestazioni o la sicurezza, offre un potenziale illimitato per gli sviluppatori.