W3C-konsortiet har kunngjort klareringen av spesifikasjonen som standardiserer mellomkodene for WebAssembly 3.0 og tilknyttede API-er, som gjør det mulig å lage høyytelsesapplikasjoner som er bærbare mellom nettlesere og maskinvareplattformer. WebAssembly tilbyr en uavhengig av nettleser, universell lavnivå mellomkode for kjøring av applikasjoner kompilert fra ulike programmeringsspråk.
WebAssembly-teknologi kan brukes til å kjøre oppgaver som krever høy ytelse i nettleseren, som videokoding, lydbehandling, grafikk- og 3D-manipulasjon, spillutvikling, kryptografiske operasjoner og matematiske beregninger ved å organisere kjøring av kode skrevet på kompilérbare språk som C/C++. Bruken av JIT for WebAssembly kan oppnå ytelsesnivåer som er nært det native koden.
Blant hovedoppgavene til WebAssembly er å sikre bærbarhet, forutsigbarhet av oppførsel og identitet av kodekjøring på forskjellige plattformer. WebAssembly er ikke begrenset til nettlesere, men promotoreres også som en universell plattform for sikker kjøring av kode i enhver infrastruktur, operativsystemer og enheter.
Følgende spesifikasjoner er tilgjengelige:
- WebAssembly Core — beskriver en lavnivå virtuell maskin for kjøring av WebAssembly-mellomkode. Ressurser relatert til WebAssembly leveres i «.wasm»-format, som ligner på «.class»-filer i Java og inneholder statiske data og kodeblokker for å jobbe med disse dataene.
- WebAssembly JavaScript API — gir et API for integrasjon med JavaScript. Det gjør det mulig å hente verdier og sende parametere til WebAssembly-funksjoner. Kjøring av WebAssembly følger sikkerhetsmodellen for JavaScript, og all interaksjon med det underliggende systemet skjer på samme måte som kjøring av JavaScript-kode.
- WebAssembly Web API — definerer et programmeringsgrensesnitt basert på Promise-mekanismen for forespørsel og kjøring av ressurser i «.wasm»-format. Formatet for WebAssembly-ressurser er optimalisert for å begynne kjøring uten å vente på full lasting av filen, noe som forbedrer responsiviteten til webapplikasjoner.
- WASI API — definerer et modulært systemgrensesnitt for å kjøre WebAssembly utenfor nettlesere og gir tilgang til ressurser som filer, nettverksforbindelser, en generator for pseudotilfeldige tall og systemklokker.
Det bemerkes at den nye versjonen av standarden har betydelig forbedret støtte for kompilering av høy-nivå språk til WebAssembly. For eksempel er det mulig å kompilere prosjekter i språk som Java, OCaml, Scala, Kotlin, Scheme og Dart til WebAssembly. Hovedendringene i WebAssembly 3.0 sammenlignet med den andre versjonen av standarden inkluderer:
- Støtte for 64-biters adresseområde er implementert. For adressere minne kan nå typen i64 brukes, i tillegg til i32, noe som utvider det tilgjengelige adresseområdet for applikasjoner fra 4 GB til 16 EB (ved kjøring i nettleser er det satt en grense på 16 GB).
- Muligheten for samtidig bruk av flere minneobjekter i ett WebAssembly-modul og arbeid med forskjellige adresseområder er gitt. Blant annet er det mulig å kopiere data mellom forskjellige instanser av minneobjekter, plassert i forskjellige adresseområder.
- Støtte for søppelsamling er lagt til. I tillegg til det tidligere tilgjengelige lineære minnet, er det tilbudt en separat lagringstype som automatisk styres av en søppelsamler. Kompilatoren kan nå bruke separate datastrukturer, matriser og variabler, hvor minneutleie og livssyklusstyring håndteres av WebAssembly.
- Støtte for typehengslende referanser er lagt til, som kan beskrive den nøyaktige strukturen av den verdien referansen peker til, noe som gjør det mulig å unngå ekstra kontroller under kjøring. Underklasse, type rekursjon og mulighet for trygg bruk av funksjonsreferanser som ikke krever type- og grensekontroller under kjøring støttes.
- Støtte for haleanrop (Tail call) er lagt til, der den nåværende funksjonen umiddelbart fullfører utførelsen etter at en annen funksjon er kalt, uten å bruke plassen på stakken.
- Støtte for unntakshåndtering er lagt til.
- Støtte for «slakk» (relaxed) vektor SIMD-instruksjoner er lagt til, som gjør det mulig å oppnå høyere ytelse ved å fravike strenge overholdelse av semantikk på alle maskinvareplattformer.
- Støtte for en deterministisk kjøremodell er lagt til, som definerer plattformuavhengig atferd for instruksjoner, hvis utførelsesresultater kan variere på tvers av plattformer (flyttallsoperasjoner, returverdi NaN, svekkede vektoroperasjoner). Når denne profilen velges, gir Wasm deterministisk atferd, reproduserbarhet og portabilitet.
- Det er lagt til syntaks for å opprette egne annoteringer som gjør det mulig å feste tilleggsinformasjon til WebAssembly-koden. Tidligere var det støtte for brukerdefinerte seksjoner som lagrer vilkårlig informasjon i det binære formatet for WebAssembly, men manglet i det tekstlige formatet. Nå er det mulig å legge til denne informasjonen i et lesbart og redigerbart format.
- Det er lagt til innebygde funksjoner for å jobbe med strenger i JavaScript API. Tidligere kunne JavaScript-strenger bare overføres til WebAssembly som eksterne referanser, men nå kan man direkte referere til og manipulere strenger inne i WebAssembly.
Kilde: opennet.ru
