# WebAssembly

WebAssembly (o Wasm) és un format de codi de bytes (un llenguatge de programació de baix nivell) per estendre les pàgines web amb programes que s'executen en els navegadors. Malgrat haver sorgit com una evolució de JavaScript, el seu objectiu és servir de llenguatge resultant de la compilació de molts llenguatges d'alt nivell, començant per C i C++. En anglès, "WebAssembly" vol dir "llenguatge d'assemblador web".

## Disseny

WebAssembly és una màquina de pila que executa codi que és portable i alhora més ràpid d'analitzar i d'executar que JavaScript.

## Història

WebAssembly es va anunciar el 17 de juny del 2015 i es va presentar el 15 de març del 2016 executant el videojoc Angry Bots de Unity dins dels navegadors Firefox, Chromium, Google Chrome, i Microsoft Edge.
Segons el lloc web Can I use, la majoria dels navegadors en ús ja són compatibles amb WebAssembly.

## Desenvolupament

La implementació inicial de WebAssembly en els navegadors es va basar en les característiques presents al llenguatge asm.js. Després de publicar l'MVP, el pla és afegir-hi la recollida de memòria brossa, cosa que permetria compilar a WebAssembly els llenguatges que la necessiten, com ara Java i C#. A l'equip que treballa en WebAssembly hi ha gent de Mozilla, Microsoft, Google i Apple.

## Representació

El març del 2017, el grup comunitari de WebAssembly al W3C va acabar de consensuar-ne el format binari inicial (MVP), l'API de JavaScript i l'intèrpret de referència. A més del format binari de WebAssembly, que no està dissenyat perquè l'utilitzin els humans, també s'hi defineix un format textual similar als llenguatges d'assemblador que els humans poden llegir més fàcilment.
La taula següent conté un exemple dels diferents formats: a l'esquerra hi ha el codi font original escrit en el llenguatge C, al centre el mateix programa en el format WebAssembly textual resultant de la compilació i a la dreta en format WebAssembly binari hexadecimal:
| C | Wasm textual | Wasm binari |
| int factorial(int n) { if (n == 0) return 1; else return n * factorial(n-1); } | get_local 0 i64.eqz if 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 |

## Referències

* 1 2 «WebAssembly High-Level Goals». GitHub / WebAssembly / design, 11-12-2015.
* ↑ «Design Rationale». GitHub / WebAssembly / design, 01-10-2016.
* ↑ «Launch bug», 11-06-2015.
* ↑ Wagner, Luke. «A WebAssembly Milestone: Experimental Support in Multiple Browsers», 14-03-2016.
* ↑ Thompson, Seth. «Experimental support for WebAssembly in V8», 15-03-2016.
* ↑ Zhu, Limin. «Previewing WebAssembly experiments in Microsoft Edge», 15-03-2016.
* ↑ «WebAssembly». Can I use. [Consulta: 11 agost 2017].
* ↑ «WebAssembly: a binary format for the web». ②ality – JavaScript and more, 18-06-2015.
* ↑ «WebAssembly/design». Arxivat de l'original el 4 abril 2017. [Consulta: 28 desembre 2015].
* ↑ «WebAssembly/gc».
* ↑ Bright, Peter. «The Web is getting its bytecode: WebAssembly». Ars Technica. Condé Nast, 18-06-2015.
* ↑ «Roadmap», 01-03-2017.
* ↑ ; rossberg-chromium; kripken; titzer; s3ththompson«Text Format». GitHub, 09-03-2017.

## Enllaços externs

* WebAssembly - Lloc web oficial
* Grup comunitari de WebAssembly al W3C
* Disseny de WebAssembly