Un ordenador hecho solo de buscar-y-reemplazar consigue ejecutar DOOM

Fuentes: DOOM, computed by find-and-replace

Un programador ha conseguido que el videojuego DOOM funcione sobre una máquina cuyo único mecanismo de cómputo es una sustitución de texto global aplicada, una y otra vez, a una única cadena de 96,6 megabytes. En esa cadena viven, como texto plano, los registros, la memoria RAM, el framebuffer, el motor de DOOM compilado para un conjunto de instrucciones a medida e incluso el archivo WAD del juego. Un motor externo recorre una lista fija y ordenada de reglas de buscar-y-reemplazar; la primera que coincida se dispara una sola vez y eso cuenta como un paso. No hay ningún intérprete oculto ni aritmética del lado del anfitrión: retirado el motor de reglas, lo único que queda es un archivo de texto ordinario.

La idea se apoya en que la reescritura iterativa de cadenas es Turing-completa: es un algoritmo de Markov, uno de los modelos clásicos de computación de los años cincuenta. Las 544 reglas implementan una pequeña CPU de 32 bits cuyo sumador es una tabla de consulta de 512 entradas con el acarreo enhebrado mediante grupos de captura, cuyo acceso a memoria salta un número exacto de caracteres calculado a partir de los dígitos de la dirección, y cuya lectura de instrucción aterriza sobre el opcode actual de la misma forma, guiada por el contador de programa. DOOM se compila para esa CPU usando 8cc y ELVM sobre el puerto doomgeneric, siguiendo los pasos del proyecto BFDoom.

Cada paso está verificado por tres vías independientes. Un emulador de referencia en Python ejecuta el mismo juego de instrucciones y, tras cada sustitución, la cadena debe coincidir byte a byte con el estado codificado por el emulador. Además, el hash SHA-256 de cada fotograma renderizado coincide con el de un DOOM compilado de forma nativa. Las cien primeras imágenes del demo temporizado —el jugador recoge la armadura, toma la escopeta y los demonios atacan— son idénticas a las de la build nativa, y llegar hasta ahí requirió unos 1.250 millones de sustituciones. El autor incluye además una versión mínima del mismo mecanismo ejecutable en el navegador, un contador que se incrementa reescribiendo sus propios dígitos.