Nahoru
 

WebAssembly a smrt JavaScriptu?

Žhavá novinka zvaná WebAssembly umožnila tvorbu logiky webových aplikací v jiných jazycích nežli v JavaScriptu. Jedná se o osvobození od JavaScriptového monopólu, na který všichni čekali. WebAssembly bude mít velmi rozsáhlý dopad na webové inženýrství a web jako takový.

WebAssembly (zkráceně Wasm) je standard a definuje strukturu binárního kódu spolu s rozhraním na komunikaci mezi programy a jejich hostovaným prostředím. Tento binární kód může běžet v prohlížeči, stejně jako JavaScript. WebAssembly byl navržen W3C, což je mezinárodní organizace pro správu webových standardů.

První zmínky o WebAssembly pochází již z roku 2015. Unity (herní engine) v tomto roce provedl demonstraci se hrou Angry Bots. Hra byla hratelná v prohlížečích Firefox, Google Chrome a Microsoft Edge. Aktuální verzi je možné shlédnou na adrese https://beta.unity3d.com/jonas/AngryBots/ (doporučujeme nejprve snížit hlasitost v počítači).

Angry Bots běží konkrétně na platformě zvané WebGL a samotné WebGL je postavené na C++, ale zkompilované do WebAssembly.

Ještě před WebAssembly existovaly technologie asm.js od Mozilla a Google Native Client od Google, které sloužily jako velká inspirace.

Netrvalo dlouho a již v roce 2017 byl WebAssembly podporován ve svaté čtveřici nejpoužívanějších prohlížečů – Microsoft Edge, Mozilla Firefox, Google Chrome a Safari. Bohužel, Internet Explorer se podpory již nikdy nedočká, i když má stále zástup pár desetin procent uživatelů.

Princip WebAssembly

Vzhledem k tomu, že WebAssembly je pouze standard, prakticky nic neumí, avšak hodně toho diktuje. Nařizuje hlavně 2 věci: Bytecode a Binarycode. Bytecode je kód blížící se klasickému assembly, tedy lowlevel kódu, kterému však ještě může porozumět běžný smrtelník. Binarycode je již sada nul a jedniček, které musí umět běhové prostředí (tedy prohlížeče a jejich jádro) spustit. Nuly a jedničky většinou lidé číst neumí.

C++ kód:

int factorial(int n) {
  if (n == 0)
    return 1;
  else
    return n * factorial(n-1);
}

Bytecode:

get_local 0
i64.const 0
i64.eq
if i64
    i64.const 1
else
    get_local 0
    get_local 0
    i64.const 1
    i64.sub
    call 0
    i64.mul
end

Binarycode:

20 00
42 00
51
04 7e
42 01
05
20 00
20 00
42 01
7d
10 00
7e
0b

Bytecode a Binarycode jsou si ekvivalentní, proto příliš nezáleží na tom, který použijeme. Důležité je, že máme definovaný nějaký formát spustitelného kódu.

Díky tomu, že máme pomocí WebAssembly definované binární kódy, můžeme sestavit kompilátor pro jakýkoliv existující i budoucí jazyk.

Nespornou výhodou WebAssembly je „šíleně velká“ efektivita, hlavně oproti JavaScriptu. JavaScript je kompilován až prohlížečem, a ještě k tomu je JavaScript díky interní implementaci dost neefektivní, hlavně například při volání funkcí. WebAssembly je zásobníkové assembly, které ještě předkompiluje server, což nesporně předčí rychlost JavaScriptu. Více o principech JavaScriptu je možné zjistit v článku „JavaScript, aneb jak postavit dům pomocí sirek“.

WebAssembly a JavaScript

Zbavíme se díky WebAssembly JavaScriptu? Teoreticky bychom všichni mohli začít používat náš oblíbený jazyk s kompilátorem podporující Wasm, nicméně v praxi má JavaScript své kořeny ve webu až příliš hluboko.

JavaScript známe již od roku 1995 a oproti WebAssembly má neskutečně obrovský náskok. Dokud nám kompletně nevymřou všechny prohlížeče nepodporující Wasm (například Internet Explorer) a dokud se nedočkáme velkých populárních frameworků využívajících WebAssembly, bude to dalších pár let trvat. Například Microsoft naskočil na WebAssembly vlak velice brzo, a i přesto je jejich Blazor doposud v preview (září 2019).

Budoucnost popularity JavaScriptu je v tuto chvíli dost nejistá, nicméně časem může začít klesat. Jak moc však můžeme pouze hádat. Jestli se dočkáme solidních webových frameworků využívající WebAssembly v populárních podnikových jazycích jako C#, Java a další podobné, můžeme čekat narušení rovnováhy sil, nicméně do té doby bude JavaScript vládnout.

Produkty s WebAssembly (k září 2019)

V tuto chvíli nemáme přiliž pestrý výběr z produktů a frameworků, pokud chceme pracovat s WebAssembly. Snad se situace časem změní.

Jedním ze starších nástrojů je amscripten, umožňující C a C++ kódu běžet na front-endu, a to velmi rychle (jak by šlo od C++ čekat). Bohužel, C a C++ není jazyk vhodný pro enterprise aplikace, a proto není tak silně využíván.

Další low-level nástrojem je Rust WebAssembly. Bohužel, Rust (programovací jazyk) je na tom dost podobně jako C nebo C++. Nabízí extrémní rychlosti a micro-management, není však vhodný pro enterprise.

Již zmíněný Blazor je žhavá novinka. Microsoft vytvořil WebAssembly kompilátor pro C# a jakýkoliv .net standard 2.0 kód lze nyní přeložit do WebAssembly. K tomu ještě Microsoft má svůj jazyk Razor, což je velmi mocný a přehledný markup pro HTML. Pokud k těmto úžasným nástrojům ještě zamícháme SPA framework, dostaneme Blazor. K tomu můžeme mít ASP.NET Core 3 server a dostaneme naprosto dechberoucí produkt. C# je efektivní jazyk vhodný pro business/enterprise, čímž dle mého názoru staví Blazor na vrchol WebAssembly nástrojů. Dle Microsoft blogu má produkční verze Blazoru vyjít spolu s .net core 3, což je téměř za dveřmi. Trochu více informací o Blazor frameworku obsahuje článek „Single Page Appliaction front-end Frameworky a který si vybrat“.

Další nástroje pracující s WebAssembly je možné shlédnout na GIT stránce Awesome Wasm.

WebAssembly je standart, který posune web development kupředu. Budeme moci vyvíjet kód do prohlížeče v jakémkoliv jazyce s kompilátorem, jenž WebAssembly podporuje. Výsledný kód bude dokonce daleko rychlejší než samotný JavaScript. Sice si budeme muset ještě chvíli počkat na pořádné nástroje, ale časem bude možné sesadit JavaScript z diktátorství v prohlížečích a nastavit rovnováhu mezi jazyky.

Zdroje: