WebAssembly – wie es innen funktioniert
Ein kompaktes Binärformat für eine sichere, portable Stack-Maschine: im Browser neben JavaScript, auf dem Server, am Edge und als Plugin-Sandbox. Hier siehst du jedes Byte, jeden Stack-Schritt und jeden Aufruf über die Grenze zu JavaScript.
❓Was ist WebAssembly?
📚 Eine Stack-Maschine
Befehle nehmen Operanden vom Stack und legen Ergebnisse ab. Kein Register, keine Adressen von Code – das macht Validierung und schnelle Übersetzung in Maschinencode einfach.
💾 Binär und Text
.wasm ist das kompakte Binärformat, .wat die gleichwertige Textform zum Lesen und Schreiben.
🔒 Sandbox
Ein Modul sieht nur seinen eigenen linearen Speicher und das, was der Host importiert. Kein Dateisystem, kein Netz, kein DOM – außer es wird ausdrücklich hineingereicht.
🌍 Überall
In allen großen Browsern, in Node.js und Deno, in eigenständigen Laufzeiten wie Wasmtime und Wasmer, auf Edge-Plattformen wie Cloudflare Workers.
📚add(7, 5) auf der Stack-Maschine
🛡️Das Sicherheitsmodell
┌─────────────── Host (Browser / Wasmtime) ────────────────┐ │ │ │ Importe ──► ┌──────────── Wasm-Instanz ────────────┐ │ │ (nur, was │ Funktionen – vorab validiert │ │ │ der Host │ Aufruf-Stack – nicht adressierbar │ │ │ hergibt) │ linearer Speicher: Byte 0 … n−1 │ │ │ │ └ jeder Zugriff geprüft, sonst Trap │ │ │ Exporte ◄── └──────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────────┘
🆚JavaScript, asm.js und WebAssembly
| JavaScript | asm.js (2013) | WebAssembly | |
|---|---|---|---|
| Format | Quelltext | Quelltext (Teilmenge von JS) | Binärformat (+ Textformat WAT) |
| Typen | dynamisch | per Konvention: x|0 = int, +x = double | statisch: i32, i64, f32, f64, v128, Referenzen |
| Laden | parsen, interpretieren, JIT | parsen; optimierende Engines übersetzen vorab | dekodieren + validieren, Streaming-Kompilierung |
| 64-Bit-Ganzzahlen | nur BigInt | nein | i64 nativ |
| Speicher | Objekte mit GC | ein ArrayBuffer als Heap | linearer Speicher, seit 3.0 optional WasmGC |
| Rückwärtskompatibel | – | läuft in jeder JS-Engine | braucht Wasm-Unterstützung |
| Typischer Einsatz | UI, Web-Logik | historisch: C/C++ im Web (Emscripten) | rechenintensive Kerne, portierter Code, Sandboxing |
WebAssembly ergänzt JavaScript, statt es zu ersetzen: DOM-Zugriffe laufen weiterhin über JavaScript (Importe).
🧭Kapitel
Binärformat Byte für Byte
Magic, Version, Sections, LEB128 – Hex-Explorer für Beispiele und eigene .wasm-Dateien.
WAT ↔ Binär
Textformat links, Bytes rechts, Zuordnung per Hover. Übersetzt mit wat2wasm direkt im Browser.
Stack-Maschinen-Debugger
Operanden-Stack, Locals, Call-Frames und Speicher Schritt für Schritt – verglichen mit der echten Engine.
JavaScript-Interop
instantiate, Imports/Exports, Strings im linearen Speicher, Tabellen, Performance-Messung.
Toolchains, WASI & Komponenten
Rust, C/C++, AssemblyScript, Go, Kotlin, Blazor – und WASI 0.2/0.3 mit WIT als Diagramm.
Standard & Feature-Status
Was steckt in Wasm 2.0 und 3.0? Unterstützung in Browsern und Laufzeiten, mit Quellen.