WATaBoy: un emulador de Game Boy que compila instrucciones a WebAssembly en tiempo de ejecución

Fuentes: WATaBoy: JIT-ing Game Boy Instructions to Wasm Beats a Native Interpreter

WATaBoy es un proyecto experimental que demuestra cómo construir un emulador de Game Boy capaz de generar código WebAssembly sobre la marcha y dejar que el motor del navegador lo compile a código máquina, esquivando así las restricciones de iOS a la compilación JIT nativa. La iniciativa parte de la observación de que Apple prohíbe la generación de código JIT en apps, pero concede una excepción a los navegadores: JavaScriptCore y el resto de motores JS/WebAssembly sí pueden compilar a nativo. La idea es "aprovecharse" de esa puerta trasera: en lugar de emitir instrucciones nativas, el emulador emite bytecode Wasm, que el navegador acaba traduciendo a máquina.

Desde el punto de vista técnico, el autor describe cómo, desde Rust, se utiliza el crate wasm-encoder para fabricar en tiempo de ejecución un módulo Wasm con una función sencilla de suma y, posteriormente, compilarlo, instanciarlo y enlazarlo desde JavaScript, añadiéndolo a la tabla de funciones indirectas del módulo principal para invocarlo después. Wasm presenta una arquitectura tipo Harvard, por lo que el bytecode generado no puede ejecutarse de forma autónoma: hay que delegar en el embedder (el navegador).

El artículo también aborda la vertiente de emulación: aunque un procesador LR35902 de Game Boy se beneficia menos de la JIT que el de una consola de sexta generación, técnicas como predecir interrupciones, caer al intérprete en bloques susceptibles y evaluar perezosamente los periféricos vía MMIO permiten mantener la precisión de ciclos. Los benchmarks muestran que el enfoque JIT-a-Wasm supera al intérprete nativo, abriendo la puerta a ejecutar emuladores CPU-pesados en plataformas donde la JIT está vetada, siempre dentro de un navegador.