Llegó oficialmente TypeScript 7 y vaya que es rápido

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

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.

Key Takeaway

TypeScript 7 reescribe su compilador en Go para aprovechar la concurrencia nativa con memoria compartida y ejecutar código nativo, logrando velocidades hasta 15 veces superiores en procesadores multinúcleo y reduciendo la verificación del proyecto VS Code de 125 a 10 segundos.

Highlights

  • La migración del compilador de TypeScript a Go reduce el tiempo de compilación de VS Code (1.3 millones de líneas de código) de 125.7 a 10.6 segundos.

  • El nuevo compilador en Go aprovecha la concurrencia nativa y la memoria compartida, distribuyendo la carga de trabajo entre todos los núcleos de la CPU.

  • Aproximadamente la mitad de la mejora de velocidad proviene de la ejecución como código nativo y la otra mitad del procesamiento concurrente.

  • Al agregar la bandera `--checkers 12` en procesadores Apple M3 Max, el tiempo total de verificación de tipos en VS Code se reduce de 5.4 a 3.5 segundos.

  • Los fallos en los comandos del servidor de lenguaje disminuyen más de un 80 % y las caídas del servidor caen más de un 60 %.

  • La API programática no está disponible en el lanzamiento inicial de TypeScript 7, por lo que herramientas como typescript-eslint, ts-jest y ts-node dependerán de la versión 7.1.

Timeline

Lanzamiento de TypeScript 7 y mejoras de rendimiento

  • TypeScript 7 reemplaza el compilador anterior basado en JavaScript por una versión reescrita en Go.
  • La compilación del proyecto VS Code, compuesto por 1.3 millones de líneas de código en casi 8000 archivos, baja de 125 a 10 segundos.

La ejecución de npm install typescript instala la versión 7 del compilador. El cambio impacta a proyectos masivos en GitHub, acelerando drásticamente el flujo de desarrollo diario mediante ejecuciones nativas.

Limitaciones de JavaScript y ventajas del compilador en Go

  • JavaScript opera en un solo hilo y requiere serializar datos costosos para comunicar workers al procesar árboles de sintaxis abstracta.
  • Go ofrece un modelo de concurrencia con memoria compartida y ejecución compilada nativa sobre la CPU.
  • La ganancia de rendimiento se divide en partes iguales entre la ejecución de código nativo y el uso de múltiples subprocesos en paralelo.

JavaScript está optimizado para interfaces de usuario y navegadores, no para tareas intensivas en procesamiento de CPU como el análisis tipográfico. Usar workers en JavaScript implica serializar y deserializar objetos a través de SharedArrayBuffer, lo cual resulta costoso en archivos grandes. Go elimina este cuello de botella permitiendo pasar objetos directamente entre núcleos sin duplicar memoria.

Resultados de pruebas comparativas y escalabilidad multinúcleo

  • El proyecto Bluesky reduce su tiempo de compilación de 24.3 a 2.8 segundos, mientras que Playwright pasa de 12.8 a 1.5 segundos.
  • Procesadores con 14 núcleos como el M3 Max registran aceleraciones de hasta 15x en comparación con TypeScript 6.
  • El parámetro `--checkers 12` permite dividir la verificación de tipos en 12 procesos simultáneos, bajando el tiempo en VS Code de 5.4 a 3.5 segundos.

Debido a que las velocidades por núcleo individual ya no crecen al ritmo de antes, el rendimiento futuro depende de la cantidad de núcleos disponibles. Mientras que el compilador antiguo ejecutaba las tareas en un único núcleo, la versión 7 escala linealmente con la capacidad del procesador. Pruebas directas en el repositorio de VS Code muestran un tiempo de diagnóstico total de 3.5 segundos frente a los 45.3 segundos de la versión previa.

Concurrencia en Go y experiencia del desarrollador en el IDE

  • La función bind source files encola vinculaciones de ámbitos y deja la distribución entre núcleos a cargo del runtime de Go.
  • La respuesta del servidor de lenguaje en el IDE baja a milisegundos para mostrar errores de tipo.
  • Los errores en comandos del servidor bajan un 80 % y los colapsos generales un 60 %.

El runtime de Go gestiona internamente la distribución del trabajo sin necesidad de crear hilos manualmente o coordinar comunicaciones complejas. Esta arquitectura acelera la retroalimentación visual en el editor de código, eliminando esperas de hasta dos minutos para ver errores tipográficos. Además, la estabilidad del servidor disminuye la frecuencia de reinicios forzados en el entorno de desarrollo.

Compatibilidad, limitaciones iniciales e instalación

  • El nuevo compilador mantiene un 100 % de compatibilidad retroactiva con la versión anterior.
  • La falta de API programática en el lanzamiento inicial pospone la compatibilidad de herramientas como typescript-eslint, ts-jest y ts-node hasta la versión 7.1.
  • La integración en VS Code requiere la instalación manual de la extensión TypeScript 7 desde la tienda oficial.

El proceso fue abordado como una migración directa y no como un rediseño del lenguaje, garantizando que el código existente funcione sin cambios. Las utilidades de terceros que dependen de la API interna del compilador continuarán en la versión 6 hasta la llegada de TypeScript 7.1. Para adoptar estas mejoras de inmediato en VS Code, es necesario habilitar explícitamente la extensión correspondiente.

Community Posts

View all posts