Kahden vuosikymmenen ajan meillä on ollut vain yksi ohjelmointikieli, jota voit käyttää verkkoselaimessa natiivisti: JavaScript. Kolmannen osapuolen binaaristen laajennusten hidas kuolema on sulkenut pois muut kielet, kuten Java ja Flashin ActionScript, ensimmäisen luokan kansalaisina verkkokehityksessä. Muut verkkokielet, kuten CoffeeScript, on vain käännetty JavaScriptiksi.
Mutta nyt meillä on uusi mahdollisuus: WebAssembly tai lyhyesti WASM. WebAssembly on pieni, nopea binaarimuoto, joka lupaa lähes alkuperäisen suorituskyvyn verkkosovelluksille. Lisäksi WebAssembly on suunniteltu kääntökohteeksi mille tahansa kielelle, JavaScript on vain yksi niistä. Kun kaikki suuret selaimet tukevat nyt WebAssembly-ohjelmaa, on aika alkaa miettiä vakavasti sellaisten asiakaspuolen sovellusten kirjoittamista verkkoon, jotka voidaan koota WebAssembly-nimisenä.
On syytä huomata, että WebAssembly-sovelluksia ei ole tarkoitettu korvata JavaScript-sovellukset - ainakaan vielä. Ajattele sen sijaan WebAssemblya a kumppani JavaScriptiin. Jos JavaScript on joustava, dynaamisesti kirjoitettu ja toimitettu ihmisen luettavissa olevan lähdekoodin kautta, WebAssembly on nopea, kirjoitettu voimakkaasti ja toimitettu kompaktin binaarimuodon kautta.
Kehittäjien tulisi harkita WebAssemble-ohjelmistoa suorituskykyintensiivisissä käyttötapauksissa, kuten peleissä, musiikin suoratoistossa, videoiden muokkauksessa ja CAD-sovelluksissa.
Kuinka WebAssembly toimii
W3C: n kehittämä WebAssembly on sen luojien sanoin "kokoamiskohde". Kehittäjät eivät kirjoita WebAssemblya suoraan; he kirjoittavat valitsemallaan kielellä, joka sitten kootaan WebAssembly-tavukoodiksi. Tavukoodi suoritetaan sitten asiakkaalla - tyypillisesti verkkoselaimella -, jossa se käännetään alkuperäiseksi konekoodiksi ja suoritetaan suurella nopeudella.
WebAssembly-koodin on tarkoitus olla nopeampi ladata, jäsentää ja suorittaa kuin JavaScript. Kun web-selain käyttää WebAssembly-ohjelmaa, WASM-moduulin lataaminen ja asettaminen on edelleen yleiskustannuksia, mutta kaikki muut WebAssembly-toiminnot ovat nopeampi. WebAssembly tarjoaa myös hiekkalaatikkoon perustuvan suoritusmallin, joka perustuu samoihin suojausmalleihin, jotka ovat olemassa nyt JavaScriptille.
Tällä hetkellä WebAssemble-ohjelman suorittaminen selaimissa on yleisin käyttötapa, mutta WebAssembly on tarkoitettu enemmän kuin verkkopohjaiseksi ratkaisuksi. Loppujen lopuksi, kun WebAssembly-Spec muotoilee ja lisää ominaisuuksia laskeutuu siihen, siitä voi tulla hyötyä mobiilisovelluksissa, työpöytäsovelluksissa, palvelimissa ja muissa suoritusympäristöissä.
WebAss kokoonpanon käyttötapaukset
WebAssemblyn perustavin käyttötapaus on kohde kirjoittaa selaimen ohjelmistoja. WebAssembly-palveluun kootut komponentit voidaan kirjoittaa millä tahansa useilla kielillä; lopullinen WebAssembly-hyötykuorma toimitetaan sitten JavaScriptin kautta asiakkaalle.
WebAssembly on suunniteltu ottaen huomioon useita suorituskykyä vaativia, selainpohjaisia käyttötapauksia: pelit, musiikin suoratoisto, videon muokkaus, CAD, salaus ja kuvan tunnistus vain muutamia mainitakseni.
Yleisemmin on opettavaista keskittyä näihin kolmeen alueeseen määritettäessä tiettyä WebAssemble-käyttötapaa:
- Tehokas koodi, joka on jo olemassa kohdennettavalla kielellä. Esimerkiksi, jos sinulla on nopea matematiikkatoiminto, joka on jo kirjoitettu C-kirjaimella, ja haluat sisällyttää sen verkkosovellukseen, voit käyttää sitä WebAssembly-moduulina. Sovelluksen vähemmän suorituskykykriittiset, käyttäjäkohtaiset osat voivat jäädä JavaScriptiin.
- Tehokas koodi, joka on kirjoitettava tyhjästä, missä JavaScript ei ole ihanteellinen. Aikaisemmin on ehkä käytetty asm.js: tä tällaisen koodin kirjoittamiseen. Voit silti tehdä niin, mutta WebAssembly on sijoitettu paremmaksi pitkän aikavälin ratkaisuksi.
- Työpöytäsovelluksen siirtäminen verkkoympäristöön. Monet asm.js- ja WebAssembly-tekniikan demoista kuuluvat tähän luokkaan. WebAssembly voi tarjota alustan sovelluksille, jotka ovat kunnianhimoisempia kuin vain HTML: n kautta esitettävä graafinen käyttöliittymä. (Katso WebDSP-, Zen Garden- ja Tanks-esittelyt.) Tämä ei kuitenkaan ole vähäpätöinen harjoitus, koska kaikki tapat, joilla työpöytäsovellus on käyttäjän kanssa, on kartoitettava WebAssembly / HTML / JavaScript-vastaaviin.
Jos sinulla on olemassa oleva JavaScript-sovellus, joka ei työnnä mitään suorituskyvyn kirjekuoria, se on parasta jättää yksin tässä WebAssemblyn kehitysvaiheessa. Mutta jos tarvitset sovellusta nopeammin, WebAssembly voi auttaa.
WebAssembly-kielen tuki
WebAss kokoonpanoa ei ole tarkoitettu kirjoitettavaksi suoraan. Kuten nimestä käy ilmi, se on enemmän kuin kokoonpanokieli, jotain mitä kone tarvitsee käyttää, kuin korkean tason, ihmisystävällinen ohjelmointikieli. WebAssembly on lähempänä LLVM-kielen kääntäjäinfrastruktuurin tuottamaa väliesitystä (IR) kuin se on kuin C tai Java.
Siten useimmissa WebAssembly-työskentelyskenaarioissa koodin kirjoittaminen korkean tason kielellä ja sen muuttaminen WebAssembly-muotoon. Tämä voidaan tehdä millä tahansa kolmesta perustavasta:
- Suora kokoaminen. Lähde käännetään WebAss kokoonpanoon kielen oman kääntäjän työkaluketjun avulla. Rustilla, C / C ++: lla, Kotlin / Native: lla ja D: llä on nyt kaikilla natiivityyppejä lähettää WASMia kääntäjiltä, jotka tukevat näitä kieliä.
- Kolmannen osapuolen työkalut. Kielen työkaluketjussa ei ole alkuperäistä WASM-tukea, mutta kolmannen osan apuohjelmaa voidaan käyttää muuntamiseen WASM: ksi. Java, Lua ja .Net-kieliperheillä on kaikilla tällaista tukea.
- WebAssembly-pohjainen tulkki. Tällöin itse kieltä ei käännetä WebAssembly-muotoon; pikemminkin kielen tulkki, joka on kirjoitettu WebAssembly: ssä, suorittaa kielellä kirjoitetun koodin. Tämä on kaikkein hankalin tapa, koska tulkki voi olla useita megatavuja koodia, mutta se sallii olemassa olevan kielellä kirjoitetun koodin suorittaa kaiken paitsi muuttumattomana. Python ja Ruby ovat molemmat tulkit käännetty WASM: iin.
WebAss kokoonpanon ominaisuudet
WebAssembly on vielä alkuvaiheessa. WebAssembly-työkaluketju ja toteutus ovat edelleen lähempänä konseptin todistamista kuin tuotantotekniikkaa. Siitä huolimatta WebAssembleyn huoltajien tehtävänä on tehdä WebAssemblystä hyödyllisempi joukon aloitteita:
Jätteiden keräyksen primitiivit
WebAssembly ei tue suoraan kieliä, jotka käyttävät roskakoriin tallennettuja muistimalleja. Kieliä, kuten Lua tai Python, voidaan tukea vain rajoittamalla ominaisuusjoukkoja tai upottamalla koko ajonaika WebAssembly-suoritustiedostona. Mutta roskien keräämien muistimallien tukemiseksi on meneillään kielestä tai toteutuksesta riippumatta.
Langoitus
Alkuperäinen ketjuttamisen tuki on yhteistä kielille, kuten Rust ja C ++. Langoitustuen puuttuminen WebAssembly-ohjelmasta tarkoittaa, että kokonaisia WebAssembly-ohjelmistoja ei voida kirjoittaa näillä kielillä. Ehdotus ketjun lisäämisestä WebAssemble-sivustoon käyttää C ++ -kierrämallia yhtenä inspiraationaan.
Bulkimuistitoiminnot ja SIMD
Joukkomuistitoiminnot ja SIMD (yksittäinen käsky, useita tietoja) rinnakkaisuus ovat pakollisia sovelluksille, jotka jauhavat datapinoa ja tarvitsevat natiivia suorittimen kiihdytystä tukkeutumisen välttämiseksi, kuten koneoppiminen tai tieteelliset sovellukset. Ehdotuksia näiden ominaisuuksien lisäämisestä WebAssemble-järjestelmään uusien operaattoreiden kautta on käsiteltävänä.
Korkean tason kielirakenteet
Monet muut WebAssembly-palvelussa harkitut ominaisuudet kartoittavat suoraan korkean tason rakenteisiin muilla kielillä.
- Poikkeukset voidaan jäljitellä WebAssemble-palvelussa, mutta sitä ei voida toteuttaa natiivisti WebAssembly-käskyjoukon kautta. Ehdotettu poikkeussuunnitelma sisältää C ++ -poikkeusmallin kanssa yhteensopivia poikkeusalkuprimitiivejä, joita vuorostaan voisivat käyttää muut WebAssembly-sivustoon kootut kielet.
- Viitetyypit helpottaa isäntäympäristöön viitteinä käytettyjen esineiden kulkua. Tämä tekisi roskien keräämisen ja useita muita korkean tason toimintoja helpommin toteutettaviksi WebAssembly-sovelluksessa.
- Häntäpuhelut, suunnittelukuvio, jota käytetään monilla kielillä.
- Toiminnot, jotka palauttavat useita arvojaesim. Pythonin tai C #: n joukkoina.
- Kyltinlaajennusoperaattorit, hyödyllinen matalan matematiikan operaatio. (LLVM tukee myös näitä.)
Virheenkorjaus- ja profilointityökalut
Yksi suurimmista siirretyn JavaScriptin ongelmista oli virheenkorjauksen ja profiloinnin vaikeus johtuen kyvyttömyydestä korreloida siirretyn koodin ja lähteen välillä. WebAssemblyn kanssa meillä on samanlainen ongelma, ja sitä käsitellään samalla tavalla (lähdekarttatuki). Katso projektin huomautus suunnitellusta työkalutyökalusta.