Cloudflare y VoidZero, en colaboración con Max Schwenk de Owner.com, han lanzado tsrs, un port en Rust del compilador de TypeScript. El proyecto se está incubando como parte de la cadena de herramientas del compilador de JavaScript Oxc. El objetivo principal de tsrs es reducir los tiempos de espera de los desarrolladores para la comprobación de tipos, al tiempo que mejora la eficiencia de la memoria. Esta eficiencia es particularmente crítica para ejecutar entornos de desarrollo completos en entornos restringidos, como navegadores web o dispositivos embebidos.

La imagen sirve como el recurso visual principal para el anuncio de tsrs, un port basado en Rust del compilador de TypeScript.
Los primeros benchmarks indican que tsrs es hasta 8 veces más rápido y utiliza aproximadamente un 70% menos de memoria que TypeScript 7.0 cuando se utiliza un número equivalente de trabajadores de comprobación de tipos. Si bien el equipo de TypeScript ya ha realizado mejoras de rendimiento significativas en versiones recientes (con la beta de TypeScript 7.1 mostrando un aumento de velocidad de 2.5x sobre la 7.0), tsrs aspira a superar estos límites aún más. Un motor técnico clave para elegir Rust sobre otros lenguajes como Go es su modelo de gestión de memoria. A diferencia de Go, que requiere compilar un recolector de basura cuando se exporta a WebAssembly (Wasm), el modelo de Rust permite interacciones de memoria más directas entre un huésped Wasm y el host. Esto hace que Rust sea una opción superior para Cloudflare Workers, donde ejecutar sistemas de construcción y despliegue de software en bucles cerrados se beneficia significativamente de una huella de memoria pequeña.
Para mantener la compatibilidad con el lenguaje oficial de TypeScript, el proyecto enfatiza un port fiel en lugar de una bifurcación. El equipo pretende preservar la lógica de la implementación original aprovechando las capacidades de Rust. Para mantener el port sincronizado con los cambios upstream, el equipo planea utilizar un flujo de trabajo automatizado basado en agentes similar al utilizado para Vinext. Este proceso implica que un agente revise los cambios diarios, obtenga las diferencias e identifique brechas en la matriz de compatibilidad. Cuando se encuentra una discrepancia, el agente identifica el cambio en las bases de código, construye una reproducción y propone una corrección. Aunque actualmente existen algunas diferencias menores, como el orden de los diagnósticos impresos, el objetivo es minimizar estas discrepancias a medida que el proyecto avanza hacia un lanzamiento estable. El equipo también pretende contribuir con las optimizaciones de rendimiento descubiertas de vuelta a la base de código oficial de TypeScript en Go para beneficiar a la comunidad en general.
Un desafío técnico notable al portar TypeScript de un lenguaje con recolección de basura a Rust involucra la gestión de objetos de larga duración. Debido a que Rust carece de un recolector de basura nativo, el port utiliza un modelo de memoria único que emplea arenas de nunca liberadas para objetos de larga duración para simular el comportamiento necesario mientras mantiene las garantías de seguridad de Rust. Este enfoque permite que el compilador logre un alto rendimiento sin la sobrecarga de un entorno de ejecución completo, permitiendo la ejecución de cadenas de herramientas de desarrollo totalmente encapsuladas en entornos aislados como Cloudflare Workers o en el lado del cliente en un navegador.