11 Punkte von GN⁺ 2025-05-10 | 2 Kommentare | Auf WhatsApp teilen
  • Die Wasm-2.0-Spezifikation wurde offiziell veröffentlicht
  • Die Wasm Community und die Working Groups haben die Spezifikation seit 2022 fertiggestellt, und wichtige Implementierungen unterstützten 2.0 bereits
  • Ab 2.0 wird ein Evergreen-Modell eingeführt, bei dem das Candidate-Recommendation-Dokument fortlaufend auf dem neuesten Stand gehalten wird
  • Bei der Veröffentlichung neuer Versionen wird nicht jedes Mal in eine finale Empfehlung überführt; stattdessen gilt der aktuelle Empfehlungsentwurf als Standard

Wichtige Funktionen und Ergänzungen in Wasm 2.0

  • Vektor-Instruktionen (SIMD): 236 neue Instruktionen ermöglichen die Nutzung der 128-Bit-SIMD-Funktionen moderner CPUs und sind effizient für leistungsstarke Audio-/Video-Codecs, Machine Learning, Kryptografie und mehr
  • Bulk-Memory-Instruktionen: Ein Befehlssatz für schnelles Kopieren und Initialisieren von Speicher und Tabellen wurde hinzugefügt
  • Multi-Value-Rückgaben: Funktionen und Blöcke können mehrere Werte zurückgeben, wodurch Calling Conventions verbessert und zusätzliche Programmtransformationen möglich werden
  • Referenztypen: Referenzen auf Funktionen oder Zeiger auf externe Objekte (z. B. JavaScript-Werte) werden als opake First-Class-Werte unterstützt; Tabellen können als Speicher für diese Referenzwerte dienen, und Instruktionen zur Tabellenverarbeitung sowie Definitionen mehrerer Tabellen werden möglich
  • Non-Trapping-Conversions: Es wurden Konvertierungsinstruktionen eingeführt, die bei der Umwandlung von Gleitkommazahlen in Ganzzahlen keine unerwarteten Traps auslösen
  • Sign-Extension-Instruktionen: Instruktionen zur direkten Erweiterung der Breite vorzeichenbehafteter Ganzzahlen wurden ergänzt, sodass dies nun ohne Speicherzugriff möglich ist

Abwärtskompatibilität und Ausblick

  • Wasm 2.0 ist vollständig kompatibel mit 1.0, sodass bestehende Programme unverändert weiterlaufen
  • Die Veröffentlichung von Wasm 3.0 wird ebenfalls in Kürze erwartet

2 Kommentare

 
caniel 2025-05-10

WA!(SM)

 
GN⁺ 2025-05-10
Hacker-News-Kommentare
  • Fasst man die Ankündigung von WASM 2.0 aus dem März 2025 zusammen, ist es ein großes Upgrade: 236 neue Vektor-Instruktionen wie 128-Bit-SIMD steigern die Leistung von Video-/Audio-Codecs, Machine Learning und kryptografischen Anwendungen deutlich; Bulk-Memory-Instruktionen unterstützen schnelles Kopieren/Initialisieren von Speicher; Funktionen können nun mehrere Ergebnisse zurückgeben, was schnellere Calling Conventions und weniger indirekte Referenzen ermöglicht; mit Referenztypen lassen sich Zeiger auf externe Objekte (etwa JavaScript-Werte) als First-Class-Values behandeln; Tabellen mit mehreren Typen können deklariert werden; hinzu kommen Instruktionen zur Erweiterung von Bitbreiten sowie Gleitkomma-Konvertierungen ohne unerwartete Traps
    • Rust+LLVM können die Unterstützung für die Rückgabe mehrerer Ergebnisse wegen Problemen mit der ABI-Kompatibilität in der Praxis noch nicht nutzen; wie der Stand bei Clang ist, weiß ich nicht
    • Der Teil mit den Vektor-Instruktionen (SIMD) wirkt unnötig komplex, weil man zu früh auf Optimierung gesetzt hat; der Vorschlag für flexible Größe von Vektoren wäre eleganter gewesen
    • Die Funktion zur Rückgabe mehrerer Ergebnisse wäre auch für die Entwicklung einer Common-Lisp-Runtime sehr nützlich
    • Im letzten Absatz des offiziellen Posts steht „eine Vorstellung von Wasm 3.0 folgt bald“, daher scheint Wasm 3.0 tatsächlich nicht mehr fern zu sein
    • Eine architekturunabhängige, allgemeine ISA und eine ISA, die CPU-spezifisches SIMD maximal ausnutzt, sind nicht miteinander vereinbar; man muss sich für eine Seite entscheiden. Ob die aktuellen Wasm2-SIMD-Instruktionen allgemein genug sind, konnte ich wegen des GitHub-Rate Limits nicht prüfen
  • Die WebAssembly-Spezifikation ist recht gut lesbar, aber Einsteigern, die nicht den gesamten Spec lesen wollen, empfehle ich das Online-Buch WebAssembly from the Ground Up. Man lernt Schritt für Schritt, indem man in JavaScript selbst einen Compiler baut; das ist sehr praxisnah. Es gibt auch kostenlose Samples, und ich bin übrigens einer der Autoren
    • Ein Grund, warum ich Ada persönlich mag: Im Gegensatz zu umständlichem U32-Check-Code in JavaScript lässt sich so etwas in Ada mit Subtypen (subtype) oder Modulen sehr elegant lösen
    • Ich frage mich, ob man WASM-Code instrumentieren kann, sodass In-Process-Debugging möglich ist – also eine Custom-Sprache in Echtzeit nach WASM übersetzen und im Web Breakpoints sowie Memory-Inspektion auf einmal umsetzen kann
  • Bei der Entwicklung einer WebAssembly-Runtime im letzten Jahr war ich beeindruckt von der Strenge des Specs und den gut bereitgestellten Tests. Es dauert etwas, bis man sich eingearbeitet hat, aber danach wirkt die Sprachspezifikation äußerst durchdacht. In mehrdeutigen Situationen hilft der direkt aus dem Spec generierte Referenzinterpreter sehr, und die Spec-Tests zur Konsistenzprüfung sind ebenfalls äußerst nützlich
  • Kürzlich wurde der Wasm-Constant-Time-Vorschlag auf inactive gesetzt. Der Großteil der eigentlichen Arbeit wurde zwar schon 2018 erledigt, aber die Integration mit SIMD und die Aufnahme als offizielle Erweiterung wurden verschoben. Wenn nicht jemand diese sehr wichtige Arbeit übernimmt, bleibt praktisch jede Wasm-Kryptografie äußerst anfällig für Timing-Angriffe
  • Interessant ist, dass Wasm eine Kurzform von WebAssembly ist und kein Akronym, daher schreibt man es nicht in Großbuchstaben als WASM
    • Nach dieser Logik müsste es dann nicht eher WAsm heißen?
    • Selbst bei Akronymen gibt es viele Fälle, die komplett kleingeschrieben werden (z. B. scuba, radar, laser)
    • Hoffentlich klappt’s, haha
  • Ich würde gern eine Liste von funktionierenden WASM-Apps sehen. Die Idee ist gut, aber es wirkt ein bisschen wie bei DAPPs – eher etwas, das nur zum Spaß existiert. Ein paar echte Beispiele wären hilfreich
    • Ich empfehle madewithwebassembly.com und das GitHub-Repo Awesome-WebAssembly-Applications. Dort sind echte WASM-Apps gut zusammengestellt
  • Dieses WASM2-Release ist hervorragend, aber die Einführung von SIMD fester Breite (128 Bit) hinterlässt einen etwas bitteren Beigeschmack. Ein flexibler Ansatz wie ARM SVE, bei dem der Compiler die SIMD-Breite je nach Geräteleistung anpasst, wäre besser gewesen
    • Ich denke hingegen, dass SIMD fester Breite sogar mehr Einsatzmöglichkeiten eröffnet. Vektor-Instruktionen lassen sich relativ leicht auch durch SIMD fester Breite ersetzen. SIMD ist nicht immer zwingend nötig, aber es gibt viele opportunistische Einsatzfälle, in denen durch die Registergröße automatisch vektorisiert werden kann; dafür ist es ziemlich nützlich
    • Zu frühe Optimierung ist die Wurzel des Problems; auch dieses SIMD-Thema wäre viel eleganter gewesen, wenn man einfach nur dem Vorschlag für Vektoren variabler Größe gefolgt wäre
  • Ich frage mich, ob eine C-Funktion, die einen Wert als Struct zurückgibt, zu WASM kompiliert werden kann
    • Möglich ist es, aber soweit ich weiß, kann es derzeit nicht nach JS „exportiert“ werden
  • Ich frage mich, ob es Runtimes gibt, die die WASM2-Features bereits implementiert haben
    • Die meisten haben das schon lange implementiert. Die Wasm-Community und die Working Group haben den Spec Anfang 2022 festgezurrt, und die wichtigsten Implementierungen boten 2.0 schon davor an. 3.0 soll ebenfalls bald offiziell werden, und einige Features sind bereits hinter Feature Flags verfügbar
  • Ich denke, Bytecode fürs Web ist ein alter Traum. Als C#-Entwickler finde ich beeindruckend, wie Blazor schon früh mutig auf WASM gesetzt hat. .NET ist bei WASM ziemlich weit vorne, und ich bin gespannt auf die Änderungen in 2.0