Hlavní navigace

WebAssembly slibuje podstatné zrychlení webů, konec JavaScriptu se ale nekoná

 Autor: Shutterstock, podle licence: Rights Managed
Ondřej Žára

Mozilla, Microsoft, Google i Apple pracují na společném projektu, který má posunout dnešní webové aplikace na novou úroveň.

Vody webového vývoje před několika dny rozbouřila zpráva o novém jazyce pro web, nazvaném WebAssembly. O co se jedná, v čem je tato technika inovativní a co to znamená pro nás, webové brouzdače i JavaScriptové lopaty?

Kapitola první: JavaScript

Pro správné pochopení konceptů a přínosů WebAssembly se musíme nejprve ohlédnout za spletitou historií webových prohlížečů a programovacích jazyků v nich dostupných. Historický exkurz nebude dlouhý, ale pomůže nahlédnout, proč a kam směřují aktuální trendy.

JavaScript je tu s námi již přes dvacet let a za tu dobu prošel několika verzemi. Už od té první o místo v prohlížečích soupeřil s jazykem VBScript, který se objevil hned v roce 1996. Časem přibývala další konkurence: applety v jazyce Java, Flash, Silverlight, Adobe Air, Dart… ukázalo se však, že svrhnout JavaScript z pomyslného trůnu programovacích jazyků v prohlížeči je jako pokoušet se soupeřit v pití s Moravákem. Mnozí to zkusili, ale nakonec stejně padli.

Důvodů je několik. JavaScript měl výhodu prvenství; stavěl na osvědčené syntaxi jazyka C a svou expresivitou dovedl na pár řádcích vytvořit to, co v jiném jazyce vyžadovalo mnoho práce. Programátor se nemusel starat o správu paměti (k tomu je tu Garbage collector) a měl přímý přístup k HTML dokumentu. I přes některé nepochybné neduhy se tak stal JavaScript populárním pro vývojáře-nováčky a dnes tvoří vstupní nástroj pro tvorbu bohatých interaktivních stránek.

To ovšem neznamená, že je JavaScript bez chyb a že není prostor ani motivace pro hledání dalších vylepšení jak jazyka samotného, tak jeho konkrétních implementací a souvisejících rozhraní. Velmi výrazně se to ukázalo v roce 2008, kdy Google uvedl první verzi prohlížeče Chrome. Ta stavěla na zbrusu novém interpretru JavaScriptu, nazvaném V8 – šlo o horkou technologickou novinku, která v roce uvedení výkonem výrazně převyšovala veškerou tehdejší konkurenci. Velkou měrou za to mohla technika zvaná JIT (Just-In-Time), která vykonávaný JavaScript v některých případech nejprve předkompiluje do nativního kódu, který může být následně spouštěn řádově rychleji.

Po syntaktické stránce dochází k vylepšování jazyka uváděním nových verzí. Ta aktuální, ES2015, byla definitivně dokončena teprve před pár dny. Práce na ní ovšem započaly již v roce 2008, to je dlouhá doba. Dnes se proto daří takovým jazykům, které nejsou v prohlížeči přímo podporovány, ale které je možno transpilovat (toto nezvyklé označení se používá pro kompilaci, kdy výstupem není nativní kód, ale jiný jazyk) do JavaScriptu. CoffeeScript, ClojureScript, TypeScript… rozhodně je z čeho vybírat. Někdo upřednostní změny v syntaxi, jiný statickou typovou kontrolu, další programátor použije vlastní dialekt pro jiné řízení asynchronního toku kódu. Možností je v tomto směru mnoho.

Kapitola druhá: asm.js

Pojďme se nyní soustředit na výkon jazyka. Google Chrome při svém uvedení jasně ukázal, že na poli optimalizací jednotlivých interpretrů je rozhodně ještě mnoho práce. Za posledních několik let tak v důsledku konkurenčního boje doznaly jednotlivé implementace (V8 v Chrome, SpiderMonkey ve Firefoxu, JavaScriptCore v Safari) velkých změn a dnes již všechny obsahují mnoho různých forem techniky JIT i dalších optimalizací. Tyto triky ale zvolna naráží na pomyslný strop dostupných možností a tak je čas poohlížet se po alternativních způsobech urychlení vykonávání JavaScriptu.

Ve výpočetní technice je optimalizace často řízena principem něco za něco: uspoříme procesorový čas a zabereme paměť cachí; investujeme do minifikace kódu a tak snížíme jeho výsledný objem; rozložíme zátěž přes více serverů, čímž zmenšíme průměrnou dobu odpovědi. U JavaScriptu a jeho optimalizací nejvíce narážíme na ta místa, kde je jazyk dynamický: funkce pracující s proměnným počtem parametrů, změny typů proměnných za běhu, polymorfní volání, funkce  eval().

Nabízí se tedy následující trik: omezíme sami sebe v možnostech, které nám jazyk nabízí, a na oplátku dostaneme vyšší výkon. Na tomto principu funguje asm.js, jazyk tvořený dobře optimalizovatelnou podmnožinou JavaScriptu. Jak vypadá kód v něm napsaný?

function strlen(ptr) { // calculate length of C string
 ptr = ptr|0;
 var curr = 0;
 curr = ptr;
 while (MEM8[curr]|0 != 0) {
   curr = (curr + 1)|0;
 }
 return (curr - ptr)|0;
}

Na první pohled vidíme časté použití výrazu |0, tedy přetypování na 32bitový integer. To garantuje typovou stabilitu. Dále zcela odpadá práce s Garbage Collectorem, veškerá paměť je ručně spravována ve velkém poli ( MEM8 zde nabízí přístup k hodnotám po osmicích bitů, tedy bajtech). Tento kód je, z pohledu interpretru-překladače, skvěle optimalizovatelný. Pro člověka je ovšem obtížně čitelný a málokdo by chtěl něco takového psát ručně. Asm.js je proto používán jako transpilační cíl – vezmeme kód psaný řekněme v C++, vygenerujeme z něj kód v asm.js a ten pak spustíme v každém prohlížeči na světě.

Mimochodem: prohlížeč si ovšem sám od sebe nevšimne, že se jedná o asm.js a nikoliv o plnohodnotný JavaScript. Pokud tedy chceme, aby pro jeho vykonávání použil relevantní optimalizace, musíme mu to dát najevo. To učiníme tak, že na první řádek souboru s asm.js přidáme řetězec  "use asm";.

Asm.js je tu s námi od roku 2013 a dokázal si získat značnou popularitu – lze do něj překládat C++, Perl, Python a Ruby; existují porty pro Vim, SQLite, GPG a graphviz; v asm.js lze použít Unity i Unreal Engine 4.

Kapitola třetí: WebAssembly

Poměrně přímočarým krokem dalších optimalizačních ambicí na webu je právě WebAssembly. Jedná se o binární formát, reprezentující abstraktní syntaktický strom (AST) zdrojového kódu. Je zde tedy zcela opuštěna vazba na konkrétní syntaxi JavaScriptu, ze které by WebAssembly vzniklo – soubor ve formátu .wasm (tedy zdrojový kód WebAssembly) má být možné vytvářet z jiných jazyků bez nutnosti použití JavaScriptu jako mezikroku.

Takové řešení s sebou jednak nese úsporu objemu přenášených dat, druhak pak odpadá nutnost parsovat zdrojový kód a provádět jeho syntaktickou analýzu. WebAssembly je tedy něco jako syrový obsah paměti interpretru JavaScriptu poté, co dojde ke kompletnímu načtení a rozparsování zdrojových dat. A podle předběžných měření taková úprava stojí za to: už v této rané fázi projektu se načítání wasm ukazuje jako dvacetkrát rychlejší, než načítání korespondujícího JavaScriptu. A to je klíčové – zejména v době, kdy se internet přesouvá na mobilní zařízení se slabými procesory a pomalými datovými linkami.

Za zmínku též stojí, že součástí projektu WebAssembly má být výhledově i textový formát, korespondující 1:1 s binárním zápisem. Čitelná forma kódu se hodí pro ladění a hledání chyb, neboť interpretr dovede převést místo výskytu chyby z binárního do textového formátu a programátorovi tak čitelným způsobem ukáže, kde je v kódu problém. O textovém formátu se toho ovšem zatím moc neví, krom toho, že se dost možná vůbec nebude podobat JavaScriptu (není k tomu žádný důvod).

Tím, že WebAssembly používá vlastní binární formát, odpadá nutnost kompatibility se syntaxí tohoto jazyka. To otevírá prostor pro rychlejší aktualizace, výkonová vylepšení a další změny, které by se při vazbě na zpětnou kompatibilitu s JS navrhovaly jen obtížně.

Stav projektu WebAssembly

Autor jazyka JavaScript, Brendan Eich, odhalil projekt WebAssembly 17. června. Repozitář projektu na GitHubu však odhaluje, že práce na WebAssembly probíhají už několik měsíců a to ve velmi slibném zastoupení: účastní se Mozilla, Microsoft, Google i Apple. Taková technologická shoda se mezi nejsilnějšími hráči na trhu jen tak nenajde.

Projekt je zatím nicméně stále v plenkách. Zájemci mohou obhlédnout existující specifikace a další dokumenty projektu, k dispozici je též experimentální nástroj pro konverzi z wasm do asm.js. Existuje i patch pro V8, který přináší možnost načítání wasm souborů ve V8, a tím pádem i v Google Chrome a Node.js.

Dalším krokem jsou úpravy existujících překladačů tak, aby uměly generovat kód wasm. První bude v tomto směru patrně Emscripten, který je již nyní používán pro transpilaci do asm.js. S podporou dalších překladačů pak bude už jen vzrůstat počet jazyků, jejichž zdrojový kód bude možno reprezentovat ve formátu wasm, a tím pádem spouštět v běžných webových prohlížečích.

To mě zajímá, kde se dozvím víc?

K dispozici je W3C Community Group, neformální uskupení zúčastněných stran. S ohledem na syrovost projektu k dnešnímu dni však fakticky schází konkrétní ukázky, finální dokumenty či implementace.

Kromě oficiálních dokumentů se o projektu WebAssembly můžeme více dozvědět například na stránkách Axela Rauschmayera, jehož články o JavaScriptu na webu 2ality.com jsou vyhledávány v mnoha vývojářských komunitách.

Diskutovat lze též na IRC kanálu #webassembly v síti irc.w3.org. Na praktické použití a skutečné implementace technologie WebAssembly však bude nutné ještě nějakou dobu počkat.

Konec JavaScriptu?

Na závěr článku je důležité zmínit, že WebAssembly rozhodně není projektem s cílem nahradit JavaScript. Jednak nás historie učí, že tento jazyk v jeho současné podobě z internetu vymýtit nelze, druhak projekt WebAssembly míří jinam. Do míst, kde JavaScript a jeho výkon nestačí (a z definice jazyka stačit nemůže); tam, kde nás zajímá možnost využití existujícího kódu napsaného v jiném jazyce; pro případy, kdy potřebujeme performance-critical kód a nevadí nám, že nebude psán v čitelném a expresivním JavaScriptu.

Očekává se tedy, že běžný webař bude i nadále psát své malinké skripty i veliké SPA v tradičním ES2015. Ale čas od času bude ve svém projektu moci použít komponentu (řekněme knihovnu zlib či třeba SDL) z jiného jazyka pomocí jasně definovaného rozhraní a s přidanou hodnotou předvídatelného výkonu blízkého nativnímu kódu.

Jak moc a jak rychle se WebAssembly rozšíří, to dopředu samosebou nikdo neví. Ale projekt má dobře našlápnuto, odborná veřejnost ho přivítala s otevřenou náručí, a tak to vypadá, že aplikace na webu čekají skvělé časy!

Našli jste v článku chybu?

29. 6. 2015 11:28

Seattleman (neregistrovaný)

Viac takýchto článkov a som ochotný zakúpiť si predplatné za 10-15 eur mesačne, aby som finančne podporil redakciu i vydavateľa.

29. 6. 2015 19:09

Ondřej Žára (neregistrovaný)

Nikoliv.

To se právě týká druhého bodu, který jsem popisoval.

Aby mohl kód ve WebAssembly (a nikoliv nezbytně jen ten, i běžný ručně psaný JS) komunikovat s wasm-verzí těchto knihoven, bude nutné takovou jejich variantu naimplementovat.

A jak je uvedeno v citovaném textu, " On the Web, they utilize Web APIs (for example, OpenGL is executed on WebGL, libc date and time methods use the browser's Date functionality, etc.)." To je logické, protože těžko zkompiluji řekněme knihovnu SDL do wasm tak…

Vitalia.cz: Máslo? Margarín? A co takhle sádlo?

Máslo? Margarín? A co takhle sádlo?

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

120na80.cz: 5 nejčastějších mýtů o kondomech

5 nejčastějších mýtů o kondomech

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Root.cz: Mirai má nový cíl 5 milionů routerů

Mirai má nový cíl 5 milionů routerů

Vitalia.cz: To nejhorší při horečce u dětí: Febrilní křeče

To nejhorší při horečce u dětí: Febrilní křeče

Podnikatel.cz: 3, 2, 1..EET startuje. Na co nezapomenout?

3, 2, 1..EET startuje. Na co nezapomenout?

Podnikatel.cz: Vládu obejde, kvůli EET rovnou do sněmovny

Vládu obejde, kvůli EET rovnou do sněmovny

Měšec.cz: Vklad na cizí účet je draze zpoplatněn (přehled)

Vklad na cizí účet je draze zpoplatněn (přehled)

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

Podnikatel.cz: Daňové úlevy s EET nestačí. Budou zdražovat

Daňové úlevy s EET nestačí. Budou zdražovat

Vitalia.cz: Když přijdete o oko, přijdete na rok o řidičák

Když přijdete o oko, přijdete na rok o řidičák

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu

Root.cz: 250 Mbit/s po telefonní lince, když máte štěstí

250 Mbit/s po telefonní lince, když máte štěstí

Vitalia.cz: Pravda o přibírání na zimu

Pravda o přibírání na zimu

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

DigiZone.cz: Rádio Šlágr má licenci pro digi vysílání

Rádio Šlágr má licenci pro digi vysílání

Root.cz: Nová třída SD karet A1 s vysokým výkonem

Nová třída SD karet A1 s vysokým výkonem

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla