Deprecated: Creation of dynamic property Timber\Site::$pingback is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Site.php on line 180

Deprecated: Creation of dynamic property Timber\User::$name is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/User.php on line 118

Deprecated: Creation of dynamic property Timber\Post::$has_disclaimer is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_edit_lock is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_edit_last is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$onesignal_meta_box_present is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$onesignal_send_notification is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$onesignal_modify_title_and_content is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$onesignal_notification_custom_heading is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$onesignal_notification_custom_content is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_yoast_wpseo_focuskw is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_yoast_wpseo_metadesc is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_yoast_wpseo_linkdex is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_yoast_wpseo_content_score is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_yoast_wpseo_estimated-reading-time-minutes is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_yoast_wpseo_wordproof_timestamp is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$tipologia is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_tipologia is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$attributi is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_attributi is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$in_evidenza_newsletter is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_in_evidenza_newsletter is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$inviato_in_newsletter is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_inviato_in_newsletter is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_yoast_wpseo_primary_category is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_yoast_wpseo_primary_blz_affiliation_attributes is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_yoast_wpseo_primary_content_type is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_yoast_wpseo_primary_attributes is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_yoast_wpseo_primary_speciali is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_thumbnail_id is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$response_body is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$status is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_oembed_b534e14a850cf1d3875e2095a4816e79 is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$_oembed_time_b534e14a850cf1d3875e2095a4816e79 is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$post_date_gmt is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$comment_status is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$ping_status is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$post_password is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$post_name is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$to_ping is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$pinged is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$post_modified is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$post_modified_gmt is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$post_content_filtered is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$guid is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$menu_order is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$post_mime_type is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$comment_count is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71

Deprecated: Creation of dynamic property Timber\Post::$filter is deprecated in /var/www/html/web/app/themes/ilsoftware/vendor/timber/timber/lib/Core.php on line 71
WASM, cos'è e come sta rivoluzionando le applicazioni Web | IlSoftware.it

WASM, cos'è e come sta rivoluzionando le applicazioni Web

WASM: cos'è e come funziona. Ancora non rappresenta propriamente il futuro dell'informatica ma è comunque una buona idea. Ecco perché.

Dal 1995 e fino a “poco” tempo fa, l’unico strumento per realizzare qualcosa di veramente interattivo e un po’ più evoluto rispetto alla staticità delle pagine HTML era JavaScript, che però ha i suoi limiti soprattutto per ciò che riguarda le attività che devono essere svolte con un certo livello prestazionale. WASM, abbreviazione di WebAssembly, è nato per essere un’alternativa all’esecuzione di codice JavaScript nel browser, consentendo alle applicazioni di eseguire operazioni impegnative all’interno del programma che si usa per navigare online.

Cos’è WASM e come esegue, da browser, codice nettamente più performante di JavaScript

WASM è progettato per eseguire codice in modo molto più veloce rispetto a JavaScript: utilizza infatti un formato di bytecode binario che può essere eseguito nei browser Web moderni e che assicura prestazioni molto simili a quelle delle applicazioni eseguite nativamente a livello di sistema operativo.

L’anno di nascita di WASM è il 2015: è allora che il World Wide Web Consortium (W3C) e i principali fornitori di browser hanno trovato la quadra al fine di approvare e predisporre una macchina virtuale a basso livello che esegue il bytecode, tradotto dai linguaggi ad alto livello.

Quando si parla di WASM, infatti, non bisogna pensare a un nuovo linguaggio di programmazione bensì a un formato di istruzioni binarie compatto caricato ed eseguito all’interno di una sandbox allestita dal browser. Diversamente rispetto a JavaScript, che è un linguaggio interpretato, WASM usa bytecode ovvero un insieme di istruzioni a basso livello generate da un compilatore, ma non è direttamente eseguibili dalla macchina. Il bytecode è un codice intermedio progettato per essere eseguito in una macchina virtuale: il vantaggio principale consiste ovviamente nella portabilità poiché il bytecode può essere utilizzato per eseguire l’applicazione su diverse piattaforme e architetture senza la necessità di essere ricompilato.

Esempi di linguaggi che utilizzano il bytecode includono Java (che genera bytecode eseguito sulla Java Virtual Machine, JVM) e C# (che genera bytecode eseguito sulla Common Language Runtime, CLR).

In un altro articolo abbiamo messo in evidenza le principali differenze tra linguaggi interpretati e compilati parlando anche di linguaggio macchina.

WASM logo

La forza di WASM per gli sviluppatori Web

I vantaggi di WASM sono molteplici. Oltre ai già citati benefici in termini prestazionali e all’elevata portabilità del codice, WASM non è legato a un linguaggio di programmazione specifico. Può infatti essere utilizzato con diversi linguaggi, tra cui C, C++, Rust e altri. Ciò significa che gli sviluppatori possono scrivere il proprio codice in un linguaggio di programmazione preferito e ottenere il bytecode WASM eseguibile all’interno di qualunque browser Web moderno.

I web developer sono entusiasti di WASM perché non devono sostituire completamente le applicazioni basate su JavaScript. Un altro vantaggio di WASM è infatti la sua interoperabilità: gli sivluppatori Web possono così chiamare le funzioni WASM da JavaScript e viceversa, consentendo un’integrazione senza soluzione di continuità tra le due tecnologie.

Dicevamo inoltre che un altro aspetto fondamentale che costituisce la spina dorsale di WASM consiste nel supporto diretto per la sandbox, un ambiente sicuro integrato nel browser Web e completamente isolato dal resto del sistema che evita la “commistione” con le altre applicazioni in esecuzione sulla macchina. Con tutto ciò che ne potrebbe seguire sul versante della sicurezza.

WASM sinonimo di containerizzazione?

Nel 2019 Mozilla ha fatto un annuncio storico: presentando la sua WebAssembly System Interface (WASI), il codice WASM diventava in grado di accedere alle risorse del sistema operativo superando di fatto i confini del browser Web. Ecco quindi che arrivò la proposta di una soluzione, universalmente riconosciuta, per eseguire lo stesso codice su tutte le macchina senza necessità di una nuova compilazione, come abbiamo visto in precedenza.

Leggete questo tweet di Solomon Hykes, cofondatore di Docker: “Se WASM+WASI fossero esistiti nel 2008, non avremmo avuto bisogno di creare Docker. Ecco quanto è importante. WebAssembly lato server è il futuro dell’informatica. Un’interfaccia di sistema standard era il collegamento mancante“.

Lo stesso concetto, con maggiore dovizia di particolari, è stato ribadito più di recente (dicembre 2022) da VMware che ha descritto come cambia la gestione dei software lato server con WASM, senza bisogno di container.

Non è così semplice: le sfide che WASM deve affrontare

Ad ogni modo, sebbene WASI e runtime alternative come WasmEdge abbiano reso molto più facile eseguire il codice WASM in molti ambiti (quindi in ambienti diversi dal browser Web…), c’è ancora molto lavoro da fare. Basti pensare a Python. Questo linguaggio di programmazione è diventato un po’ il “faro” per la stragrande maggioranza dei progetti per il machine learning e in generale per le applicazioni di intelligenza artificiale, grazie alla disponibilità di PyTorch.

PyTorch è una libreria open source per le attività di machine learning e deep learning ampiamente utilizzata per lo sviluppo di applicazioni di intelligenza artificiale. Sviluppata principalmente dai laboratori AI Research di Facebook, PyTorch è diventata popolare per la sua flessibilità, facilità d’uso e per il supporto delle reti neurali profonde.

Il problema, che ci riporta alla cruda realtà, è che non è possibile trasferire queste applicazioni Python in modo semplice con WASM: servono molte dipendenze di terze parti, che non sono ancora disponibili.

Il potenziale, tuttavia, c’è tutto: guardate ad esempio il porting di Audacity realizzato con WASM. La sfida, però, consiste a questo punto nel rafforzare la presenza di WASM al di fuori del browser Web e quindi come soluzione da utilizzare anche sul backend. Intendiamo, in questo caso, la possibilità di servirsi di bytecode WASM lato server.

Un valido ausilio in questo senso dovrebbe arrivare con l’utilizzo del WebAssembly Component Model (WACM) e con la seconda versione di WASI.

Tornando invece al browser Web, va detto che in WASM manca non soltanto l’accesso al DOM della pagina ma anche molte altre strutture come XMLHttpRequest.

Come imparare il WebAssembly Text Format

L’autore del progetto Watlings ha creato un repository su GitHub dedicato all’apprendimento dei “rudimenti” di WASM attraverso una serie di esercizi e piccoli programmi. Obiettivo del progetto è fornire le “chiavi” per apprendere il WebAssembly Text Format (WAT), una rappresentazione testuale leggibile dall’uomo per il codice WASM.

Come abbiamo visto, infatti, il bytecode WASM è in formato binario: WAT semplifica la creazione, la lettura e la modifica del codice WASM.

Il progetto Watlings include una serie di esercizi pratici che coprono vari aspetti di WAT: sono suddivisi in numerose sezioni, ognuna delle quali tratta un aspetto specifico del formato.

Per iniziare “il viaggio”, gli apprendisti sviluppatori possono clonare il repository, installare le dipendenze tramite npm e quindi testare le proprie soluzioni agli esercizi utilizzando comandi specifici.

Qualche idea di codice da trasformare in bytecode WASM

Prendiamo come esempio questo semplice codice C/C++ che calcola la somma di due numeri (da salvare come file sorgente.cpp):

#include <iostream>

int main() {
int a = 5;
int b = 7;
int sum = a + b;
std::cout << “La somma di ” << a << ” e ” << b << ” è ” << sum << std::endl;
return 0;
}

Usando Emscripten è possibile compilare questo codice in WASM e ottenere un file HTML che lo richiama da browser Web:

emcc sorgente.cpp -o output.html

Ancora, il codice Rust seguente calcola il fattoriale di un numero (da salvare come sorgente.rs) e lo esporta come funzione WASM:

#[no_mangle]
pub extern “C” fn factorial(n: u32) -> u32 {
if n <= 1 {
return 1;
}
return n * factorial(n – 1);
}

Il codice può essere compilato in WASM utilizzando il compilatore Rust:

rustc --target wasm32-unknown-unknown -O -o output.wasm sorgente.rs

Parlavamo di interoperabilità: una volta generato il file WASM, si possono chiamare le funzioni tramite codice JavaScript.

Il codice presentato di seguito richiama proprio la funzione factorial scritta precedentemente in Rust:

// Carica il modulo WASM
const { instance, module } = await WebAssembly.instantiateStreaming(fetch(‘output.wasm’));

// Chiama la funzione WASM
const result = instance.exports.factorial(5);
console.log(“Il fattoriale di 5 è ” + result);

È quindi possibile usare WASM per qualunque elaborazione complessa e integrare gli input e gli output delle funzioni con esso definite nelle proprie applicazioni Web.

WASM può essere utilizzato per eseguire operazioni di compressione e decompressione dei dati, per effettuare simulazioni fisiche realistiche, per elaborare immagini direttamente nel browser, per svolgere calcoli matematici impegnativi. Le elaborazioni possono così essere eseguite in modo efficiente e il risultato è a disposizione dell’applicazione Web.

Credit immagine in apertura: iStock.com/Cecilie_Arcurs

Ti consigliamo anche

Link copiato negli appunti