TypeScript 7 est officiellement disponible, et qu'est-ce qu'il est rapide !

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

Transcript

00:00:00TypeScript 7 est officiellement sorti, et après plus d'un an de développement acharné,
00:00:05le portage du compilateur sous Go par Bun a prouvé qu'on pouvait tout faire avec l'IA. Donc je suis
00:00:10sûr que les développeurs en sont ravis. Si vous lancez « npm install typescript » maintenant, vous aurez la version
00:00:167, qui est celle intégrant le compilateur Go. Suite à la vidéo d'annonce de Microsoft
00:00:20il y a quelques jours, je voulais analyser en détail comment ils ont obtenu ces gains de performance
00:00:25massifs. Les résultats sont vraiment impressionnants. Le nouveau compilateur bâtit le code source de VS Code,
00:00:31soit 1,3 million de lignes de code réparties sur près de 8 000 fichiers, en seulement 10 secondes, contre 125
00:00:39secondes pour l'ancien compilateur. Et comme TypeScript trône fièrement en tête des langages sur
00:00:44GitHub, croyiez-le ou non, ce nouveau compilateur va changer la vie de tant de gens. Ça me rend ému
00:00:49rien d'y penser ! Mais plutôt que de regarder les fonctionnalités quasi identiques entre les versions 6 et 7, je voulais voir
00:00:54exactement comment cette vitesse est atteinte. Examinons ce nouveau compilateur pour comprendre ce qui
00:00:59le rend si rapide. Pourquoi cette réécriture ? Le créateur de C# et Technical Fellow chez Microsoft,
00:01:09Anders Hejlsberg, l'a expliqué très clairement : JavaScript est optimisé pour l'interface utilisateur et les navigateurs, il n'est
00:01:16pas vraiment optimisé pour les calculs intensifs et les compilateurs. C'est assez évident car il est
00:01:22monothreadé, et traiter un arbre syntaxique abstrait ou vérifier les types ne peut pas aller bien loin
00:01:27avec l'accès à un seul cœur. On pourrait théoriquement répartir le travail sur des workers, mais il faudrait
00:01:32alors sérialiser et désérialiser les données, ce qui est lent et gourmand en mémoire, sans compter
00:01:38la complexité de la gestion de tout cela. Ils ont donc opté pour Go, qui offre des gains de performances
00:01:43spectaculaires grâce à un langage sur mesure. Go est un langage compilé,
00:01:48ce qui signifie qu'on peut exécuter le code compilé directement sur le processeur sans l'interpréter. De plus, Go a un
00:01:54très bon modèle de concurrence, permettant d'exécuter facilement plusieurs threads en même temps,
00:02:00le tout avec une mémoire partagée. On peut ainsi exploiter tous les cœurs de la machine au lieu d'un seul
00:02:06seul. Le gain se répartit équitablement : jusqu'à la moitié est due à l'utilisation du code natif,
00:02:12et le reste provient de la concurrence avec mémoire partagée. Go est virtuellement le langage idéal pour cela.
00:02:17Il ne s'agit pas juste d'être plus rapide, Go dispose de plus de ressources à allouer au problème, et les résultats
00:02:23parlent d'eux-mêmes. En regardant les chiffres, VS Code et ses 1,3 million de lignes de code prenaient 125,7 secondes sur l'ancien
00:02:32compilateur contre 10,6 secondes ici, soit un gain de 11,9x. Pour Bluesky, on passe de 24,3 à 2,8, soit 8,7x d'amélioration,
00:02:42et pour Playwright, de 12,8 à 1,5 seconde, soit 8,7x d'amélioration aussi. Et amusant : il ne faut
00:02:49qu'une seconde pour s'abonner à Better Stack. Cet écart va continuer de se creuser, car la vitesse des cœurs
00:02:54n'augmente plus au même rythme qu'avant, mais nous obtenons plus de cœurs. Je suis par exemple sur un M3 Max,
00:03:00qui possède 14 cœurs, ce qui est fou. Je me souviens avoir monté un PC gamer à la fac avec un
00:03:06Intel i7 à quatre cœurs, et je trouvais que c'était un monstre sacré ! Le compilateur JavaScript n'utilisait
00:03:11qu'un seul de ces cœurs, mais avec Go, je les débloque tous. Et plus vous avez de cœurs, meilleures sont les
00:03:17performances. Si je compile un gros projet sur cette machine avec la version 6, cela prend 45
00:03:24secondes. Avec la version 7, on peut faire tomber cela à seulement 3 secondes. Il y a plusieurs
00:03:29étapes dans le processus de compilation, et la vérification des types n'en est qu'une parmi d'autres. Pour cela, Go
00:03:34va lancer 4 vérificateurs de types qui vont chacun analyser un quart de la base de code. Mais on peut
00:03:39encore optimiser cela : lors de la compilation, régler les vérificateurs sur 12 donne plus de vitesse encore.
00:03:45J'ai donc téléchargé le dépôt de VS Code sur ma machine pour comparer TypeScript 7 et 6.
00:03:51Par défaut, « tsc » sur ma machine pointe vers TypeScript 7. Exécutons le diagnostic
00:03:57dessus : vous voyez que ça a pris 5,4 secondes, et la majorité du temps a été consacrée à la
00:04:02vérification (4,7 secondes). On peut encore accélérer tout ça si l'on ajoute une option supplémentaire :
00:04:08« --checkers 12 ». Le temps total passe alors de 5,4 à 3,5 secondes. Tout cela réduit
00:04:15le temps de vérification : on passe de 4,7 à 2,9 secondes. Relançons maintenant la même
00:04:20commande, mais en utilisant cette fois TypeScript 6. Ça va prendre un peu de
00:04:23temps, donc nous allons passer en accéléré. Après cette attente, on voit que TypeScript 6 a terminé en
00:04:2845,3 secondes, contre 3,5 secondes lorsqu'on utilise tous les cœurs. C'est donc
00:04:36une amélioration effective de 15x sur ma puce M3 Max. Pour moi, c'est de là que viennent les 3,5 secondes.
00:04:43Faire cela va bien sûr impacter les autres processus, mais si vous ne faites rien d'autre,
00:04:47autant utiliser toutes les ressources de la machine. Regardons du vrai code
00:04:52du nouveau compilateur pour comprendre comment Go obtient ces performances. Voici une fonction
00:04:57« bindSourceFiles » dont le rôle est de lier chaque déclaration d'un fichier et de déterminer sa portée.
00:05:03En traitant potentiellement des milliers de fichiers, on parcourt chaque fichier, on met en file d'attente sa fonction de liaison,
00:05:09puis on attend que tout se termine. La beauté de la chose est qu'on n'a pas à se soucier de la façon dont
00:05:14ce travail est réparti sur les cœurs : le runtime de Go gère tout cela. Pas besoin de créer des threads ni de
00:05:20gérer une communication complexe entre les cœurs. On se contente de donner le travail et il gère la
00:05:26suite. En JavaScript, on pourrait écrire un code quasi identique, mais ce serait inutile pour des tâches dépendantes du CPU :
00:05:32tout s'exécuterait sur un seul thread, en séquence, même si Promise.all donne une illusion de parallélisme.
00:05:38Les workers sont techniquement une solution, mais impossible de partager des objets entre eux, seulement des octets bruts avec
00:05:43SharedArrayBuffer. Transmettre un arbre syntaxique à un worker exige donc de tout sérialiser,
00:05:48de le copier et de le reconstruire de l'autre côté. Pour un gros fichier, cela coûte plus cher que le travail lui-même.
00:05:53Fondamentalement, ce sont ces aspects qui rendent Go intrinsèquement meilleur pour les tâches dépendantes du CPU : son
00:05:58runtime gère la concurrence pour vous, et sa mémoire partagée permet de transmettre des objets
00:06:03sans devoir les copier. Au-delà du temps de compilation, ce qui sautera le plus aux
00:06:07yeux est la vitesse du serveur de langage. Quiconque a travaillé sur une grosse base de code TypeScript connaît la
00:06:13souffrance d'attendre la vérification des types, et mon dieu que les Mac Intel ont pu en souffrir ! Je me souviens d'avoir travaillé sur
00:06:20des projets il y a quelques années : il fallait ouvrir le dépôt et attendre littéralement
00:06:24jusqu'à deux minutes juste pour voir apparaître les lignes ondulées. Et à chaque modification
00:06:29effectuée, c'était d'une lourdeur incroyable. L'expérience développeur était horrible et plus personne ne voulait
00:06:34travailler sur le projet. Le nouveau serveur de langage apporte un retour instantané dans l'IDE :
00:06:40vous ouvrez un fichier, faites un changement et voyez les erreurs en quelques millisecondes à peine, même sur
00:06:46des bases de code géantes. En plus des performances, ce nouveau serveur de langage est plus stable :
00:06:51le besoin de redémarrer l'IDE quand la vérification des types plante est drastiquement réduit. TypeScript 7
00:06:57réduit les échecs de commandes du serveur de langage de plus de 80 % et les plantages de plus de 60 %.
00:07:04Ça fait moins d'ordinateurs jetés contre les murs, ce qui est plutôt une bonne chose pour l'environnement !
00:07:08Qui savait que Microsoft se souciait de la planète ? Il convient aussi de préciser qu'il s'agit d'un portage,
00:07:13pas d'une réécriture complète. L'équipe TypeScript a fait très attention à ce que le nouveau compilateur soit
00:07:19pleinement compatible avec l'ancien. Vous ne verrez probablement aucune différence, à part la vitesse. Mais
00:07:24même si vous pouvez lancer TypeScript 7 sur vos propres projets, il faudra attendre que vos paquets
00:07:29préférés s'adaptent. L'API programmatique manque encore, ce qui signifie que tout paquet qui en dépend
00:07:35devra attendre la version 7.1. Des paquets comme typescript-eslint, ts-jest ou ts-node accuseront
00:07:42donc un temps de retard. La version complète de TypeScript 7 est disponible au téléchargement, mais
00:07:47vous devez installer explicitement l'extension TypeScript 7 pour VS Code. Le paquet par défaut sera mis à jour
00:07:53à terme, mais pour l'instant, installez simplement cette extension appelée « TypeScript 7 » sur le store d'extensions
00:07:58et tout fonctionnera comme prévu. Si vous voulez en savoir plus sur les fonctionnalités de TypeScript 7, nous avons
00:08:03tourné une vidéo à ce sujet disponible ici. Et si vous aimez ce genre d'analyses, abonnez-vous
00:08:08à Better Stack pour en voir plus. J'espère que vous avez appris quelque chose, et que vous pourrez profiter
00:08:12du développement ultra-rapide qu'offre TypeScript 7. Je sais en tout cas que je vais adorer
00:08:16l'utiliser ! Merci d'avoir regardé, et on se retrouve bien sûr dans la prochaine vidéo.

Key Takeaway

TypeScript 7 réécrit son compilateur en Go pour exploiter le multithread natif et la mémoire partagée, réduisant les temps de compilation jusqu'à 15 fois sur les processeurs multicœurs.

Highlights

  • La compilation de VS Code (1,3 million de lignes de code sur 8 000 fichiers) passe de 125,7 secondes avec TypeScript 6 à 10,6 secondes avec TypeScript 7, soit un gain de 11,9x.

  • L'utilisation d'une puce Apple M3 Max à 14 cœurs associée au drapeau --checkers 12 réduit le temps de vérification de VS Code à 3,5 secondes, atteignant une accélération de 15x par rapport à la version 6.

  • Le passage au langage Go apporte jusqu'à 50 % du gain de performance via le code natif compilé, le reste provenant de la concurrence multithread avec mémoire partagée.

  • La sérialisation coûteuse imposée par les Web Workers en JavaScript disparaît grâce aux structures de données partagées directement en mémoire par le runtime de Go.

  • Le nouveau serveur de langage réduit les erreurs de commandes de plus de 80 % et les plantages de l'IDE de plus de 60 %.

Timeline

Disponibilité de TypeScript 7 et performances globales

  • L'installation standard via npm installe désormais la version 7 dotée du compilateur Go.
  • Le temps de compilation de la base de code de VS Code tombe de 125 à 10 secondes.

Le compilateur bascule entièrement sous une implémentation en Go. Ce changement d'architecture impacte directement les projets à grande échelle en traitant 1,3 million de lignes de code en une fraction du temps précédent.

Limites de JavaScript et passage au langage Go

  • L'exécution monothread de JavaScript limite les traitements d'arbres syntaxiques abstraits à un seul cœur processeur.
  • Le langage Go fournit une exécution native sur le processeur et une concurrence avec mémoire partagée.

JavaScript reste optimisé pour le rendu d'interfaces utilisateurs et l'exécution dans le navigateur plutôt que pour les calculs lourds. Les tentatives de parallélisation en JavaScript nécessitent de sérialiser et désérialiser les données entre les travailleurs, ce qui consomme trop de mémoire. Go élimine ce goulot d'étranglement en permettant à plusieurs threads d'accéder simultanément aux mêmes objets.

Gain de vitesse sur les puces multicœurs et option checkers

  • Le projet Bluesky passe de 24,3 à 2,8 secondes de compilation et Playwright de 12,8 à 1,5 seconde.
  • L'ajout du paramètre --checkers 12 accélère la phase de vérification des types de 4,7 à 2,9 secondes.

L'augmentation des performances dépend du nombre de cœurs disponibles sur la machine hôte. Sur un processeur Apple M3 Max à 14 cœurs, l'allocation de 12 vérificateurs de types parallèles ramène la compilation totale de VS Code de 45,3 secondes sous TypeScript 6 à seulement 3,5 secondes sous TypeScript 7.

Gestion de la concurrence dans le code source de Go

  • Le runtime de Go répartit automatiquement la charge de travail entre les cœurs sans gestion manuelle des threads.
  • L'absence de sérialisation évite la copie coûteuse des arbres syntaxiques abstraits.

La fonction bindSourceFiles illustre la simplification de la liaison des déclarations. Là où JavaScript simule le parallélisme via des promesses tout en restant sur un seul thread ou impose SharedArrayBuffer pour échanger des octets bruts entre travailleurs, Go transmet des objets complexes directement en mémoire.

Stabilité du serveur de langage et transition des paquets

  • Le serveur de langage affiche les erreurs d'analyse syntaxique dans l'IDE en quelques millisecondes.
  • L'absence temporaire d'API programmatique retarde le support complet par des outils comme typescript-eslint ou ts-node jusqu'à la version 7.1.

Les échecs de commandes du serveur de langage diminuent de plus de 80 % et les plantages complets de plus de 60 %. L'extension TypeScript 7 doit être installée manuellement dans VS Code pour bénéficier immédiatement du nouveau compilateur, en attendant l'alignement de l'écosystème de paquets tiers.

Community Posts

View all posts