Bun présente une réécriture intégrale en Rust, réalisée en 11 jours avec Fable 5 Des agents et de la rouille Vincent Hermann Le 13 juillet à 11h29 Bun, un environnement d’exécution JavaScript et un gestionnaire de paquets, a annoncé le 8 juillet une conversion complète de son code vers Rust en un temps record. L’opération a été en grande partie menée grâce à l’utilisation de Claude Fable 5. Bien qu’il s’agisse d’un exemple concret en production, il ne peut pas être appliqué à tout type de projet.

Une erreur ? Bun est un environnement et un gestionnaire de paquets pour JavaScript. Il est développé avec le langage Zig, est open source et sous licence MIT.

Le projet est relativement récent sur la scène du développement, car la version 1.0 stable est sortie en septembre 2023. La dernière révision stable est la 1.3, publiée fin 2025. Elle a notamment ajouté le remplacement à chaud des modules (Bun est également un groupeur de modules, ou module bundler).

Les projecteurs se sont brusquement braqués sur Bun au même moment, quand Anthropic a annoncé son rachat. Une opération logique pour Anthropic, Bun étant déjà utilisé pour certains composants de Claude Code. Et voilà que Bun vient d’annoncer la réécriture complète de son code Zig en Rust… en seulement 11 jours, entre les 3 et 14 mai.

Retour sur 10 ans de Rust, un langage devenu incontournable Sylvestre Ledru (Mozilla) : de Firefox au noyau Linux, la fulgurante ascension du Rust Direction Rust ! Dans son billet, Jarred Summer, à la tête du développement de Bun, explique que la version initiale de Bun avait été écrite en un an et en Zig, avant l’apparition des LLM. Aujourd’hui, le CLI (interface en ligne de commande) de Bun est téléchargé 22 millions de fois par mois. Alors pourquoi une réécriture totale en Rust ?

Selon Summer, le choix n’est pas idéologique, mais motivé par une liste précise de bugs récurrents dans la version Zig : des dizaines de bugs de type use-after-free (le noyau réutilise un pan de mémoire qu’il a déjà libéré), double-free (double utilisation de la fonction free() sur la même adresse mémoire) et fuites mémoire dans des modules critiques (node:zlib, node:http2, UDPSocket, crypto.scrypt, TLS…). L’argument central de Sumner est que Zig, comme le C, ne gère pas la mémoire pour vous, et ne dispose pas de constructeurs/destructeurs. Le nettoyage repose sur le mot-clé explicite defer.

Il est manuel et il faut donc penser à l’utiliser, rendant l’erreur humaine quasi inévitable à grande échelle. « Chaque allocation mémoire doit être examinée avec minutie. Où ces octets sont-ils libérés ?

Comment s’assurer qu’il ne soit libéré qu’une seule fois ? Avons-nous bien vérifié les exceptions JavaScript ? Ce pointeur collecté à la poubelle est-il visible pour le scanner de pile conservateur ?

Est-ce de la mémoire récupérée ou de la mémoire gérée manuellement ? », liste Jarred Summer, parmi les questions récurrentes. Après avoir envisagé le C++, il se tourne finalement vers le Rust, car une bonne partie des problèmes rencontrés sont liés à la gestion de la mémoire. Avec le « nouveau » langage, loué pour la sécurité induite justement en mémoire, ces problèmes apparaissent à la compilation.

Encore faut-il que le code soit en Rust « sûr » (safe). Summer aborde d’ailleurs ce point. 4 % du code Rust de Bun se trouvaient ainsi dans un bloc unsafe, soit environ 13 000 mots-clés unsafe dans environ 27 000 lignes sur un total d’environ 780 000.

La totalité du code ne peut pas être en Rust safe, car Bun continue d’embarquer des dépendances C/C++ significatives, comme JavaScriptCore, uWebSockets, BoringSSL, SQLit et lshpack/lsquic. Le rôle prépondérant de Claude Fable 5 Le billet détaille amplement les méthodes utilisées. Par exemple, le choix d’une réécriture complète (plutôt qu’incrémentale) a été motivé par la propre expérience de Jarred Summer dans ce type d’opération, et par la disponibilité d’une suite de tests indépendante du langage d’implémentation.

Selon Summer, elle a permis de garder un filet de sécurité comportemental identique pour l’avant/après. On apprend en outre que la « revue adversariale » a été faite par deux instances Claude en contexte séparé, chargées de débusquer les bugs et présentées comme le mécanisme central de contrôle qualité. Et c’est justement la présence de Fable 5 au cœur du mécanisme qui rend l’annonce si visible.

La version de test a été produite en 11 jours. Les chiffres associés sont impressionnants : 5,9 milliards de tokens d’entrée non mis en cache, 690 millions de tokens de sortie, et 72 milliards de tokens d’entrée lus en cache. Soit environ 165 000 dollars au tarif de l’API, contre une estimation d’environ un an de travail pour trois ingénieurs à temps plein sur le code existant pour les 535 496 lignes de code, selon Jarred Summer.

Source : Bun Cette performance – en moyenne 1 300 lignes de code à la minute – concerne cependant la phase de génération brute, pas le code fonctionnel. Le billet précise qu’à ce stade, « absolument rien ne fonctionnait encore ». Une performance à relativiser également sur l’utilisation du LLM, car elle n’avait rien de « naïf ».

L’orchestration humaine a été lourde, avec environ 50 flux de travail dynamiques et jusqu’à 64 instances de Claude en parallèle, réparties en quatre arbres de travail (worktrees). Summer dit avoir lui-même surveillé manuellement les sorties pendant l’essentiel des 11 jours de travail. Le billet documente aussi des échecs répétés du modèle dans des cas précis : interprétation erronée de consignes, ajout de commentaires justificatifs longs pour masquer des contournements…

Un comportement suffisamment problématique pour que Sumner ait fini par ajouter une règle explicite aux réviseurs adversariaux : « Si vous avez besoin d’un paragraphe entier pour justifier qu’un contournement est correct, c’est que le code n’est pas bon – corrigez le code ». Bon… et alors ? Selon Jarred Summer, les avantages de Rust sont évidents dans la préversion.

Allègement des binaires, consommation de mémoire réduite, résolution de nombreux bugs liés à la mémoire existants dans la version actuelle 1.3.14… Sur le plan des performances, les gains sont plus mesurés, avec 2 à 5 % en moyenne selon les scénarios. Jarred Summer veut pour preuve de sa réussite que la version 2.1.181 de Claude Code, publiée le 17 juin, utilise la version de Bun réécriture en Rust.

Cela signifie-t-il que tout est parfait et que tout le monde devrait se lancer dans le même type d’opération ? Pas du tout. Le billet de Bun est assez transparent sur les défis restants.

Bun 1.4.0 sera bien la première version intégralement en Rust et des corrections continueront pendant toute la phase de test. Mais plusieurs éléments méritent d’être soulignés, dont le caractère même du billet : intéressant dans le retour d’expérience qu’il rapporte, mais qui reste une communication d’entreprise puisque Jarred Summer travaille pour Anthropic et a pu bénéficier de Fable 5 quand presque plus personne n’y avait droit en mai. On pourrait souligner également que des régressions peuvent apparaître avant et après la version finale.

19 ont ainsi été détectées et corrigées, mais la suite de tests, malgré le grand nombre d’exercices (plus de 60 000) a été écrite avant la réécriture de Bun, son périmètre n’est donc pas optimal. En outre, Jarred Summer ne dit rien des bugs qui ont pu échapper aux instances adversariales bâties sur Claude et qui ont pu être détectés avec d’autres méthodes. Faisons remarquer aussi que les 165 000 dollars présentés comme facture de la migration peuvent être trompeurs : ils n’incluent pas le lourd temps humain de supervision pendant les 11 jours, ni l’infrastructure de calcul, ni le travail de fusion et post-fusion du code.

Ce cas ne peut pas être généralisé. Même si la réécriture de Bun doit s’avérer une franche réussite, elle le devra en bonne partie à la suite de tests indépendants du langage d’implémentation, qui a permis la validation des opérations menées par les agents, en comparant les situations avant et après. Le résultat ne sera pas non plus un code Rust « idiomatique ».

Il sera loin d’être parfait et de répondre aux standards de sécurité auxquels un code dans ce langage peut prétendre, mais le billet est transparent sur la question. Summer indique que l’objectif était bien la parité comportementale. Le code safe et profitant vraiment de tous les avantages de Rust viendra plus tard, lors de « refactorings ultérieurs ».

Il ne donne pas plus de précisions. Enfin, il ne s’agit clairement pas d’un scénario « lancer et oublier ». Le cas présenté est celui d’un ingénieur senior utilisant des agents comme amplificateurs, pas en remplacement de son expertise.

Lancer Fable 5 et lui demander simplement de réécrire du code en Rust n’a aucune chance de donner un résultat approchant. Le projet Bun disposait d’ailleurs de conditions favorables à la base, comme sa structure pensée pour la portabilité, l’absence de dépendance à des paradigmes très spécifiques au C/C++, ou même le fait que Jarred Summer est l’auteur principal, travaillant seul sur une bonne partie des tâches. Un projet C/C++ ancien, avec de multiples contributeurs, des conventions peu claires, des dépendances à des extensions spécifiques de compilateur, ou surtout une suite de tests incomplète ou couplée au langage source, rencontrerait des difficultés bien plus importantes avec cette même méthode.

Et les coûts s’envoleraient d’autant. Cet article est en accès libre, mais il est le produit d'une rédaction qui ne travaille que pour ses lecteurs, sur un média sans pub et sans tracker. Soutenez le journalisme tech de qualité en vous abonnant.

Accédez en illimité aux articles d'un média expert Profitez d'au moins 1 To de stockage pour vos sauvegardes Intégrez la communauté et prenez part aux débats Partagez des articles premium à vos contacts Abonnez-vous Signaler un commentaire Voulez-vous vraiment signaler ce commentaire ? Non Oui