Llegó oficialmente TypeScript 7 y vaya que es rápido
BBetter Stack
Computing/SoftwareInternet Technology
Transcript
00:00:00TypeScript 7 se ha lanzado oficialmente y, tras más de un año de arduo desarrollo,
00:00:05migrar el compilador a Go o Bun demostró que en realidad se puede hacer todo con IA, así que
00:00:10estoy seguro de que los desarrolladores están felices. Si ejecutas npm install typescript ahora, obtendrás la versión
00:00:167, que es la versión con el compilador de Go, y tras el video de anuncio de Microsoft
00:00:20hace un par de días, quería analizar en detalle cómo lograron estas enormes mejoras de rendimiento.
00:00:25Los resultados han sido verdaderamente impresionantes: el nuevo compilador genera la base de código de VS Code,
00:00:31que consta de 1.3 millones de líneas de código en casi 8000 archivos, en solo 10 segundos, frente a los 125
00:00:39segundos del compilador anterior. Y dado que TypeScript es orgullosamente el lenguaje número uno en
00:00:44GitHub, lo creas o no, el nuevo compilador le cambiará la vida a muchísima gente. Me emociono solo de
00:00:49pensarlo. Pero en lugar de revisar las funciones casi idénticas entre la versión 6 y la 7, quería profundizar
00:00:54en cómo se logra exactamente ese rendimiento. Echemos un vistazo al nuevo compilador y veamos qué
00:00:59lo hace tan rápido. ¿Por qué la reescritura? Bueno, el creador de C# y Technical Fellow en Microsoft,
00:01:09Anders Hejlsberg, lo dijo muy claramente: JavaScript está optimizado para interfaces de usuario y navegadores, no está
00:01:16realmente optimizado para flujos de trabajo intensivos en cómputo ni para compiladores. Lo cual es obvio, porque es de
00:01:22un solo subproceso y procesar algo como un árbol de sintaxis abstracta o la verificación de tipos solo puede escalar
00:01:27hasta cierto punto usando un solo núcleo. Técnicamente se podría distribuir el trabajo en workers, pero habría
00:01:32que serializar y deserializar los datos, algo lento y pesado en memoria, y además habría que
00:01:38lidiar con la complejidad de gestionar todo eso. Por eso se decidieron por Go, que ofrece enormes
00:01:43mejores de rendimiento mediante un lenguaje diseñado prácticamente para este propósito. Go es un lenguaje compilado,
00:01:48lo que significa que podemos ejecutar código compilado directamente en la CPU en lugar de interpretarlo, y Go tiene un
00:01:54modelo de concurrencia excelente, por lo que podemos ejecutar múltiples subprocesos en paralelo fácilmente
00:02:00compartiendo memoria. Esto significa que podemos aprovechar todos los núcleos de tu equipo en lugar de
00:02:06uno solo. Y la aceleración se divide casi en partes iguales: hasta la mitad de la mejora se debe a ser código nativo
00:02:12y el resto a la concurrencia con memoria compartida. Go es básicamente el lenguaje perfecto para esto.
00:02:17No se trata solo de que Go sea más rápido, es que literalmente tiene más recursos que destinar al problema y los resultados
00:02:23hablan por sí solos. Si miramos las cifras, VS Code, con 1.3 millones de líneas de código, tardaba 125.7 segundos con el viejo
00:02:32compilador y 10.6 segundos ahora, lo que representa una mejora de 11.9x. En Bluesky pasamos de 24.3 a 2.8, un aumento de 8.7x;
00:02:42y en Playwright pasamos de 12.8 segundos a 1.5, otra mejora de 8.7x. Y curiosamente, solo
00:02:49toma un segundo suscribirse a Better Stack. Esta brecha solo se va a ampliar porque los núcleos no
00:02:54aumentan de velocidad al mismo ritmo que antes, pero lo que sí tenemos son más núcleos. Yo uso un M3 Max, por
00:03:00ejemplo, que tiene 14 núcleos, lo cual es increíble. Recuerdo cuando armé una PC para juegos en la universidad que tenía un
00:03:06Intel i7 de cuatro núcleos y me parecía una bestia absoluta. El compilador de JavaScript solo
00:03:11usaría uno de esos núcleos, pero con Go aprovecho absolutamente todos. Y claro, cuantos más núcleos tengas, más
00:03:17rendimiento obtienes. Si compilo un proyecto grande en esta máquina con la versión 6, verás que tarda 45
00:03:24segundos, mientras que con la versión 7 podemos reducirlo a tan solo tres segundos. Hay múltiples
00:03:29fases en el proceso de compilación, y la fase de verificación de tipos es solo una de ellas. Para esto, Go
00:03:34iniciará cuatro verificadores de tipos y hará que cada uno revise una cuarta parte de la base de código. Pero en realidad
00:03:39puedes optimizarlo aún más: durante la compilación, puedes ajustar los verificadores a 12 para un rendimiento todavía mayor.
00:03:45Descargué el repositorio de VS Code en mi equipo para ver la diferencia entre TypeScript 7 y 6.
00:03:51Por defecto, tsc en mi equipo ahora apuntará a TypeScript 7, así que ejecutaremos el diagnóstico en
00:03:57esto y verás que tomó 5.4 segundos, y la mayor parte del tiempo se destinó al
00:04:02tiempo de verificación (4.7 segundos). De hecho, también podemos acelerarlo: si añadimos otra marca,
00:04:08checkers 12, verás que el tiempo total se reduce de 5.4 a 3.5 segundos, y todo eso recorta
00:04:15el tiempo de comprobación: aquí teníamos 4.7 y bajó a 2.9. Ahora ejecutemos el mismo
00:04:20comando de nuevo, pero esta vez usando TypeScript 6. Esto va a tardar un
00:04:23poco, así que lo aceleraremos. Tras la espera, puedes ver que TypeScript 6 terminó en
00:04:2845.3 segundos, en comparación con los 3.5 que obtenemos al ejecutarlo en todos los núcleos. Esto equivale
00:04:36a una mejora de 15x en mi chip M3 Max. Así que, en mi caso, de ahí proceden los 3.5 segundos. Hacer
00:04:43esto le quitará rendimiento a otros procesos, por supuesto, pero si no estás haciendo nada más,
00:04:47vale la pena aprovechar todos los recursos de la máquina. Echemos un vistazo a código real
00:04:52del nuevo compilador para entender cómo Go logra este rendimiento. Aquí tenemos la función bind source
00:04:57files, cuya tarea es recopilar cada declaración de un archivo y determinar a qué ámbito pertenece.
00:05:03Procesamos posiblemente miles de archivos: iteramos sobre cada archivo, encolamos una función para vincularlo
00:05:09y luego esperamos a que finalicen todos. Lo maravilloso es que no tenemos que pensar en cómo
00:05:14se distribuye ese trabajo entre los núcleos; el runtime de Go se encarga de todo. No estamos creando hilos ni
00:05:20gestionando una comunicación compleja entre núcleos, simplemente decimos “aquí hay trabajo” y él averigua cómo hacer el
00:05:26resto. En JavaScript podríamos escribir un código casi idéntico, pero no tendría sentido para tareas intensivas de CPU:
00:05:32todo se ejecutaría en un solo hilo de forma secuencial, aunque las promesas den la ilusión de paralelismo.
00:05:38Técnicamente los workers son una alternativa, pero no se pueden compartir objetos entre ellos, solo bytes crudos usando
00:05:43SharedArrayBuffer. Por tanto, pasar un árbol de sintaxis abstracta a un worker exige serializarlo todo,
00:05:48copiarlo y reconstruirlo del otro lado. En archivos grandes, eso cuesta más que el trabajo en sí.
00:05:53Básicamente, son detalles como este los que hacen que Go sea inherentemente mejor para tareas de CPU. Tiene
00:05:58un entorno de ejecución capaz de gestionar toda esta concurrencia y cuenta con memoria compartida, por lo que puedes pasar
00:06:03objetos sin tener que copiarlos. Aparte del tiempo de compilación, lo que más vas a notar
00:06:07es la velocidad de tu servidor de lenguaje. Cualquiera que haya trabajado en una base de código grande de TypeScript conoce
00:06:13el dolor de esperar a que se verifiquen los tipos... ¡dios mío, cómo se sufría en las Mac con Intel! Recuerdo trabajar en
00:06:20proyectos hace un par de años y tener que abrir el repositorio y esperar literalmente
00:06:24hasta dos minutos solo para ver aparecer las líneas rojas serpenteantes. Y cada vez que hacías un cambio,
00:06:29era increíblemente frustrante. La experiencia de desarrollo era pésima y luego nadie quería
00:06:34trabajar en esa base de código. Sin embargo, el nuevo servidor de lenguaje ofrece respuesta instantánea en tu IDE, así que puedes
00:06:40abrir un archivo, hacer un cambio y ver los errores en literalmente milisegundos, incluso si trabajas en
00:06:46bases de código masivas. Más allá del rendimiento, el nuevo servidor de lenguaje es más estable, por lo que la
00:06:51necesidad de reiniciar el IDE cuando la verificación de tipos deja de funcionar se ha reducido drásticamente. TypeScript 7
00:06:57redujo los fallos en los comandos del servidor de lenguaje en más de un 80 % y las caídas del servidor en más de un 60 %.
00:07:04Eso significa menos laptops estampadas contra la pared, lo cual es excelente para el medio ambiente.
00:07:08¿Quién diría que a Microsoft le importa el planeta? También vale la pena mencionar que esto es una migración,
00:07:13no una reescritura desde cero. El equipo de TypeScript se ha asegurado de que el nuevo compilador sea básicamente
00:07:19compatible al 100 % con el anterior. Probablemente no notarás ninguna diferencia excepto por la velocidad, pero
00:07:24aunque ya puedes ejecutar TypeScript 7 en tus propios proyectos, tendrás que esperar a que tus paquetes
00:07:29favoritos se actualicen. Su API programática aún no está disponible, lo que significa que cualquier paquete que dependa de
00:07:35ella tendrá que esperar a la versión 7.1. Así pues, paquetes como typescript-eslint, ts-jest o ts-node se
00:07:42quedarán atrás por ahora. La versión completa de TypeScript 7 ya se puede descargar, pero
00:07:47debes instalar explícitamente la extensión de TypeScript 7 para VS Code. El paquete predeterminado eventualmente se
00:07:53actualizará, pero por ahora solo instala esa extensión; se llama TypeScript 7 en la tienda de extensiones y
00:07:58todo funcionará como se espera. Si quieres saber más sobre el conjunto de características de TypeScript 7,
00:08:03grabamos un video sobre eso mismo que puedes ver aquí. Y si te gustan estos análisis, suscríbete
00:08:08a Better Stack para ver más. Espero que hayas aprendido algo nuevo y que ahora puedas aprovechar
00:08:12el desarrollo ultra rápido que obtendrás con TypeScript 7. Sé muy bien que voy a disfrutar
00:08:16usándolo. Muchas gracias por ver el video y, por supuesto, nos vemos en el próximo.