Programiranje

Kaj je WebAssembly? Razložena spletna platforma naslednje generacije

Že dve desetletji imamo v spletnem brskalniku na voljo samo en programski jezik: JavaScript. Počasna smrt neodvisnih binarnih vtičnikov je izključila druge jezike, kot sta Java in Flash's ActionScript, kot prvovrstne državljane za spletni razvoj. Drugi spletni jeziki, kot je CoffeeScript, so zgolj prevedeni v JavaScript.

Zdaj pa imamo novo možnost: WebAssembly ali na kratko WASM. WebAssembly je majhen, hiter binarni format, ki obljublja skoraj naravno delovanje spletnih aplikacij. Poleg tega je WebAssembly zasnovan kot cilj zbiranja za kateri koli jezik, JavaScript pa je le eden izmed njih. Z vsakim večjim brskalnikom, ki zdaj podpira WebAssembly, je čas, da začnemo resno razmišljati o pisanju odjemalskih aplikacij za splet, ki jih je mogoče sestaviti kot WebAssembly.

Omeniti velja, da aplikacije WebAssembly niso namenjene zamenjati Aplikacije JavaScript - vsaj še ne. Namesto tega si WebAssembly predstavljajte kot družabnik v JavaScript. Kjer je JavaScript prilagodljiv, dinamično vtipkan in dostavljen prek človeško berljive izvorne kode, je WebAssembly hiter, močno vtipkan in dostavljen v kompaktnem binarnem formatu.

Razvijalci bi morali razmisliti o WebAssembly za primere z visoko zmogljivostjo, kot so igre, pretakanje glasbe, urejanje videoposnetkov in CAD aplikacije.

Kako deluje WebAssembly

WebAssembly, ki ga je razvil W3C, je po besedah ​​ustvarjalcev "cilj zbiranja". Razvijalci ne pišejo WebAssembly neposredno; pišejo v izbranem jeziku, ki se nato zbere v bajtno kodo WebAssembly. Nato se bajtoda izvede na odjemalcu - običajno v spletnem brskalniku -, kjer se prevede v izvorno strojno kodo in izvede z visoko hitrostjo.

Koda WebAssembly je namenjena hitrejšemu nalaganju, razčlenjevanju in izvajanju kot JavaScript. Ko spletni brskalnik uporablja WebAssembly, je še vedno treba prenesti modul WASM in ga nastaviti, vendar ob drugih enakih pogojih WebAssembly teče hitreje. WebAssembly ponuja tudi izvedbeni model, ki temelji na enakih varnostnih modelih, ki obstajajo za JavaScript zdaj.

Trenutno je zagon WebAssembly v spletnih brskalnikih najpogostejši primer uporabe, toda WebAssembly naj bi bil več kot le spletna rešitev. Ko se specifikacija WebAssembly oblikuje in v njej pristane več funkcij, bo sčasoma lahko uporabna v mobilnih aplikacijah, namiznih aplikacijah, strežnikih in drugih izvedbenih okoljih.

Primeri uporabe WebAssembly

Najosnovnejši primer uporabe WebAssembly je cilj pisanja programske opreme v brskalniku. Komponente, ki se prevedejo v WebAssembly, so lahko napisane v katerem koli od številnih jezikov; končni tovor WebAssembly se nato prek JavaScripta dostavi odjemalcu.

WebAssembly je bil zasnovan z upoštevanjem številnih uporabnih primerov, ki temeljijo na brskalnikih: igre, pretakanje glasbe, urejanje videoposnetkov, CAD, šifriranje in prepoznavanje slik, če naštejemo le nekatere.

Na splošno je poučno, da se pri določanju primera uporabe WebAssembly osredotočite na ta tri področja:

  • Koda visoke zmogljivosti, ki že obstaja v jeziku, na katerega je mogoče ciljati. Če imate na primer matematično funkcijo za visoke hitrosti, ki je že napisana v jeziku C in jo želite vključiti v spletno aplikacijo, jo lahko namestite kot modul WebAssembly. Manj kritični za delovanje, uporabniku naklonjeni deli aplikacije lahko ostanejo v JavaScript.
  • Koda visoke zmogljivosti, ki jo je treba napisati iz nič, kjer JavaScript ni idealen. Prej je nekdo morda uporabljal asm.js za pisanje takšne kode. To lahko še vedno storite, vendar je WebAssembly postavljena kot boljša dolgoročna rešitev.
  • Prenos namizne aplikacije v spletno okolje. Številne predstavitve tehnologije za asm.js in WebAssembly spadajo v to kategorijo. WebAssembly lahko zagotovi podlago za aplikacije, ki so bolj ambiciozne kot le GUI, predstavljen prek HTML-ja. (Glejte predstavitve WebDSP, Zen Garden in Tanks.) Vendar to ni nepomembna vaja, saj morajo biti vsi načini vmesnikov namizne aplikacije z uporabnikom preslikani v ustreznike WebAssembly / HTML / JavaScript.

Če imate obstoječo aplikacijo JavaScript, ki ne potiska nobenih ovojnic uspešnosti, je najbolje, da jo na tej stopnji razvoja WebAssembly pustite pri miru. Če pa želite, da ta aplikacija deluje hitreje, vam lahko pomaga WebAssembly.

Podpora za jezik WebAssembly

WebAssembly ni namenjen pisanju neposredno. Kot že ime pove, je bolj kot montažni jezik, nekaj, kar naj stroj porabi, kot pa na človeku prijazen programski jezik na visoki ravni. WebAssembly je bližje vmesni predstavitvi (IR), ki jo ustvarja infrastruktura prevajalnika jezikov LLVM, kot pa C ali Java.

Tako večina scenarijev za delo z WebAssembly vključuje pisanje kode v jeziku na visoki ravni in njeno spreminjanje v WebAssembly. To lahko storite na katerega koli od treh osnovnih načinov:

  • Neposredna kompilacija. Vir je preveden v WebAssembly s pomočjo lastne orodne verige prevajalnika. Rust, C / C ++, Kotlin / Native in D imajo zdaj izvorne načine za oddajanje WASM iz prevajalnikov, ki podpirajo te jezike.
  • Orodja drugih proizvajalcev. Jezik v svoji verigi orodij nima podpore za domači WASM, vendar lahko za pretvorbo v WASM uporabite pripomoček iz tretjega dela. Java, Lua in jezikovna družina .Net imajo nekaj takšne podpore.
  • Tolmač, ki temelji na WebAssembly. Tu sam jezik ni preveden v WebAssembly; tolmač za jezik, napisan v WebAssembly, zažene kodo, napisano v jeziku. To je najbolj okoren pristop, saj ima lahko tolmač več megabajtov kode, vendar omogoča, da obstoječa koda, napisana v jeziku, deluje vse, razen nespremenjene. Python in Ruby imata tolmače, prevedene v WASM.

Funkcije spletnega sestavljanja

WebAssembly je še vedno v začetni fazi. Veriga orodij WebAssembly in implementacija ostajata bližje dokazom o konceptu kot proizvodna tehnologija. Skrbniki WebAssembly si prizadevajo, da bi WebAssembly z vrsto pobud postali bolj uporabni:

Primitivi za odvoz smeti

WebAssembly neposredno ne podpira jezikov, ki uporabljajo pomnilniške modele, zbrane v smeti. Jezika, kot sta Lua ali Python, je mogoče podpreti samo z omejevanjem naborov funkcij ali z vdelavo celotnega izvajalnega okolja kot izvedljive datoteke WebAssembly. Vendar poteka delo za podporo modelom zbranega pomnilnika, ne glede na jezik ali izvedbo.

Navoja

Izvorna podpora za navoje je skupna jezikom, kot sta Rust in C ++. Odsotnost podpore z nitmi v programu WebAssembly pomeni, da v te jezike ni mogoče pisati celotnih razredov programske opreme, ciljno usmerjene na WebAssembly. Predlog za dodajanje navojev v WebAssembly uporablja model navojev C ++ kot enega od svojih navdihov.

Operacije v velikem pomnilniku in SIMD

Operacije množičnega pomnilnika in vzporednost SIMD (enojno navodilo, več podatkov) so nujne za aplikacije, ki meljejo med kupe podatkov in potrebujejo domače pospeševanje CPU, da se ne zadušijo, na primer strojno učenje ali znanstvene aplikacije. Na mizi so predlogi za dodajanje teh zmožnosti v WebAssembly prek novih operaterjev.

Jezikovne konstrukcije na visoki ravni

Številne druge funkcije, ki se upoštevajo pri WebAssembly, se preslikajo neposredno na konstrukcije visoke ravni v drugih jezikih.

  • Izjeme je mogoče posnemati v WebAssembly, vendar je ni mogoče izvesti v izvorni obliki z naborom navodil WebAssembly. Predlagani načrt za izjeme vključuje primitivne izjeme, združljive z modelom izjeme C ++, ki bi jih lahko nato uporabljali drugi jeziki, zbrani v WebAssembly.
  • Referenčne vrste olajšajo prenašanje predmetov, ki se uporabljajo kot sklici na gostiteljsko okolje. To bi olajšalo zbiranje smeti in številne druge funkcije na visoki ravni za lažjo izvedbo v WebAssembly.
  • Repni klici, oblikovalski vzorec, ki se uporablja v mnogih jezikih.
  • Funkcije, ki vrnejo več vrednosti, npr. prek nabora v Pythonu ali C #.
  • Operatorji razširitve znakov, uporabna matematična operacija na nizki ravni. (LLVM jih tudi podpira.)

Orodja za odpravljanje napak in profiliranje

Ena največjih težav s prepisanim JavaScriptom je bila težava pri odpravljanju napak in profiliranju zaradi nezmožnosti korelacije med prepisano kodo in virom. Pri WebAssembly imamo podobno težavo in jo obravnavamo na podoben način (podpora za izvorni zemljevid). Glej opombo projekta o načrtovani podpori orodja.

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