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. Je vyvíjen pod zastřešením W3C inženýry z firem Mozilla, Microsoft, Google a Apple.
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, a je navržen tak, aby byl parsován i prováděn rychleji než JavaScript a aby výsledný kód byl velmi kompaktní.
Historie
Inspirací pro WebAssembly jsou Google Native Client (NaCl) a asm.js. První implementace v prohlížeči byla založena na schopnostech asm.js. poprvé byl uveden 17. června 2015 a 15. března 2016 byla demonstrována hra Angry Bots založená na herním engine Unity v prohlížečích Firefox, Chromium, Google Chrome, a Microsoft Edge. 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. 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). V únoru 2018 zveřejnila pracovní skupina WebAssembly Working Group tři návrhy standardů pro Core Specification, Javascript Interface a Web API.
Dne 16. října 2024 přišla Mozilla s významným zrychlením spouštění WebAssembly, které dosahuje až 75 násobek dřívější rychlosti spouštění před optimalizací. Mozilla zaroveň uvádí, že pracuje na dalším zrychlení spouštění.
Podpora
Mozilla deklarovala podporu „ve všech hlavních prohlížečích“, implicitně je podpora povolena v Microsoft Edge verze 16. 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).
Emscripten může zkompilovat do wasm v backendu pomocí LLVM.
Prvotní záměr je podpora kompilace z jazyků C a C++, ačkoliv je vyvíjena podpora i pro další jazyky, jako například Rust. Po dosažení hranice minimálně životaschopného produktu je v plánu vytvoření podpory pro Garbage collection, 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. 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:
| 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ý:
(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))))
