Das W3C-Konsortium hat einen Entwurf einer neuen Spezifikation veröffentlicht, die den Zwischencode von WebAssembly 2.0 und die zugehörige API standardisiert. Dies ermöglicht die Erstellung von hochperformanten Anwendungen, die zwischen Browsern und Hardwareplattformen portierbar sind. WebAssembly bietet einen plattformunabhängigen, universellen, niedrigstufigen Zwischencode zur Ausführung von Anwendungen, die aus verschiedenen Programmiersprachen kompiliert wurden. Durch den Einsatz von JIT für WebAssembly kann eine Performance erreicht werden, die nahezu der von nativen Codes entspricht.
Die Technologie WebAssembly kann genutzt werden, um im Browser Aufgaben mit hoher Leistungsanforderung auszuführen, z. B. Videokodierung, Audiobearbeitung, Grafikmanipulation und 3D, Spielentwicklung, kryptografische Operationen und mathematische Berechnungen, indem sie die Ausführung von Code in kompilierbaren Sprachen wie C/C++ ermöglicht.
Zu den Hauptaufgaben von WebAssembly gehört die Gewährleistung von Portabilität, Vorhersehbarkeit des Verhaltens und Identität der Codeausführung auf verschiedenen Plattformen. In letzter Zeit wird WebAssembly auch als universelle Plattform für die sichere Ausführung von Code in beliebigen Infrastrukturen, Betriebssystemen und Geräten vorangetrieben, ohne auf Browser beschränkt zu sein.
W3C hat drei Entwurfsspezifikationen für WebAssembly 2.0 veröffentlicht:
- WebAssembly Core – beschreibt eine niedrigstufige virtuelle Maschine zur Ausführung von WebAssembly-Bytecode. Die mit WebAssembly verbundenen Ressourcen werden im Format „.wasm“ bereitgestellt, das vergleichbar ist mit „.class“-Dateien in Java und statische Daten sowie Code Segmente zum Arbeiten mit diesen Daten enthält.
- WebAssembly JavaScript Interface – stellt eine API für die Integration mit JavaScript bereit. Ermöglicht es, Werte zu erhalten und Parameter in Funktionen von WebAssembly zu übergeben. Die Ausführung von WebAssembly entspricht dem Sicherheitsmodell von JavaScript, und alle Interaktionen mit dem zugrunde liegenden System erfolgen ähnlich wie bei der Ausführung von JavaScript-Code.
- WebAssembly Web API — definiert eine programmgesteuerte Schnittstelle basierend auf dem Promise-Mechanismus zur Anforderung und Ausführung von Ressourcen wie «.wasm». Das WebAssembly-Ressourcenformat ist optimiert, um die Ausführung zu starten, ohne auf den vollständigen Dateiupload zu warten, was die Responsivität von Webanwendungen erhöht.
Die wichtigsten Änderungen in WebAssembly 2.0 im Vergleich zur ersten Version des Standards:
- Unterstützung des vektoriellen Typs v128 und verwandter vektorbasierter Anweisungen, die es ermöglichen, Aktionen auf mehreren numerischen Werten gleichzeitig auszuführen (SIMD, single instruction multiple data).
- Die Möglichkeit, veränderliche (mutable) globale Variablen zu importieren und zu exportieren, ermöglicht die Anwendung von globalen Bindungen für Werte wie Stapelzeiger in C++.
- Neue Anweisungen zur Umwandlung von float in int, die anstelle der Erzeugung einer Ausnahme bei einer Überlaufbedingung den minimalen oder maximalen möglichen Wert zurückgeben (notwendig für SIMD).
- Anweisungen zur Erweiterung des Vorzeichens von Ganzzahlen (Erhöhung der Bitbreite einer Zahl unter Beibehaltung des Vorzeichens und Wertes).
- Unterstützung der Rückgabe mehrerer Werte durch Blöcke und Funktionen (neben der Übertragung mehrerer Parameter an Funktionen).
- Implementierung der JavaScript-Funktionen BigInt64Array und BigUint64Array zur Umwandlung zwischen dem JavaScript-Typ BigInt und der Darstellung von 64-Bit-Ganzzahlen in WebAssembly.
- Unterstützung von Referenztypen (funcref und externref) und den damit verbundenen Anweisungen (select, ref.null, ref.func und ref.is_null).
- Anweisungen memory.copy, memory.fill, memory.init und data.drop zum Kopieren von Daten zwischen Speicherbereichen und zum Zurücksetzen von Speicherregionen.
- Anleitungen für den direkten Zugriff und zur Änderung von Tabellen (table.set, table.get, table.size, table.grow). Möglichkeit zur Erstellung, zum Import und Export mehrerer Tabellen in einem Modul. Funktionen zum Kopieren/Initialisieren von Tabellen im Batch-Modus (table.copy, table.init und elem.drop).
Quelle: opennet.ru
