Connexion Premium

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

Bun présente une réécriture intégrale en Rust, réalisée en 11 jours avec Fable 5

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.

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.

Direction Rust !

Dans son billet, Jarred Sumner, à 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 Sumner, 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 Sumner, 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).

Sumner 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, SQLite 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 Sumner dans ce type d’opération, et par la disponibilité d’une suite de tests indépendante du langage d’implémentation. Selon Sumner, 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 Sumner.

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). Sumner 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 Sumner, 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 Sumner 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éécrite 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 Sumner 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 Sumner 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. Sumner 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 Sumner 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.

Commentaires (18)

votre avatar
très bon article sur ce retour, merci
votre avatar
C'est surtout de la bonne grosse pub pour Anthropic ?

Avec un prix des tokens qui devraient être bien revus à la hausse, genre mini x100 (ou x1000 ?) pour être à peu près rentable, ça changerait énormément la donne.

Et des ingés crament moins la planète (et le moral des dev opensource) qu'Anthropic avec leurs scrappers de qui ne respectent rien, cf le dernier article de lwn.net ("An update on the scraper situation").
votre avatar
Avec un prix des tokens qui devraient être bien revus à la hausse, genre mini x100 (ou x1000 ?)
Y a des chiffres là-dessus ? Pour l'inférence pure, quand des modèles équivalents sont disponibles sur OpenRouter par exemple, on ne remarque pas de changement d'ordre de grandeur au niveau des prix aux tokens. Ou on tient compte du prix du training dedans aussi ?
votre avatar
Suis assez d’accord, ça me semble surtout un coup de pub d’Anthropic.

Cf un article du lead developer de Zig qui est visiblement bien content que Bun ne soit plus associé à son langage de programmation…
https://andrewkelley.me/post/my-thoughts-bun-rust-rewrite.html
The blog post is expertly written. It's almost like the marketing department of a trillion dollar company has a lot of money riding on this article.
votre avatar
Clairement on est dans l'effet waouh (gros chiffre, gros budget...) même si le projet semble bien mené.

D'ailleurs la justification du projet peut aussi faire un peu sourire.
On nous explique depuis des semaines que Fable/Mythos sont expert en audit, détection et correction de bug et autres failles (mémoire en particulier) mais plutôt que de tenter d'améliorer le code existant c'est une réécriture lourde et coûteuse qui est choisit en misant sur le fait que le changement de langage réduise les problèmes.
votre avatar
votre avatar
Cimer pour le partage
votre avatar
Montant ?
votre avatar
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
votre avatar
165 000$ de tokens alors qu'on sait que le prix du token est fortement subventionné, + du travail humain, + un code apparemment pas giga propre et le travail est pas fini...

Ça va plus vite qu'avec des humains mais en terme de coût, je me demande si le gain est très important...
votre avatar
C'est surtout les abonnement qui sont soit disant subventionné.
Le prix de l'API elle me parait par contre plutôt cher. A comparer avec de l'inférence de modèles opensource ou les tarifs sont moins cher parfois d'un facteur 10
votre avatar
Je suis pas sûr que les modèles open-source aient le même coût d'entraînement (à amortir sur la "durée de vie" du modèle), ni le même nombre de paramètres et partant la même VRAM occupée, ni même souvent la même fenêtre de contexte. Sans même parler de la quantisation agressive souvent poussée par les fournisseurs de modèles open-source, sans toujours le dire ouvertement.
votre avatar
Moi je prédis plutôt la fin de la récré (pour gpt anthropic et consort) quand tous seront massivement passé en prix api plutôt qu’en abonnement fenêtre.
Je pense (peut-être a tord), que ce sont les prix api qui sont hors sol. Ce qui coûte dans les datas center c’est le compute, pas le token, qui est une unité d’estimation du compute qu’ils ajustent comme ça les arrange. La seconde chose qui coûte vraiment c’est le training de modèles.
Avec l’arrivée en masse des modèles chinois, les boites en frontier devront rationaliser leur coûts tôt ou tard… et mettre les prix là où les utilisateurs sont prêt à payer. Après 3 ans de soi disant subvention, ils pourront pas faire x10…
votre avatar
Je pense que le gain est réel. Si c'est 1 ans sans features contre 2 semaines aux fourneaux+ $165k c'est potentiellement rentable.

C'est aussi seulement viable si le changement est justifié. Je pense que la justification de passer à un language ou la fuite de mémoire est plus difficile est suffisamment développée dans le le billet de blog. Il ne précise pas le chiffre d'affaires de bun ou son coup de maintien annuel. Donc on en sait pas si les $165k sont plus ou moins gros (3 dev aux USA leur salaire c'est déjà plus que 165).

Le ferais-je pour mes projets au travail ? Non car ils ne souffrent pas de problèmes aussi importants pour justifier le prix. Mais on peut facilement imaginer des situations similaires ou quelques semaines de travail intensif pour sortir d'un cycle de régression pourrait être intéressant. Tous ceux qui ont dû faire la migration vers python 3 me comprennent...
votre avatar
Ce que je veux dire c'est que si on estime que la subvention fait le token à 50%, donc que le coût réel est à 330k + un humain qui surveille pendant ~1 mois + du boulot de dégrossissement à faire derrière, ça te fait le projet à quoi, 350k-400k ? Si c'est pour faire le boulot de 3 ingés pendant 1 an, au prix annuel d'un ingé, tu es probablement encore rentable de faire ça à l'IA, mais c'est pas, genre, "un ordre de grandeur moins cher quand c'est l'IA qui fait" comme on a pu le penser un temps.

Là où tu gagnes surtout, c'est en vitesse d'exécution qui te permet d'avoir ton produit prêt à l'emploi plus rapidement. Mais même là, il faudra voir combien de temps il faut vraiment pour arriver à un résultat vraiment équivalent. Là de ce que j'ai compris, c'est "3 semaines mais sans compter le débugging ni le nettoyage du code qui est dégueulasse en l'état".
votre avatar
Tu oublies également qu'en amont il a écrit les scenario de tests : plus de 60000 !
Sans ça je doute que l'IA s'en serait sorti...
votre avatar
A l'ancienne cela aurai plutôt mérité une version 2.0.0 alpha vu la refonte total.
votre avatar
Avant, le choix c'était deux devs expérimentés pendant un an, ou 50 devs externalisés (en Inde par exemple) pendant deux semaines. Maintenant on passe aux LLMs, mais dans tous les cas, on verra le vrai prix a payer lorsqu'il faudra... maintenir le projet.