Die W3C-Konsortium hat die Fertigstellung der Spezifikation bekannt gegeben, die den standardisierten Zwischencode von WebAssembly 3.0 und die damit verbundene API definiert. Diese ermöglicht die Entwicklung von leistungsstarken Anwendungen, die plattformübergreifend zwischen Browsern und Hardware-Plattformen genutzt werden können. WebAssembly bietet browserunabhängigen, universellen, niedrig-leveligen Zwischencode für die Ausführung von Anwendungen, die aus verschiedenen Programmiersprachen kompiliert wurden.
Die WebAssembly-Technologie kann verwendet werden, um im Browser Aufgaben mit hoher Leistung auszuführen, wie zum Beispiel Video-Codierung, Audioverarbeitung, Grafik- und 3D-Manipulation, Spieleentwicklung, kryptografische Operationen und mathematische Berechnungen. Dies geschieht durch die Ausführung von Code, der in kompilierbaren Sprachen wie C/C++ geschrieben ist. Mit dem Einsatz von JIT für WebAssembly kann eine Performance erreicht werden, die nahezu mit nativem Code vergleichbar ist.
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. WebAssembly ist nicht auf Browser beschränkt und wird auch als universelle Plattform für die sichere Ausführung von Code in allen Infrastrukturen, Betriebssystemen und Geräten gefördert.
Die folgenden Spezifikationen sind verfügbar:
- 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 API – bietet eine API zur Integration mit JavaScript. Ermöglicht das Abrufen von Werten und das Übergeben von Parametern an WebAssembly-Funktionen. Die Ausführung von WebAssembly entspricht dem Sicherheitsmodell von JavaScript, und alle Interaktionen mit dem zugrunde liegenden System erfolgen analog zur 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.
- WASI API — definiert eine modulare Systemschnittstelle zum Ausführen von WebAssembly außerhalb von Browsern und bietet Zugriff auf Ressourcen wie Dateien, Netzwerkverbindungen, Zufallszahlengeneratoren und Systemuhren.
Es wird festgestellt, dass die neue Version des Standards die Unterstützung für die Kompilierung von Hochsprachen in WebAssembly erheblich verbessert hat. Beispielsweise wurde die Möglichkeit der Kompilierung von Projekten in WebAssembly aus Sprachen wie Java, OCaml, Scala, Kotlin, Scheme und Dart umgesetzt. Die wichtigsten Änderungen in WebAssembly 3.0 im Vergleich zur zweiten Version des Standards:
- Unterstützung für einen 64-Bit-Adressraum wurde implementiert. Zur Adressierung des Speichers kann nun der Typ i64 anstelle von nur i32 verwendet werden, wodurch der für Anwendungen verfügbare Adressraum von 4 GB auf 16 EB erweitert wird (im Browser besteht eine Einschränkung von 16 GB).
- Die Möglichkeit wurde hinzugefügt, mehrere Speicherobjekte gleichzeitig in einem WebAssembly-Modul zu verwenden und mit verschiedenen Adressräumen zu arbeiten. Unter anderem ist es möglich, Daten zwischen verschiedenen Instanzen von Speicherobjekten, die in unterschiedlichen Adressräumen platziert sind, zu kopieren.
- Die Unterstützung für Garbage Collection wurde hinzugefügt. Neben dem zuvor verfügbaren linearen Speicher wird ein separater Speichertyp angeboten, der automatisch mit einem Garbage Collector verwaltet wird. Der Compiler kann nun separate Datenstrukturen, Arrays und Variablen verwenden, für die WebAssembly die Speicherzuweisung und das Lebenszyklus-Management übernimmt.
- Die Unterstützung für typisierte Referenzen wurde hinzugefügt, die die genaue Struktur des Wertes, auf den verwiesen wird, beschreiben können. Dies ermöglicht es, zusätzliche Überprüfungen zur Laufzeit zu vermeiden. Es werden Subtypen, Rekursion von Typen und die sichere Verwendung von Funktionsreferenzen unterstützt, die keine Überprüfungen von Typen und Grenzen zur Laufzeit erfordern.
- Unterstützung für Tail-Call-Optimierung hinzugefügt, bei der die aktuelle Funktion die Ausführung sofort beendet, nachdem eine andere Funktion aufgerufen wurde, ohne Platz im Stack zu verbrauchen.
- Unterstützung für die Verarbeitung von Ausnahmen hinzugefügt.
- Unterstützung für "entspannte" (relaxed) SIMD-Vektor-Befehle hinzugefügt, die eine höhere Leistung ermöglichen, indem die strikte Einhaltung der Semantik auf allen Hardware-Plattformen aufgegeben wird.
- Unterstützung für ein deterministisches Ausführungsprofil hinzugefügt, das das plattformunabhängige Verhalten für Befehle definiert, deren Ausführungsergebnisse auf verschiedenen Plattformen variieren können (z. B. Gleitkomma-Operationen, Rückgabe von NaN, entspannte Vektor-Befehle). Bei Auswahl dieses Profils gewährleistet Wasm deterministisches Verhalten, Reproduzierbarkeit und Portabilität.
- Es wurde eine Syntax für die Erstellung eigener Annotations hinzugefügt, die es ermöglicht, zusätzliche Informationen zu WebAssembly-Code anzuhängen. Zuvor gab es Unterstützung für benutzerdefinierte Abschnitte zur Speicherung beliebiger Informationen im binären WebAssembly-Format, jedoch fehlte diese im textbasierten WebAssembly-Format. Nun kann diese Information in lesbarer und bearbeitbarer Form hinzugefügt werden.
- Die JavaScript-API hat integrierte Funktionen zur Bearbeitung von Strings erhalten. Bisher konnten JavaScript-Strings nur als externe Verweise an WebAssembly übergeben werden; nun ist es möglich, direkt auf Strings zuzugreifen und sie innerhalb von WebAssembly zu manipulieren.
Quelle: opennet.ru
