Što je WebAssembly? Objašnjena web platforma sljedeće generacije

Već dva desetljeća imamo samo jedan programski jezik dostupan za nativnu upotrebu u web pregledniku: JavaScript. Polagana smrt binarnih dodataka treće strane isključila je druge jezike, kao što su Java i Flash's ActionScript, kao prvoklasne građane za web razvoj. Ostali se web jezici, poput CoffeeScripta, samo prevode u JavaScript.

Ali sada imamo novu mogućnost: WebAssembly ili skraćeno WASM. WebAssembly je mali, brzi binarni format koji obećava gotovo izvorne performanse web aplikacija. Osim toga, WebAssembly je dizajniran da bude cilj kompilacije za bilo koji jezik, a JavaScript je samo jedan od njih. Sa svim većim preglednicima koji sada podržavaju WebAssembly, vrijeme je da počnete ozbiljno razmišljati o pisanju aplikacija na webu na strani klijenta koje se mogu kompilirati kao WebAssembly.

Vrijedno je napomenuti da aplikacije WebAssembly nisu namijenjene zamjeni JavaScript aplikacija - barem još ne. Umjesto toga, zamislite WebAssembly kao pratitelja JavaScript-a. Tamo gdje je JavaScript fleksibilan, dinamički se upisuje i isporučuje putem čitljivog izvornog koda, WebAssembly je velike brzine, snažno je otkucan i isporučuje se u kompaktnom binarnom formatu.

Programeri bi trebali razmotriti WebAssembly za slučajeve korištenja koji zahtijevaju velike performanse kao što su igre, streaming glazbe, uređivanje video zapisa i CAD aplikacije.

Kako WebAssembly radi

WebAssembly, koji je razvio W3C, prema riječima stvaratelja je "cilj kompilacije". Programeri ne pišu WebAssembly izravno; pišu na jeziku po svom izboru, koji se zatim kompajlira u bajtkod WebAssembly. Bajtkod se zatim izvodi na klijentu - obično u web pregledniku - gdje se prevodi u izvorni strojni kôd i izvršava velikom brzinom.

WebAssembly kôd namijenjen je bržem učitavanju, raščlanjivanju i izvršavanju od JavaScript-a. Kada se web-preglednik koristi WebAssembly, još uvijek je potrebno preuzeti WASM modul i postaviti ga, ali uz sve ostale jednake mogućnosti WebAssembly radi brže. WebAssembly također nudi izolirani model izvršenja, zasnovan na istim sigurnosnim modelima koji sada postoje za JavaScript.

Trenutno je pokretanje WebAssemblya u web preglednicima najčešći slučaj upotrebe, ali WebAssembly je zamišljen kao više od web rješenja. Na kraju, kako se WebAssembly specifikacije oblikuju i u njega slijeće sve više značajki, to može postati korisno u mobilnim aplikacijama, stolnim aplikacijama, poslužiteljima i drugim okruženjima izvršenja.

Slučajevi upotrebe WebAssembly

Najosnovniji slučaj upotrebe WebAssembly je cilj za pisanje softvera u pregledniku. Komponente koje se prevode u WebAssembly mogu biti napisane na bilo kojem od brojnih jezika; konačni korisni teret WebAssembly zatim se isporučuje putem JavaScript-a klijentu.

WebAssembly dizajniran je imajući u vidu brojne slučajeve korištenja koji se temelje na pregledniku: igre, streaming glazbe, uređivanje video zapisa, CAD, šifriranje i prepoznavanje slika, da nabrojimo samo neke.

Općenitije, uputno je usredotočiti se na ova tri područja prilikom određivanja vašeg konkretnog slučaja upotrebe WebAssembly:

  • Kôd visokih performansi koji već postoji na jeziku za ciljanje. Na primjer, ako imate matematičku funkciju velike brzine koja je već napisana na jeziku C i želite je ugraditi u web aplikaciju, možete je rasporediti kao modul WebAssembly. Dijelovi aplikacije koji nisu kritični prema izvedbi, a mogu biti okrenuti prema korisnicima, mogu ostati u JavaScriptu.
  • Kôd visokih performansi koji treba pisati ispočetka, gdje JavaScript nije idealan. Prije se netko mogao koristiti asm.js za pisanje takvog koda. To još uvijek možete učiniti, ali WebAssembly se pozicionira kao bolje dugoročno rješenje.
  • Prijenos radne površine na web okruženje. Mnogi tehnološki prikazi za asm.js i WebAssembly spadaju u ovu kategoriju. WebAssembly može pružiti podlogu za ambicioznije aplikacije od samo GUI-a predstavljenog putem HTML-a. (Pogledajte demonstracije WebDSP, Zen Garden i Tanks.) Međutim, ovo nije trivijalna vježba, jer svi načini sučelja radne površine s korisnikom moraju biti mapirani na ekvivalente WebAssembly / HTML / JavaScript.

Ako imate postojeću JavaScript aplikaciju koja ne gura omotnice performansi, najbolje je ostaviti nasamo u ovoj fazi razvoja WebAssemblya. Ali ako vam ta aplikacija treba brže, WebAssembly može vam pomoći.

Podrška jezika WebAssembly 

WebAssembly nije namijenjen izravnom pisanju. Kao što i samo ime govori, to je više poput sklopnog jezika, nešto što stroj treba konzumirati, nego programskog jezika prilagođenog čovjeku na visokoj razini. WebAssembly je bliži srednjem predstavljanju (IR) generiranom od strane LLVM infrastrukture za kompajliranje jezika, nego što je to slučaj s C ili Javom.

Stoga većina scenarija za rad s WebAssembly uključuje pisanje koda na jeziku visoke razine i pretvaranje tog u WebAssembly. To se može učiniti na bilo koji od tri osnovna načina:

  • Izravna kompilacija. Izvor je preveden u WebAssembly putem vlastitog lanca alatki za prerađivanje. Rust, C / C ++, Kotlin / Native i D sada svi imaju izvorne načine emitiranja WASM-a od kompajlera koji podržavaju te jezike.
  • Alati treće strane. Jezik nema izvornu podršku za WASM u svom lancu alata, ali uslužni program trećeg dijela može se koristiti za pretvaranje u WASM. Java, Lua i .Net jezična obitelj imaju određenu potporu poput ove.
  • Tumač zasnovan na WebAssembly. Ovdje se sam jezik nije preveo na WebAssembly; nego tumač za jezik, napisan u WebAssembly, pokreće kôd napisan na jeziku. Ovo je najsamariji pristup, jer tumač može biti nekoliko megabajta koda, ali omogućuje postojećem kodu napisanom na jeziku da radi sve, samo nepromijenjen. Python i Ruby imaju prevoditelje prevedene na WASM.

Značajke WebAssembly

WebAssembly je još uvijek u ranoj fazi. Lanac i implementacija alata WebAssembly i dalje su bliži provjeri koncepta od proizvodne tehnologije. Međutim, skrbnici WebAssemblya usmjereni su na to da WebAssembly čine korisnijim kroz niz inicijativa:

Primitivi za odvoz smeća

WebAssembly ne podržava izravno jezike koji koriste memorijske modele prikupljene u smeću. Jezici poput Lua ili Python mogu se podržati samo ograničavanjem skupova značajki ili ugrađivanjem cijelog vremena izvođenja kao izvršne datoteke WebAssembly. No, u tijeku je rad na podršci memorijskih modela prikupljenih smećem, bez obzira na jezik ili provedbu.

Provlačenje niti

Izvorna podrška za uvođenje niti je zajednička jezicima kao što su Rust i C ++. Odsutnost podrške za izradu navoja u programu WebAssembly znači da se na tim jezicima ne mogu pisati čitave klase ciljanog softvera WebAssembly. Prijedlog za dodavanje navoja u WebAssembly koristi C ++ model navoja kao jednu od inspiracija.

Operacije skupne memorije i SIMD

Operacije skupne memorije i paralelizam SIMD-a (pojedinačne upute, više podataka) nužni su za aplikacije koje usitnjavaju gomilu podataka i trebaju matično ubrzanje procesora kako se ne bi gušile, poput strojnog učenja ili znanstvenih aplikacija. Na raspolaganju su prijedlozi za dodavanje tih mogućnosti u WebAssembly putem novih operatora.

Jezični konstrukti na visokoj razini

Mnoge druge značajke koje se razmatraju za WebAssembly mapiraju izravno na konstrukcije na visokoj razini na drugim jezicima.

  • Iznimke se mogu oponašati u WebAssembly, ali se ne mogu implementirati nativno putem skupa uputa WebAssembly. Predloženi plan za iznimke uključuje primitive za iznimke kompatibilne s modelom iznimke C ++, koji bi pak mogli koristiti drugi jezici kompilirani za WebAssembly.
  • Tipovi referenci  olakšavaju prolazak oko objekata koji se koriste kao reference na host okruženje. To bi olakšalo prikupljanje smeća i brojne druge funkcije na visokoj razini za implementaciju u WebAssembly.
  • Repni pozivi , obrazac dizajna koji se koristi na mnogim jezicima.
  • Funkcije koje vraćaju više vrijednosti , npr. Putem korijena u Pythonu ili C #.
  • Operatori produženja znakova , korisna matematička operacija na niskoj razini. (LLVM ih također podržava.)

Alati za otklanjanje pogrešaka i profiliranje

Jedan od najvećih problema s prepisanim JavaScriptom bila je poteškoća s otklanjanjem pogrešaka i profiliranjem, zbog nemogućnosti korelacije između prepisanog koda i izvora. S WebAssemblyom imamo sličan problem i rješava se na sličan način (podrška za izvornu kartu). Pogledajte napomenu projekta o planiranoj podršci alata.