Najvažnije iz članka
- WASI (WebAssembly System Interface) omogućuje WebAssembly modulima pristup sistemskim resursima (poput datoteka, mreže) izvan web preglednika, čime Wasm postaje univerzalna platforma za izvršavanje.
- WASI koristi capability-based security model, pružajući granularnu kontrolu nad time kojim resursima Wasm modul može pristupiti, čime se drastično povećava sigurnost u odnosu na tradicionalne sustave.
- WASI omogućuje istinsku platformsku neovisnost za Wasm module, dopuštajući im izvršavanje na bilo kojem operativnom sustavu i arhitekturi čipa uz kompatibilan WASI runtime (npr. Wasmtime, Wasmer).
- Ključni slučajevi upotrebe WASI-ja uključuju serverless funkcije, edge computing, sigurne plug-in sustave, CLI alate i embedded sustave, otvarajući put novim generacijama performantnih i sigurnih aplikacija.
Sadržaj članka
Uvod u WebAssembly i njegov potencijal
WebAssembly (Wasm) je binarni format za izvršni kod koji je dizajniran za visoke performanse, malu veličinu i sigurnost. Njegov primarni cilj bio je omogućiti izvođenje koda bliskog izvornom ("native-like") unutar web preglednika, čime se otvaraju vrata za aplikacije koje zahtijevaju intenzivno procesiranje, poput 3D igara, video obrade ili čak složenih znanstvenih simulacija, direktno u browseru. Wasm je osmišljen kao portabilna, sigurna i brza meta kompilacije za širok spektar programskih jezika, uključujući C/C++, Rust, Go, C# i mnoge druge. Programeri su brzo prepoznali njegov potencijal kao univerzalnog, sigurnog "runtimea" za gotovo bilo koje okruženje, daleko izvan granica web preglednika.
Međutim, iako Wasm nudi iznimne performanse i sigurnosne karakteristike (zbog svog sandboxed modela izvršavanja), njegova izvorna specifikacija nije uključivala izravan pristup osnovnim sistemskim resursima. U početku je Wasm module unutar preglednika morao orkestrirati JavaScript kod, koji je tada bio odgovoran za interakciju s DOM-om, mrežom ili bilo kojim drugim resursom izvan sandboxa. To je predstavljalo značajno ograničenje za korištenje Wasm-a u scenarijima izvan preglednika, gdje je izravan pristup datotečnom sustavu, mrežnim utičnicama, okolišnim varijablama i drugim operativnim sustavima ključan.
Izazov: Wasm izvan preglednika bez sustavnog pristupa
San o Wasm-u kao univerzalnom izvršnom okruženju, sličnom, ali sigurnijem i portabilnijem od Jave Virtual Machine (JVM) ili Common Language Runtime (CLR), brzo je naišao na prepreku. Bez standardiziranog načina za pristup sistemskim resursima, svaki pokušaj izvršavanja Wasm modula na serveru, edge uređaju ili IoT uređaju zahtijevao bi prilagođene "bindings-e" i "host API-je" specifične za svaku implementaciju. To bi dovelo do fragmentacije ekosustava i poništilo bi obećanje Wasm-a o univerzalnoj prenosivosti.
Zamislite Wasm modul kompiliran iz Rust koda koji treba pročitati datoteku s diska ili uspostaviti mrežnu vezu. U kontekstu preglednika, to se radi putem JavaScript hosta. Izvan preglednika, ne postoji takav host. Wasm modul je izoliran, bez načina da "vidi" vanjski svijet. Za implementatore Wasm runtimea izvan preglednika, to znači da moraju osigurati vlastite "vanjske funkcije" koje Wasm modul može uvesti i pozvati. Svaki runtime bi imao drugačiji skup funkcija i potpisa, čineći Wasm module nekompatibilnima među različitim runtimeovima izvan preglednika.
Rješenje: WebAssembly System Interface (WASI)
WebAssembly System Interface (WASI) je odgovor na ovaj izazov. To je specifikacija koja definira standardizirani skup API-ja za pristup sistemskim resursima. Cilj WASI-ja je omogućiti Wasm modulima da komuniciraju s operativnim sustavom (ili s "host runtimeom" koji simulira operativni sustav) na siguran i prenosiv način. U suštini, WASI pruža "system calls" za WebAssembly, slično kako POSIX definira sustavne pozive za operativne sustave Unix-like.
Ključne karakteristike WASI-ja:
- Capability-based Security: WASI je dizajniran s naglaskom na sigurnost. Umjesto da daje modulima neograničen pristup sistemskim resursima, WASI se oslanja na model sigurnosti temeljen na sposobnostima ("capability-based security"). To znači da host runtime specifično mora dopustiti (ili proslijediti "sposobnost" pristupa) određenim resursima, poput određenog direktorija ili mrežne utičnice, Wasm modulu. Modul može raditi samo s resursima za koje mu je izričito dopušten pristup. Ovo je značajan napredak u odnosu na tradicionalne sustave, gdje program često ima preširoka dopuštenja.
- Platformska neovisnost: Kao i sam WebAssembly, WASI je dizajniran da bude neovisan o platformi. To znači da Wasm modul kompiliran s podrškom za WASI može raditi na bilo kojem operativnom sustavu (Linux, macOS, Windows, itd.) i na bilo kojoj arhitekturi čipa (x86, ARM, RISC-V) sve dok postoji WASI-kompatibilan runtime. Ovo osigurava istinsku prenosivost izvan preglednika.
- Modularnost i Proširivost: WASI je modularan, omogućujući inkrementalno dodavanje novih API-ja kako se potrebe razvijaju. Postoje različite "svjetovne" (world) definicije u WASI-ju, poput
wasi:snapshot_preview1(trenutno najčešće korištena) i buduće iteracije. Također, rad na komponentnom modelu ("Component Model") za Wasm obećava dodatnu modularnost i interoperabilnost između različitih Wasm komponenti, čak i ako su napisane u različitim izvornim jezicima. - Podrška za širok spektar jezika: Programski jezici poput Rusta, C/C++, Go, AssemblyScript i mnogi drugi već imaju podršku za kompilaciju u Wasm s WASI "bindings-ima". To programerima omogućuje da koriste svoje omiljene jezike za izgradnju visokoperformantnih, sigurnih serverless funkcija, edge aplikacija ili bilo kojeg drugog sustava koji koristi Wasm izvan preglednika.
Kako WASI funkcionira u praksi?
Kada se programski jezik (npr. Rust) kompilira u Wasm modul s WASI podrškom, standardni sistemski pozivi (poput open, read, write, socket) se ne prevode izravno u specifične sistemske pozive operativnog sustava. Umjesto toga, oni se prevode u pozive na WASI API-je. Ti WASI API-ji su definirani kao "import" funkcije unutar Wasm modula, koje očekuju da ih "host runtime" implementira.
Na primjer, ako Rust program pozove File::open("my_file.txt"), rustc i wasm-ld će to prevesti u Wasm instrukciju za pozivanje funkcije kao što je wasi_snapshot_preview1.fd_open. Kada se Wasm modul pokrene u WASI-kompatibilnom runtimeu (poput Wasmtime, Wasmer ili Node.js s eksperimentalnom Wasm podrškom), taj runtime presreće poziv na fd_open i prevodi ga u odgovarajući izvorni sistemski poziv (npr. open na Linuxu ili CreateFile na Windowsu), pritom primjenjujući sigurnosna ograničenja temeljem sposobnosti.
Implementacije WASI runtimea
Postoji nekoliko zrelih i aktivno razvijanih implementacija WASI runtimea:
- Wasmtime: Razvijen od strane Bytecode Alliance (koja uključuje Mozilla, Fastly, Intel, Microsoft), Wasmtime je iznimno brz, siguran i fokusiran na performanse. Često se koristi za serverless aplikacije, CLI alate i embedded sustave.
- Wasmer: Druga snažna implementacija, Wasmer, također se fokusira na univerzalno izvršavanje Wasm modula. Podržava više jezika i platformi, te se koristi u raznim scenarijima, od desktop aplikacija do blockchaina.
- Node.js: Modernije verzije Node.js-a (počevši od v15 s eksperimentalnom podrškom, a kasnije i stabilnije) počinju uključivati podršku za WASI, omogućujući programerima da pokreću Wasm module s pristupom sistemskim resursima izravno iz JavaScripta.
- Browser-based runtimes (uz polyfill): Iako je WASI primarno za izvan preglednika, postoje eksperimenti i polyfill-ovi koji omogućuju simulaciju WASI okruženja unutar preglednika, omogućujući istu poslovnu logiku da radi na obje strane.
Slučajevi upotrebe WASI-ja
WASI otvara vrata za mnoštvo novih i inovativnih slučajeva upotrebe:
- Serverless funkcije: Omogućuje kreiranje iznimno malih, brzih i sigurnih serverless funkcija koje se mogu pokrenuti u milisekundama, značajno smanjujući hladni start ("cold start") i troškove. Jezici poput Rusta idealni su za ovo, proizvodeći male binarne datoteke.
- Edge computing: Izvršavanje poslovne logike blizu izvora podataka, na edge uređajima, bez potrebe za kontejnerima ili virtualnim strojevima, smanjujući latenciju i propusnost.
- Plug-in sustavi i ekstenzije: Kreiranje sigurnih, izoliranih plug-inova i sustava proširenja gdje korisnici ili developeri trećih strana mogu pisati vlastiti kod bez kompromitiranja sigurnosti glavne aplikacije.
- CLI alati: Izgradnja ultra-brzih i portabilnih CLI alata koji mogu raditi na bilo kojem sustavu bez potrebe za specifičnim ovisnostima, osim WASI runtimea.
- Embedded sustavi i IoT: Izvršavanje poslovne logike na resursno ograničenim uređajima, gdje je mala veličina i predvidljive performanse ključno.
- Kontejnerizacija nove generacije: Wasm moduli s WASI-jem mogu biti lakša i sigurnija alternativa tradicionalnim kontejnerima (poput Dockera) za neke scenarije, uklanjajući potrebu za operativnim sustavima gostiju i smanjujući površinu napada.
Budućnost WASI-ja i WebAssembly komponentnog modela
Razvoj WASI-ja je aktivan, s fokusom na proširenje API-ja i stabilizaciju specifikacije. Jedan od najvažnijih tekućih projekata je WebAssembly Component Model. Cilj Komponentnog modela je omogućiti međusobno povezivanje Wasm modula – napisanih u različitim jezicima, uključujući "host" okruženja poput JavaScripta ili Pythona – na robustan i tipski siguran način. To će omogućiti stvaranje velikih, složenih aplikacija od malih, interoperabilnih Wasm komponenti, potičući ponovnu upotrebu koda i olakšavajući arhitekturu mikrousluga.
Komponentni model rješava problem različitih konvencija pozivanja i tipova podataka između jezika, pružajući univerzalni način za definiranje sučelja između komponenti. To će dodatno ojačati viziju WebAssemblyja kao univerzalne platforme za izgradnju distribuiranih sustava, omogućujući kombiniranje komponenti napisanih u Rustu, Go-u, C#, pa čak i JavaScriptu, sve unutar sigurnog i performantnog Wasm ekosustava.
Zaključak
WebAssembly System Interface (WASI) je ključna karika koja WebAssembly pretvara iz tehnologije usmjerene samo na web preglednike u istinski univerzalnu izvršnu platformu. Omogućujući siguran, platformski neovisan pristup sistemskim resursima, WASI otvara vrata za nebrojene primjene izvan preglednika – od serverless funkcija i edge computinga do sigurnih plug-in sustava i IoT rješenja. S kontinuiranim razvojem i obećanjima WebAssembly Component Modela, budućnost Wasm-a i WASI-ja izgleda iznimno svijetlo, obećavajući novu eru performantnih, sigurnih i prenosivih aplikacija koje se mogu izvršavati bilo gdje.
Komentari