Article
WATaBoy: Game Boy Emulation via JIT-to-WebAssembly
Ein faszinierendes Experiment zeigt, dass Just-in-Time-Kompilierung zu WebAssembly schneller sein kann als ein nativer Interpreter. WATaBoy, entstanden als Abschlussprojekt, demonstriert einen neuen Ansatz für Emulation auf iOS und im Browser.
Das Problem
Apple verbietet JIT-Kompilierung auf iOS – außer im WebKit/Safari, wo JavaScriptCore und WebAssembly JIT-fähig sind. Dolphin, der GameCube/Wii-Emulator, kann deshalb nicht auf iOS laufen. Die Frage: Können wir die WebKit-JIT-Fähigkeiten für Emulation nutzen?
Der Ansatz
Statt nativen Maschinencode zu generieren, kompiliert WATaBoy Game Boy SM83-Instruktionen zur Laufzeit zu WebAssembly-Bytecode. Der Browser übernimmt dann die JIT-Kompilierung zu nativem Code.
Technische Highlights:
- wasm-encoder crate für Code-Generierung
- Late-Linking: Module werden dynamisch verlinkt
- Rust-Nightly: Inline-Wasm für Performance-Kritische Pfade
- GameRoy-inspirierte Optimierungen: Predictive Interrupts, Lazy MMIO-Evaluation
Benchmarks
Die Ergebnisse sind überraschend: Der JIT-to-Wasm-Ansatz ist schneller als ein nativer Rust-Interpreter. WebKit’s Optimierungen für Wasm machen den Unterschied.
Warum das wichtig ist
Für die Emulations-Community eröffnet dieser Ansatz neue Möglichkeiten:
- iOS-Support: Umgehung der JIT-Beschränkungen
- Browser-Emulation: Effiziente Konsolen-Emulation im Web
- Proof-of-Concept: Die Technik skalierbar auf komplexere Systeme
Der Source Code ist auf GitHub verfügbar. Für alle, die an Emulation, JIT oder WebAssembly interessiert sind, ein lesenswerter Deep-Dive.