Programovanie

Čo je to WebAssembly? Vysvetlila webová platforma novej generácie

Už dve desaťročia máme k dispozícii iba jeden programovací jazyk, ktorý je možné natívne používať vo webovom prehliadači: JavaScript. Pomalá smrť binárnych doplnkov tretích strán vylúčila, že by pre vývoj webových aplikácií boli ako prvotriedni občania aj iné jazyky, napríklad Java a Flash ActionScript. Ostatné webové jazyky, napríklad CoffeeScript, sa kompilujú iba do JavaScriptu.

Teraz však máme novú možnosť: WebAssembly alebo skrátene WASM. WebAssembly je malý a rýchly binárny formát, ktorý sľubuje takmer natívny výkon webových aplikácií. WebAssembly je navyše navrhnutý ako cieľ kompilácie pre akýkoľvek jazyk, pričom JavaScript je iba jedným z nich. Pretože každý hlavný prehľadávač teraz podporuje WebAssembly, je čas začať vážne uvažovať o napísaní aplikácií na webe na strane klienta, ktoré je možné zostaviť ako WebAssembly.

Stojí za zmienku, že aplikácie WebAssembly nie sú určené vymeniť Aplikácie JavaScriptu - aspoň zatiaľ. Namiesto toho si WebAssembly predstavte ako spoločník do JavaScriptu. Tam, kde je JavaScript flexibilný, dynamicky písaný a dodávaný prostredníctvom človekom čitateľného zdrojového kódu, je WebAssembly vysokorýchlostný, silne písaný a dodávaný v kompaktnom binárnom formáte.

Vývojári by mali zvážiť WebAssembly pre prípady náročné na výkon, ako sú hry, streamovanie hudby, strih videa a CAD aplikácie.

Ako funguje WebAssembly

WebAssembly vyvinutá organizáciou W3C je podľa slov jej tvorcov „terčom kompilácie“. Vývojári nepíšu WebAssembly priamo; píšu v jazyku podľa svojho výberu, ktorý sa potom kompiluje do bytecode WebAssembly. Bajtkód sa potom spustí na klientovi - zvyčajne vo webovom prehliadači - kde sa preloží do natívneho strojového kódu a vykoná sa vysokou rýchlosťou.

Kód WebAssembly má byť načítaný, analyzovaný a spustený rýchlejšie ako JavaScript. Ak WebAssembly používa webový prehliadač, stále existuje réžia sťahovania a nastavovania modulu WASM, ale všetky ostatné rovnaké stránky fungujú rýchlejšie. WebAssembly tiež poskytuje model vykonania karantény, založený na rovnakých bezpečnostných modeloch, aké teraz existujú pre JavaScript.

Práve teraz je najbežnejším prípadom použitia spustenie WebAssembly vo webových prehliadačoch, ale WebAssembly by mal byť viac než len webové riešenie. Nakoniec, keď sa špecifikácia WebAssembly formuje a pribúdajú v nej ďalšie funkcie, môže sa stať užitočným v mobilných aplikáciách, desktopových aplikáciách, serveroch a iných prostrediach na vykonávanie.

Prípady použitia WebAssembly

Najzákladnejším prípadom použitia programu WebAssembly je zameranie na písanie softvéru v prehliadači. Komponenty, ktoré sú kompilované do WebAssembly, je možné písať v ktoromkoľvek z mnohých jazykov; konečné užitočné zaťaženie WebAssembly sa potom doručí cez JavaScript klientovi.

Program WebAssembly bol navrhnutý s ohľadom na množstvo výkonovo náročných prípadov použitia v prehliadači: hry, streamovanie hudby, strih videa, CAD, šifrovanie a rozpoznávanie obrázkov.

Všeobecnejšie je poučné zamerať sa pri určovaní konkrétneho prípadu použitia WebAssembly na tieto tri oblasti:

  • Vysokovýkonný kód, ktorý už existuje v zacielenom jazyku. Ak máte napríklad vysokorýchlostnú matematickú funkciu už napísanú v jazyku C a chcete ju začleniť do webovej aplikácie, môžete ju nasadiť ako modul WebAssembly. Menej kritické časti aplikácie zamerané na používateľa môžu zostať v JavaScripte.
  • Vysokovýkonný kód, ktorý je potrebné písať úplne od začiatku, kde JavaScript nie je ideálny. Predtým sa dalo na napísanie takéhoto kódu použiť asm.js. Stále tak môžete urobiť, ale WebAssembly sa umiestňuje ako lepšie dlhodobé riešenie.
  • Portovanie desktopovej aplikácie do webového prostredia. Mnoho technologických ukážok pre asm.js a WebAssembly spadá do tejto kategórie. WebAssembly môže poskytnúť podklad pre aplikácie, ktoré sú ambicióznejšie než iba grafické používateľské rozhranie prezentované prostredníctvom HTML. (Pozrite si ukážky WebDSP, Zen Garden a Tanks.) Toto však nie je triviálne cvičenie, pretože všetky spôsoby, ako sú rozhrania desktopovej aplikácie s používateľom, musia byť namapované na ekvivalenty WebAssembly / HTML / JavaScript.

Ak máte existujúcu aplikáciu v jazyku JavaScript, ktorá netlačí žiadne obálky výkonu, v tejto fáze vývoja WebAssembly je najlepšie zostať sama. Ale ak potrebujete, aby táto aplikácia šla rýchlejšie, môže pomôcť WebAssembly.

Podpora jazyka WebAssembly

WebAssembly sa nemá písať priamo. Ako už z názvu vyplýva, je to skôr montážny jazyk, ktorý stroj musí niečo spotrebovať, ako programovací jazyk priateľský k človeku na vysokej úrovni. WebAssembly je bližšie k sprostredkovanej reprezentácii (IR) generovanej infraštruktúrou prekladačov jazykov LLVM, než je to ako C alebo Java.

Väčšina scenárov pre prácu s WebAssembly teda zahŕňa písanie kódu v jazyku vyššej úrovne a ich premenu na WebAssembly. To je možné vykonať jedným z troch základných spôsobov:

  • Priama kompilácia. Zdroj je preložený do nástroja WebAssembly pomocou vlastnej jazykovej kompilácie nástrojov. Rust, C / C ++, Kotlin / Native a D teraz majú všetky natívne spôsoby, ako emitovať WASM z kompilátorov, ktoré tieto jazyky podporujú.
  • Nástroje tretích strán. Jazyk nemá vo svojej nástrojovej rade natívnu podporu WASM, ale na konverziu na WASM je možné použiť obslužný program tretej časti. Všetky typy Java, Lua a .Net majú takúto podporu.
  • Tlmočník založený na WebAssembly. Samotný jazyk tu nie je preložený do WebAssembly; tlmočník pre jazyk napísaný v nástroji WebAssembly skôr spustí kód napísaný v danom jazyku. Toto je najťažší prístup, pretože tlmočníkom môže byť niekoľko megabajtov kódu, ale umožňuje, aby existujúci kód napísaný v jazyku bežal takmer nezmenený. Python aj Ruby majú tlmočníkov preložených do jazyka WASM.

Funkcie WebAssembly

WebAssembly je stále v počiatočných fázach. Sieť nástrojov a implementácia WebAssembly zostávajú bližšie k overeniu koncepcie ako výrobné technológie. To znamená, že správcovia WebAssembly sa zameriavajú na zvyšovanie užitočnosti WebAssembly prostredníctvom série iniciatív:

Primitívy na zber odpadu

WebAssembly priamo nepodporuje jazyky, ktoré používajú pamäťové modely zhromaždené v pamäti. Jazyky ako Lua alebo Python je možné podporovať iba obmedzením množín funkcií alebo vložením celého modulu runtime ako spustiteľného súboru WebAssembly. Stále však prebiehajú práce na podpore pamäťových modelov zbieraných odpadkami bez ohľadu na jazyk alebo implementáciu.

Závitovanie

Natívna podpora vlákien je spoločná pre jazyky ako Rust a C ++. Absencia podpory vlákien vo WebAssembly znamená, že celé triedy softvéru zameraného na WebAssembly nemôžu byť napísané v týchto jazykoch. Návrh na pridanie vlákien do WebAssembly používa ako jednu z inšpirácií model vlákna C ++.

Hromadné operácie s pamäťou a SIMD

Hromadné operácie s pamäťou a paralelizmus SIMD (jedna inštrukcia, viac údajov) sú nevyhnutnosťou pre aplikácie, ktoré sa prebíjajú hromadami dát a ktoré potrebujú natívnu akceleráciu procesora, aby sa neudusili, ako napríklad strojové učenie alebo vedecké aplikácie. Na stole sú návrhy na pridanie týchto schopností do WebAssembly prostredníctvom nových operátorov.

Jazykové konštrukcie na vysokej úrovni

Mnoho ďalších funkcií, ktoré sa uvažujú pri WebAssembly, sa mapuje priamo na konštrukcie na vysokej úrovni v iných jazykoch.

  • Výnimky je možné emulovať vo WebAssembly, ale nemožno ich natívne implementovať prostredníctvom sady pokynov WebAssembly. Navrhovaný plán pre výnimky zahŕňa primitívy výnimiek kompatibilné s modelom výnimiek C ++, ktoré by zasa mohli používať iné jazyky kompilované do WebAssembly.
  • Referenčné typy uľahčujú obchádzanie objektov používaných ako odkazy na hostiteľské prostredie. Toto by uľahčilo implementáciu zberu odpadu a mnohých ďalších funkcií na vysokej úrovni vo WebAssembly.
  • Zadné hovory, návrhový vzor používaný v mnohých jazykoch.
  • Funkcie, ktoré vracajú viac hodnôt, napríklad prostredníctvom n-tíc v Pythone alebo C #.
  • Prevádzkovatelia rozšírenia značiek, užitočná matematická operácia na nízkej úrovni. (LLVM podporuje aj tieto.)

Nástroje na ladenie a profilovanie

Jedným z najväčších problémov transpilovaného JavaScriptu bola náročnosť ladenia a profilovania kvôli neschopnosti korelovať medzi transpilovaným kódom a zdrojom. S programom WebAssembly máme podobný problém a riešime ho podobným spôsobom (podpora zdrojových máp). Prečítajte si poznámku k projektu o plánovanej podpore nástrojov.

$config[zx-auto] not found$config[zx-overlay] not found