# WebAssembly

WebAssembly (Wasm, WA) è uno standard web che definisce un formato binario e un corrispondente formato testuale per la scrittura di codice eseguibile nelle pagine web. Ha lo scopo di abilitare l'esecuzione del codice quasi alla stessa velocità con cui esegue il codice macchina nativo. È stato progettato come integrazione di JavaScript per accelerare le prestazioni delle parti critiche delle applicazioni Web e in seguito per consentire lo sviluppo web in altri linguaggi oltre a JavaScript. È sviluppato dal World Wide Web Consortium (W3C) con ingegneri provenienti da Mozilla, Microsoft, Google e Apple.
Viene eseguito in una sandbox nel browser Web dopo una fase di verifica formale. I programmi possono essere compilati da linguaggi di alto livello in moduli Wasm e caricati come librerie dalle applet JavaScript.

## Progettazione

Il codice WebAssembly è concepito per essere eseguito su una stack machine portabile strutturata e astratta, progettato per essere più veloce da analizzare di JavaScript e più veloce da eseguire e per consentire una rappresentazione molto compatta del codice.

## Storia

Le tecnologie precorritrici "vendor-specific" sono state Google Native Client (NaCl) e asm.js. L'implementazione iniziale del supporto di WebAssembly nei browser era basata sul set di funzionalità di asm.js. È stato annunciato per la prima volta il 17 giugno 2015 e il 15 marzo 2016 è stata dimostrata l'esecuzione di Unity's Angry Bots in Firefox, Chromium, Google Chrome, e Microsoft Edge. nel marzo 2017, la progettazione del prodotto minimo vitale è stata dichiarata completata e la fase di anteprima conclusa. Alla fine di settembre 2017, è stato rilasciato il supporto in Safari 11. A partire da marzo 2019, il sito Can I use rileva che il 81.41% dei browser a livello globale supporta WebAssembly (e indirettamente, attraverso polyfill, altri browser sono supportati). Nel febbraio 2018 il WebAssembly Working Group ha pubblicato tre bozze di lavoro per Core Specification, JavaScript Interface, e Web API.

## Supporto

Mozilla ha dichiarato il supporto "in tutti i principali browser", per esempio è stato abilitato di default anche in Edge 16. Per compatibilità con le versioni precedenti, Wasm può essere compilato in asm.js da un'applet JavaScript (il cosiddetto polyfill) ed eseguito su browser incompatibili in questo modo.
Emscripten può compilare in Wasm usando LLVM nel backend.
Il suo obiettivo iniziale è supportare la compilazione da C e C++, tuttavia sta emergendo anche il supporto per altri linguaggi come Rust. Dopo il rilascio del prodotto minimo vitale (MVP, minimum viable product), è previsto il supporto della garbage collection che renderebbe WebAssembly una destinazione di compilazione per i linguaggi di programmazione come Java e C#.

## Rappresentazione

Nel marzo 2017, il WebAssembly Community Group ha raggiunto il consenso sul formato binario iniziale (MVP), sull'API JavaScript e sull'interprete di riferimento. Esso definisce un formato binario di WebAssembly, che non è progettato per essere utilizzato dagli esseri umani, così come un formato bytecode lineare scrittura di assembly leggibile dall'uomo che assomiglia ai tradizionali linguaggi assembly.
La tabella seguente rappresenta tre diverse viste dello stesso codice sorgente così come immesso (a sinistra), convertito in una rappresentazione intermedia Wasm (al centro), e infine in formato binario Wasm:
| Codice sorgente in linguaggio C | Linear assembly bytecode (Rappresentazione intermedia) | Codifica binaria Wasm (byte esadecimali) |
| int factorial(int n) { if (n == 0) return 1; else return n * factorial(n-1); } | get_local 0 i64.eqz if (result i64) i64.const 1 else get_local 0 get_local 0 i64.const 1 i64.sub call 0 i64.mul end | 20 00 50 04 7E 42 01 05 20 00 20 00 42 01 7D 10 00 7E 0B |
Il formato di testo di WebAssembly può anche essere scritto in un formato compatto usando le s-expressions. Questo formato è puramente uno zucchero sintattico e non presenta differenze comportamentali con il formato lineare. Un esempio è mostrato di seguito: