Goeteia: un compilador de Scheme escrito en su propio subconjunto y compilado a WebAssembly

Fuentes: Goeteia: a self-hosted Scheme compiler compiling to WebAssembly

Goeteia es un compilador para un subconjunto de Scheme que se compila a WebAssembly directamente en el navegador. La página donde se presenta es en sí misma una demo viva: el título en 3D es una nube de partículas WebGL cuyas formas, trayectorias y colores se generan desde el código fuente, y cada vez que el usuario lo edita y pulsa Run el módulo se recompila en unos 15 milisegundos.

El compilador está escrito en el mismo subconjunto de Scheme que compila. Gracias a un proceso de self-hosting, se recompila a sí mismo y el binario resultante es idéntico byte a byte al original; cada cambio se verifica de forma automática en CI, y todas las pruebas se ejecutan en ambas etapas, lo que descarta derivas entre la implementación y el compilador.

En el plano técnico, los fixnums se almacenan como i31refs sin boxing, las parejas y los registros son estructuras gestionadas por el recolector de basura, y la primitiva eq? equivale a una comparación de referencia. El sistema de ejecución no requiere un heap paralelo en JavaScript: el host expone únicamente dos imports de flujo de bytes. El lenguaje admite syntax-rules y syntax-case procedural con fenders, elipses anidadas y datum->syntax, ejecutados en un intérprete en tiempo de compilación con higiene por renombrado.

Las referencias a funciones tipadas incluyen una entrada rápida por aridad y una genérica por cierre, de modo que los procedimientos variádicos y apply son eficientes; cada llamada en posición de cola se traduce como return_call, lo que permite ejecutar un bucle de 100 millones de iteraciones en pila constante en unos 150 milisegundos. Los fixnums se promocionan a bignums en caso de desbordamiento mediante una comprobación inline de dos bits; los flonums aplican contigüidad de tipo, y los racionales y complejos son exactos. Las continuaciones de escape aprovechan la propuesta de manejo de excepciones de WebAssembly, con captura en O(1) y un único bloque try en el camino normal.

Goeteia incorpora además una pequeña librería web con plantillas (web sx) sobre señales reactivas (web reactive), un renderizador (web html) y una FFI (web js) hacia el host. Soporta librerías estilo R6RS con resolución de dependencias y poda de código no utilizado. Funciona sobre Node 22+, Chrome, Firefox, Safari y wasmtime con soporte para Wasm GC y tail calls. El código está disponible en el repositorio guenchi/Goeteia de GitHub.