W3C-konsortiet har publisert et utkast til en ny spesifikasjon som standardiserer mellomkoden WebAssembly 2.0 og den tilknyttede API-en, som gjør det mulig å lage høyytelsesapplikasjoner som kan overføres mellom nettlesere og maskinplattformene. WebAssembly gir en plattformuavhengig universell lavnivå mellomkode for kjøring av programmer kompilert fra forskjellige programmeringsspråk. Gjennom bruk av JIT (Just-In-Time) for WebAssembly kan man oppnå ytelsesnivåer nær native kode.
WebAssembly-teknologien kan brukes til å utføre oppgaver i nettleseren som krever høy ytelse, som videokoding, lydbehandling, grafikkmanipulering og 3D, spillutvikling, kryptografiske operasjoner og matematiske beregninger, ved å organisere kjøringen av kode skrevet i kompilerbare språk som C/C++ i nettleseren.
Blant de grunnleggende oppgavene til WebAssembly fremheves sikring av portabilitet, forutsigbarhet av oppførselen og identiteten av koden utført på forskjellige plattformer. På det siste har WebAssembly også blitt fremmet som en universell plattform for sikker kjøring av kode i alle infrastrukturer, operativsystemer og enheter, uten å være begrenset til nettlesere.
W3C har publisert tre foreløpige spesifikasjoner for WebAssembly 2.0:
- 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-grensesnittet — gir API for integrering med JavaScript. Det lar deg hente verdier og overføre parametere til WebAssembly-funksjoner. Kjøringen av WebAssembly følger sikkerhetsmodellen til JavaScript, og all interaksjon med det underliggende systemet skjer etter samme prinsipper som kjøringen 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.
De viktigste endringene i WebAssembly 2.0 sammenlignet med første versjon av standarden:
- Støtte for vektorstype v128 og tilknyttede vektorinstruksjoner som lar deg utføre operasjoner på flere numeriske verdier parallelt (SIMD, single instruction multiple data).
- Muligheten for import og eksport av mutable globale variabler som gjør det mulig å bruke global binding for verdier som stakkpekere i C++.
- Nye instruksjoner for konvertering av float til int, som i stedet for å generere unntak ved overflow returnerer det minste eller største mulige verdien (nødvendig for SIMD).
- Instruksjoner for å utvide tegn i heltall (øke bitlengden av tallet med bevaring av tegn og verdi).
- Støtte for å returnere flere verdier gjennom blokker og funksjoner (i tillegg til å sende flere parametere til funksjoner).
- Implementering av JavaScript-funksjoner BigInt64Array og BigUint64Array for konvertering mellom JavaScript-typen BigInt og representasjonen av 64-bits heltall i WebAssembly.
- Støtte for referansetypene (funcref og externref) og tilknyttede instruksjoner (select, ref.null, ref.func og ref.is_null).
- Instruksjoner memory.copy, memory.fill, memory.init og data.drop for å kopiere data mellom minneområder og rydde opp i minneområder.
- Instruksjoner for direkte tilgang og endring av tabeller (table.set, table.get, table.size, table.grow). Mulighet for å opprette, importere og eksportere flere tabeller i en modul. Funksjoner for kopiering/fylling av tabeller i batch-modus (table.copy, table.init og elem.drop).
Kilde: opennet.ru
