scheme-rs es una implementación de Scheme escrita en Rust cuyo autor decidió el 31 de diciembre de 2024 transformar su intérprete basado en AST en un compilador JIT con representación intermedia en CPS (Continuation-Passing Style). El objetivo principal era hacer mecánica la creación de continuaciones mediante call-with-current-continuation. CPS describe explícitamente las continuaciones del programa, lo que convierte call/cc en un builtin casi trivial y, además, ofrece una representación intermedia adecuada para análisis y optimizaciones. Antes de la migración, la función fib(10000) tardaba unos 40 ms en scheme-rs, frente a 3 ms en Guile, la referencia del autor. La primera versión con CPS y compilación a LLVM SSA dio 357 ms: una regresión de casi un 778 %. A partir de ahí, el artículo detalla tres optimizaciones clave que devolvieron al compilador a la misma franja de rendimiento que Guile. La primera, casi inseparable de la conversión a CPS, consiste en eliminar las clausuras triviales que el algoritmo genera de forma rutinaria; sin ella, el código CPS queda saturado de envolturas inútiles como las que se aprecian al compilar (+ 1 2 3 4). Las otras dos optimizaciones, descritas más adelante en el texto, actúan sobre el código intermedio para reducir aún más el overhead. En conjunto, el trabajo narra la transición de un intérprete lento a un JIT competitivo para Scheme, comparándose siempre con Guile como referencia.
Cómo scheme-rs multiplicó por 25 su rendimiento con tres optimizaciones
Fuentes:
25x Performance, Three Optimizations
