Añadir el `defer` de Go al compilador TypeScript: un parche pedagógico en un compilador escrito en Go

Dev & Código yesterdayAñadir a favoritos

Añadir el `defer` de Go al compilador TypeScript: un parche pedagógico en un compilador escrito en Go
Ilustración : Momiji Shirogane

Andrew Healey inyecta la palabra clave `defer` —pilar del código Go— directamente en el compilador TypeScript, ahora escrito en Go. Un caso de estudio para entender parser, checker y emitter.

El punto de partida

Desde que Microsoft anunció la reescritura del compilador TypeScript en Go (el proyecto «TypeScript Native», que apunta a ~10× de velocidad en comparación con el histórico tsc en TypeScript), el código fuente del compilador se ha convertido en un muy bonito terreno de juego. Andrew Healey publica en su blog un artículo muy pedagógico donde añade, en su fork, la palabra clave defer — uno de los pilares ergonómicos del lenguaje Go — a TypeScript.

Recordatorio para quienes vienen principalmente de la pila JS: en Go, defer programa una función para que se ejecute en el momento en que la función envolvente retorna. Es el equivalente a un try { … } finally { … } sin el boilerplate, con la llamada de limpieza escrita justo al lado de la llamada que la hizo necesaria:

f, _ := os.Open("file.txt")
defer f.Close() // se ejecutará al salir de la función
// … resto del código

El patrón se usa masivamente para liberar recursos (archivos, mutex, conexiones) sin perderse en anidamientos.

Lo que esto desglosa

El interés del artículo no es «el defer de Go estará en TypeScript mañana» (spoiler: no). Se trata de seguir, paso a paso, lo que hace un compilador moderno cuando se añade una palabra clave. Healey pasa por:

  1. El escáner (lexer) — reconocer defer como un token dedicado en lugar de un identificador ordinario.
  2. El parser — decidir dónde defer tiene permitido aparecer en la gramática (a nivel de statement, sí; en expresión, no).
  3. El checker (verificador de tipos) — comprobar que lo que se difiere es efectivamente una llamada a función.
  4. El emisor (emitter) — traducir defer a JavaScript, lo que, en su caso, equivale a envolver la función envolvente en un try/finally y apilar las devoluciones de llamada diferidas en un array que se ejecuta al hacer unwind.

Esta última etapa es la que más enseña: defer en Go es un verdadero mecanismo del lenguaje (implementado por el runtime), mientras que en JS no hay nada comparable — hay que simularlo mediante un desugaring, con los compromisos que eso implica (rendimiento, excepciones, await, etc.).

Por qué nos interesa

Al ser el compilador TypeScript en Go de código abierto, este tipo de ejercicios es exactamente lo que hay que leer para:

  • Entender la arquitectura de un compilador moderno real (no un juguete universitario).
  • Ver cómo un lenguaje destino (JS) constriñe las opciones de traducción cuando no tiene la primitiva que necesitamos.
  • Familiarizarse con el paso AST → verificación de tipos → emisión, en un proyecto cuya superficie ya conocemos (tsc).

Observamos de paso que el parche de Healey se propone como demo, no como PR upstream — el TC39 nunca adoptó defer para JavaScript estándar, y Microsoft no impulsa extensiones propietarias de este tipo en TypeScript.

Para recordar: la verdadera ganancia de la reescritura en Go de tsc no es solo la velocidad — también es un compilador cuyo código es por fin accesible para un lector que no es experto en TypeScript avanzado. Este tipo de parches pedagógicos se multiplicarán, y es una escuela excelente.

Resources

Artículo producido por inteligencia artificial, revisado bajo control editorial humano.

Nuestra redacción
¿Te ha resultado útil este artículo?

7 personas han valorado este artículo

Me gusta
K
Kaito KuroganeSenior Dev Writer
Senior polyvalent developer, backend Go + frontend TS, open source contributor.
Compartir:
LIVERadio Geek Kitsune
Toca para escuchar, el mismo sonido para todos
0··
// Programación
// all stations
// compartir un tema →
Secciones
Explorar
Información