WebAssembly
Paradigmaimperativní, strukturované, orientované na výrazy
Vznikbřezen 2017
VývojářW3C
Typová kontrolaStatický
Ovlivněn jazykyasm.js (od Mozilly)
NaCl (od Google)
OSWeb
LicenceApache 2.0 License
Přípona souboru.wat, .wasm

WebAssembly (wasm, WA) je v informatice webový standard, který definuje binární formát a odpovídající pseudo-jazyk symbolických adres pro přenositelný strojový kód spustitelný na webových stránkách. Umožňuje provádět kód téměř tak rychle, jako nativní strojový kód. Představuje tak doplněk k JavaScriptu, který má zrychlit kritické části webových aplikací a později umožnit webový vývoj i v jiných programovacích jazycích, než je JavaScript.[1][2][3] Je vyvíjen pod zastřešením W3C inženýry z firem Mozilla, Microsoft, Google a Apple.[4]

Po formální verifikaci je spouštěn v sandboxu ve webovém prohlížeči. Programy mohou být kompilovány do wasm modulů z vyšších programovacích jazyků a zaváděny jako knihovny z JavaScriptových appletů.

Design

WebAssembly je abstraktní portabilní strukturovaný kód určený pro běh na zásobníkovém počítači,[5] a je navržen tak, aby byl parsován i prováděn rychleji než JavaScript[6] a aby výsledný kód byl velmi kompaktní.

Historie

Inspirací pro WebAssembly jsou Google Native Client (NaCl) a asm.js.[1][7] První implementace v prohlížeči byla založena na schopnostech asm.js.[8] poprvé byl uveden 17. června 2015[9] a 15. března 2016 byla demonstrována hra Angry Bots založená na herním engine Unity v prohlížečích Firefox,[10] Chromium, Google Chrome,[11] a Microsoft Edge.[12] V březnu 2017 bylo deklarováno, že vývoj dosáhl hranice minimálně životaschopného produktu a uváděcí fáze byla dokončena.[13] Prohlížeč Safari dostal podporu ve verze 11 (konec roku 2017). V březnu 2018 byla deklarována podpora pro 72.75% globáně používaných prohlížečů (zbytek může mít podporu přes polyfill).[14] V únoru 2018 zveřejnila pracovní skupina WebAssembly Working Group tři návrhy standardů pro Core Specification, Javascript Interface a Web API.[15][16][17][18]

Podpora

Mozilla deklarovala podporu „ve všech hlavních prohlížečích“,[19] implicitně je podpora povolena v Microsoft Edge verze 16.[20] Pro zpětnou kompatibilitu může být wasm zkompilován do asm.js pomocí JavaScript appletu (ve webových prohlížečích označována jako tzv. polyfill).[21]

Emscripten může zkompilovat do wasm[13] v backendu pomocí LLVM.

Prvotní záměr je podpora kompilace z jazyků C a C++,[6] ačkoliv je vyvíjena podpora i pro další jazyky, jako například Rust.[22] Po dosažení hranice minimálně životaschopného produktu je v plánu vytvoření podpory pro Garbage collection,[23] což umožní pro WebAssembly podporu jazyků, které garbage collecting používají (Java, C#).

Reprezentace

V březnu 2017 byl dosažen konsenzus pro počáteční formu binárního formátu, JavaScript API a referenční interpret.[24] Definuje binární formát, který není určen k tomu, aby byl lidmi používán podobně jako klasický lineární kód jazyka symbolických adres, který je všeobecně znám.

Následující tabulka ukazuje tři různé pohledy na stejný zdrojový kód zobrazený vlevo a vpravo od něj je převeden do mezijazyka wasm a pak do binárního formátu wasm:[25]

zdrojový kód v C lineární assembly bytecode
(mezijazyk)
WASM binary kód
(hexadecimálně)
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

Textový formát WebAssembly může být zapsán ve složeném formátu s-výrazů. Tento formát je čistě syntaktický cukr a není od lineárního formátu nijak významově odlišný:[26]

(module
  (import "math" "exp" (func $exp (param f64) (result f64)))
  (func (export "doubleExp") (param $0 f64) (result f64)
    (f64.mul
      (call $exp
        (get_local $0))
      (f64.const 2))))

Reference

  1. a b LARDINOIS, Frederic. Google, Microsoft, Mozilla And Others Team Up To Launch WebAssembly, A New Binary Format For The Web. TechCrunch. 2015-06-17. Dostupné online [cit. 2017-12-24]. (anglicky) 
  2. CIMPANU, Catalin. Mozilla, Microsoft, Google, and Apple Join Efforts to Create a Binary File Format for the Web. softpedia. 2015-06-18. Dostupné online [cit. 2017-12-23]. (anglicky) 
  3. HOFFMANN, Moritz. Turbo-Boost für JavaScript: Eric Elliott über WebAssembly. JAXenter. 2015-06-23. Dostupné online [cit. 2017-12-23]. (německy) 
  4. BRIGHT, Peter. The Web is getting its bytecode: WebAssembly [online]. Condé Nast, 18 June 2015. Dostupné online. 
  5. Design Rationale [online]. 1 October 2016. Dostupné online. 
  6. a b WebAssembly High-Level Goals [online]. 11 December 2015. Dostupné online. 
  7. AVRAM, Abel. Google Is to Remove Support for PNaCl [online]. 2017-05-31 [cit. 2017-12-22]. Dostupné online. 
  8. WebAssembly: a binary format for the web [online]. 18 June 2015. Dostupné online. 
  9. Launch bug [online]. 11 June 2015. Dostupné online. 
  10. WAGNER, Luke. A WebAssembly Milestone: Experimental Support in Multiple Browsers [online]. 14 March 2016. Dostupné online. 
  11. THOMPSON, Seth. Experimental support for WebAssembly in V8 [online]. 15 March 2016. Dostupné online. 
  12. ZHU, Limin. Previewing WebAssembly experiments in Microsoft Edge [online]. 15 March 2016. Dostupné online. 
  13. a b KRILL, Paul. WebAssembly is now ready for browsers to use. InfoWorld. 2017-03-06. Dostupné online [cit. 2017-12-23]. (anglicky) 
  14. WebAssembly [online]. [cit. 2018-03-07]. Dostupné online. 
  15. WebAssembly First Public Working Drafts [online]. W3C, February 15, 2018 [cit. 2018-04-20]. Dostupné online. 
  16. WebAssembly Core Specification [online]. W3C, February 15, 2018 [cit. 2018-04-20]. Dostupné online. 
  17. WebAssembly JavaScript Interface [online]. W3C, February 15, 2018 [cit. 2018-04-20]. Dostupné online. 
  18. WebAssembly Web API [online]. W3C, February 15, 2018 [cit. 2018-04-20]. Dostupné online. 
  19. WebAssembly support now shipping in all major browsers [online]. [cit. 2017-11-21]. Dostupné online. (anglicky) 
  20. Introducing new JavaScript optimizations, WebAssembly, SharedArrayBuffer, and Atomics in EdgeHTML 16 [online]. [cit. 2017-11-21]. Dostupné online. (anglicky) 
  21. BRIGHT, Peter. The Web is getting its bytecode: WebAssembly. Ars Technica. 2015-06-18. Dostupné online [cit. 2017-12-23]. (anglicky) 
  22. KRILL, Paul. Direct WebAssembly compilation comes to Rust language. InfoWorld. 2017-11-29. Dostupné online [cit. 2017-12-24]. (anglicky) 
  23. KRILL, Paul. What's next for WebAssembly: GC, threads, debugging. TechWorld. 2017-10-26. Dostupné online [cit. 2017-12-24]. 
  24. Roadmap [online]. March 2017. Dostupné online. 
  25. jfbastien; ROSSBERG-CHROMIUM; KRIPKEN; TITZER; S3THTHOMPSON; SUNFISHCODE; LUKEWAGNER. Text Format [online]. GitHub, 9 March 2017. Dostupné online. 
  26. Folded instructions [online]. Dostupné online.  / WebAssembly / spec

Literatura

Související články

Externí odkazy