25.10.2021

Miksi WebAssemblyä kannattaa käyttää palvelimissa?

WebAssemblyn avuksi tarvitaan vain hyvin kevyt runtime-ympäristö. Tästä on monia etuja esim. verrattuna Docker-ympäristöön.

Turvallisuus

Palvelin suorittaa jonkun muun omistamaa koodia. Siksi on tärkeää, että vieras koodi ei pääse missään vaiheessa tekemään suoraan systeemikutsuja tai edes kirjastokutsuja isäntäkoneessa. WebAssemblyn kaikki kommunikaatio isäntäkoneen kanssa tarkastetaan, joten WebAssembly takaa suojan hyökkäyksiin isäntäkonetta vastaan.

Myöskään isäntäkoneen konekielisiä käskyjä ei suoriteta suoraan, joten käskykannan HW-bugejakaan ei päästä hyväksikäyttämään. Esim.

Spectre-haavoittuvuus.

Nopeus

Kevyt runtime tarkoittaa myös, että suoritus alkaa hyvin nopeasti, jopa tuhat kertaa nopeammin kuin kontainer-tyyppisen kuorman käynnistäminen. Yhtäaikaisia suorituksia voi myös olla paljon enemmän.

Joustavuus arkkitehtuurin suhteen

WebAssembly-ohjelmia voidaan ajaa täysin identtisesti esimerkiksi Intel- ja ARM-palvelimissa. Tämä mahdollistaa aina sopivan palvelimen käytön.

Kubernetes ja WebAssembly

WebAssembly-ohjelmia voidaan käyttää osana Kubernetes-klusteria.

Rustilla kirjoitettu Krustlet Kubelet ajaa WebAssebly-podeja kontainer-podien seassa.

Miksi JVM ei onnistunut virtuaalisena konekielenä?

WebAssembly tavoitteet ovat hyvin samanlaiset, kuin Javan virtuaalikonekielen, JVM:n alkuperäiset tavoitteet. Write once, run everywhere. Tämä ei kuitenkaan koskaan täysin onnistunut.

Java on hyvin raskas järjestelmä, ei ollenkaan yksinkertainen konekieli kuten WebAssembly. Aikaisemmin ei ole ollut korkean tason tehokasta staattista muistinvarausta tekevää kieltä kuten Rust, joten yksinkertaisempaa virtuaalikonekieltä ei ole osattu kaivata. WebAssembly onkin suorituksessa nopeampi. Paljon nopeampi.

Teoriassa tietenkin esimerkiksi C-ohjelmia voi kääntää JVM:lle. Käytännössä tämä on tehty esimerkiksi niin, että C-ohjelma käännetään hieman akateemiselle MIPS-konekoodille, ja tehty JVM:llä tulkki tälle konekoodille. Tai kääntämällä C-lähdekoodi automaattisesti Javaksi ja kääntämällä tämä. Tämä kuvastaa hyvin, miten sopimaton JVM on konekoodille ja systeemiohjelmointikielille (C, C++ ja Rust).

JVM:n turvallisuus ei ole aukoton. Sitä ei ole suunniteltu ajamaan ei-luotettuja vihamielisiä ohjelmia.

JVM kaatui melko paljon siihen, että Oracle osti sen itselleen. Sen jälkeen, kun Google hävisi oikeudessa paljon rahaa tehtyään yhteensopivan JVM-virtuaalikoneen, tuskin kukaan uskaltaa tai viitsii tehdä enää JVM-virtuaalikoneita. (Tosin Goole huijasi kopioimalla suoraan tiedostoja, mutta se ei muuta tätä lopputulosta.)