Programování

Co je WebAssembly? Vysvětlení webové platformy nové generace

Již dvě desetiletí máme k dispozici pouze jeden programovací jazyk, který lze nativně použít ve webovém prohlížeči: JavaScript. Pomalá smrt binárních zásuvných modulů třetích stran vyloučila ostatní jazyky, jako je Java a Flash ActionScript, jako občany první třídy pro vývoj webových aplikací. Jiné webové jazyky, například CoffeeScript, se kompilují pouze do JavaScriptu.

Ale teď máme novou možnost: WebAssembly nebo zkráceně WASM. WebAssembly je malý, rychlý binární formát, který slibuje téměř nativní výkon webových aplikací. Navíc je WebAssembly navržen tak, aby byl kompilačním cílem pro jakýkoli jazyk, přičemž JavaScript je jen jedním z nich. S každým hlavním prohlížečem, který nyní podporuje WebAssembly, je čas začít vážně uvažovat o psaní klientských aplikací pro web, které lze kompilovat jako WebAssembly.

Stojí za zmínku, že aplikace WebAssembly nejsou určeny nahradit Aplikace JavaScript - alespoň zatím ne. Místo toho si představte WebAssembly jako společník do JavaScriptu. Tam, kde je JavaScript flexibilní, dynamicky zadávaný a dodávaný prostřednictvím čitelného zdrojového kódu, je WebAssembly vysokorychlostní, silně typizovaný a dodává se v kompaktním binárním formátu.

Vývojáři by měli zvážit WebAssembly pro případy použití náročné na výkon, jako jsou hry, streamování hudby, úpravy videa a aplikace CAD.

Jak WebAssembly funguje

WebAssembly, vyvinutý W3C, je podle slov jeho tvůrců „kompilačním cílem“. Vývojáři nepíšou WebAssembly přímo; píší v jazyce podle svého výběru, který je poté zkompilován do bytecode WebAssembly. Bajtkód je poté spuštěn na klientovi - obvykle ve webovém prohlížeči - kde je přeložen do nativního strojového kódu a spuštěn vysokou rychlostí.

Kód WebAssembly má být rychlejší načíst, analyzovat a spustit než JavaScript. Když WebAssembly používá webový prohlížeč, stále existuje režie stahování modulu WASM a jeho nastavení, ale všechny ostatní věci, které jsou stejné WebAssembly běží rychleji. WebAssembly také poskytuje model provedení v karanténě, založený na stejných modelech zabezpečení, jaké nyní existují pro JavaScript.

Právě teď je spuštění WebAssembly ve webových prohlížečích nejběžnějším případem použití, ale WebAssembly je zamýšlen jako více než webové řešení. Nakonec, jak se specifikace WebAssembly utváří a přistávají v ní další funkce, může se stát užitečným v mobilních aplikacích, desktopových aplikacích, serverech a dalších prostředích pro provádění.

Případy použití WebAssembly

Nejzákladnějším případem použití pro WebAssembly je cíl psaní softwaru v prohlížeči. Komponenty, které jsou kompilovány do WebAssembly, lze psát v libovolném z mnoha jazyků; konečné užitečné zatížení WebAssembly je poté doručeno klientovi prostřednictvím JavaScriptu.

WebAssembly byl navržen s ohledem na řadu výkonově náročných případů použití založených na prohlížeči: hry, streamování hudby, úpravy videa, CAD, šifrování a rozpoznávání obrázků, abychom jmenovali jen několik.

Obecněji řečeno, je poučné zaměřit se při určování konkrétního případu použití WebAssembly na tyto tři oblasti:

  • Vysoce výkonný kód, který již existuje v cíleném jazyce. Například pokud máte v C napsanou vysokorychlostní matematickou funkci a chcete ji začlenit do webové aplikace, můžete ji nasadit jako modul WebAssembly. Méně výkonné, uživatelsky orientované části aplikace mohou zůstat v JavaScriptu.
  • Vysoce výkonný kód, který je třeba psát úplně od začátku, kde JavaScript není ideální. Dříve bylo možné k napsání takového kódu použít asm.js. Stále to můžete udělat, ale WebAssembly se umisťuje jako lepší dlouhodobé řešení.
  • Portování desktopové aplikace do webového prostředí. Mnoho technologických ukázek pro asm.js a WebAssembly spadá do této kategorie. WebAssembly může poskytnout podklad pro aplikace, které jsou ambicióznější než pouhé GUI prezentované prostřednictvím HTML. (Viz ukázky WebDSP, Zen Garden a Tanks.) Nejedná se však o triviální cvičení, protože všechny způsoby, jakými jsou rozhraní desktopové aplikace s uživatelem mapována na ekvivalenty WebAssembly / HTML / JavaScript.

Pokud máte existující aplikaci JavaScriptu, která netlačí žádné obálky výkonu, je v této fázi vývoje WebAssembly nejlepší ji nechat na pokoji. Ale pokud potřebujete, aby tato aplikace šla rychleji, může pomoci WebAssembly.

Podpora jazyka WebAssembly

WebAssembly není určen k přímému zápisu. Jak název napovídá, je to spíš montážní jazyk, něco, co stroj spotřebuje, než programovací jazyk přátelský k lidem na vysoké úrovni. WebAssembly je blíže k prostřední reprezentaci (IR) generované infrastrukturou překladačů jazyků LLVM, než je to jako C nebo Java.

Většina scénářů pro práci s WebAssembly tedy zahrnuje psaní kódu v jazyce na vysoké úrovni a jeho převedení na WebAssembly. To lze provést některým ze tří základních způsobů:

  • Přímá kompilace. Zdroj je přeložen do WebAssembly pomocí vlastního jazykového překladače nástrojů. Rust, C / C ++, Kotlin / Native a D nyní mají všechny nativní způsoby, jak emitovat WASM z překladačů, které tyto jazyky podporují.
  • Nástroje třetích stran. Jazyk ve své nástrojové řadě nemá nativní podporu WASM, ale k převodu na WASM lze použít nástroj třetí části. Java, Lua a jazyková rodina .Net mají všechny takovou podporu.
  • Interpret založený na WebAssembly. Samotný jazyk zde není přeložen do WebAssembly; spíše tlumočník pro jazyk, napsaný ve WebAssembly, spouští kód napsaný v jazyce. Toto je nejtěžší přístup, protože tlumočník může mít několik megabajtů kódu, ale umožňuje existujícímu kódu napsanému v jazyce běžet téměř beze změny. Python a Ruby mají tlumočníky přeložené do WASM.

Funkce WebAssembly

WebAssembly je stále v raných fázích. Řetězec nástrojů a implementace WebAssembly zůstávají blíže důkazu koncepce než výrobní technologie. To znamená, že správci společnosti WebAssembly se zaměřili na to, aby byla WebAssembly užitečnější prostřednictvím řady iniciativ:

Odpadky primitivů

WebAssembly nepodporuje přímo jazyky, které používají paměťové modely shromážděné v paměti. Jazyky jako Lua nebo Python lze podporovat pouze omezením sad funkcí nebo vložením celého modulu runtime jako spustitelného souboru WebAssembly. Probíhá však práce na podpoře nesmyslných paměťových modelů bez ohledu na jazyk nebo implementaci.

Závitování

Nativní podpora pro vlákna je společná pro jazyky, jako je Rust a C ++. Absence podpory podprocesů ve WebAssembly znamená, že v těchto jazycích nelze psát celé třídy softwaru zaměřeného na WebAssembly. Návrh na přidání podprocesů do WebAssembly používá jako jednu ze svých inspirací model podprocesů C ++.

Hromadné operace s pamětí a SIMD

Hromadné operace s pamětí a paralelismus SIMD (jedna instrukce, více dat) jsou nutností pro aplikace, které procházejí hromadami dat a potřebují nativní akceleraci CPU, aby se neudusily, jako je strojové učení nebo vědecké aplikace. Na stole jsou návrhy na přidání těchto funkcí do WebAssembly prostřednictvím nových operátorů.

Jazykové konstrukce na vysoké úrovni

Mnoho dalších funkcí uvažovaných pro WebAssembly mapuje přímo na konstrukty na vysoké úrovni v jiných jazycích.

  • Výjimky lze emulovat ve WebAssembly, ale nelze je nativně implementovat pomocí sady instrukcí WebAssembly. Navrhovaný plán výjimek zahrnuje primitiva výjimek kompatibilní s modelem výjimek C ++, které by zase mohly být použity jinými jazyky kompilovanými do WebAssembly.
  • Referenční typy usnadňují předávání objektů používaných jako odkazy na hostitelské prostředí. To by usnadnilo implementaci uvolňování paměti a řadu dalších funkcí na vysoké úrovni ve WebAssembly.
  • Ocas volání, návrhový vzor používaný v mnoha jazycích.
  • Funkce, které vracejí více hodnot, např. prostřednictvím n-tic v Pythonu nebo C #.
  • Operátoři rozšíření znaménka, užitečná matematická operace na nízké úrovni. (LLVM podporuje i tyto.)

Nástroje pro ladění a profilování

Jedním z největších problémů s transpilovaným JavaScriptem byla obtížnost ladění a profilování kvůli neschopnosti korelovat mezi transpilovaným kódem a zdrojem. S WebAssembly máme podobný problém a řeší se to podobným způsobem (podpora zdrojové mapy). Viz poznámka k projektu týkající se plánované podpory nástrojů.