- Le projet de navigateur Ladybird adopte Rust comme langage à sûreté mémoire pour remplacer le C++, et utilise des outils d’IA dans le processus de transition
- Swift avait d’abord été envisagé, mais le projet s’est tourné vers Rust en raison de limites d’interopérabilité avec le C++ et de contraintes de plateforme
- La première cible du portage est LibJS, le moteur JavaScript, avec une traduction manuellement pilotée au moyen de centaines de prompts via Claude Code et Codex
- Environ 25�00 lignes de code Rust ont été produites en à peine deux semaines, et il a été vérifié que la sortie comme les performances sont strictement identiques à la version C++
- Le projet conservera pour l’instant un développement parallèle en C++ et en Rust, avec l’objectif à long terme de renforcer la sûreté et la maintenabilité
Pourquoi adopter Rust
- Ladybird a étudié plusieurs langages afin de trouver un langage à sûreté mémoire pour remplacer le C++
- Swift a été écarté en raison du manque d’interopérabilité avec le C++ et des limites de prise en charge hors de l’écosystème Apple
- Rust a été évalué comme un langage doté d’un écosystème mature pour la programmation système, et déjà familier à une grande partie des contributeurs
- En 2024, son adoption avait été reportée à cause de la mauvaise adéquation de Rust avec l’OOP de style C++, mais la décision a ensuite été réintroduite au nom de la sûreté et de la maturité de l’écosystème
- En s’appuyant sur les précédents de Firefox et Chromium, l’équipe a jugé que Rust convenait aussi à Ladybird
Processus de portage de LibJS
- La première cible de la transition est LibJS, le moteur JavaScript de Ladybird
- Avec ses composants indépendants comme le lexer, parser, AST, bytecode generator et sa couverture de tests basée sur test262, il constituait un bon point de départ
- Le portage a utilisé Claude Code et OpenAI Codex
- Il ne s’agit pas d’une génération automatique, mais d’une traduction pilotée par des humains, avec choix direct de l’ordre de portage et de la structure du code
- Des instructions détaillées ont été données via des centaines de prompts, puis la validation du code et la détection d’erreurs ont été effectuées à l’aide de différents modèles
Résultats et validation
- L’objectif était que les sorties des pipelines C++ et Rust soient identiques octet par octet
- Environ 25�00 lignes de code Rust ont été finalisées en deux semaines, raccourcissant un travail qui aurait pris plusieurs mois
- L’AST et le bytecode sont strictement identiques, sans aucune baisse de performance sur les tests et benchmarks JS
- La concordance des résultats pendant la navigation web a été vérifiée via des tests en lockstep exécutant simultanément les pipelines C++ et Rust
- Le code actuel conserve une forme traduite depuis le C++ et reproduit même les schémas d’allocation de registres
- La priorité absolue est en effet de garantir la compatibilité avec le pipeline C++
- Lorsque viendra le moment d’abandonner le pipeline C++, le code Rust sera simplifié et nettoyé
Suite du projet
- La transition vers Rust avance comme un travail parallèle, et non comme l’axe principal de développement du projet
- Le code C++ et le code Rust coexisteront, avec des frontières d’interopérabilité clairement définies
- L’ordre et le périmètre du portage sont pilotés par l’équipe principale, et les contributeurs externes doivent se coordonner au préalable
- À long terme, le projet vise une amélioration progressive de la sûreté et de la maintenabilité
- Tout en reconnaissant que cette décision peut être controversée, l’équipe l’évalue comme le bon choix pour l’avenir de Ladybird
1 commentaires
Avis Hacker News
Le point le plus intelligent de ce projet est d’avoir exigé une sortie strictement identique au byte près
Grâce à cela, ils peuvent exécuter l’ancien et le nouveau pipeline en parallèle, comparer les diff et repérer immédiatement les bugs introduits pendant la traduction
Si tant de réécritures échouent, c’est parce que les gens essaient de « l’améliorer » pendant le portage et finissent par traquer des bugs fantômes dus à l’ancienne version, à la nouvelle version, ou simplement à des différences de comportement
Même si la version traduite de C++ vers Rust paraît maladroite au début, ce n’est pas grave. Une fois la partie C++ complètement retirée, on pourra la rendre progressivement plus idiomatic
Tant que la sortie reste identique, on peut faire du refactoring, de l’optimisation et de la documentation
Je pense que documenter le code pendant qu’on le lit est le meilleur moment pour le faire. Pour un projet populaire comme Ladybird, mieux documenter revient directement à accélérer le développement
Avant, comme le coût d’une migration était trop élevé, on se disait « tant qu’à faire, améliorons aussi », mais au final on passait surtout plus de temps à courir après des bugs fantômes
Ils ont utilisé Claude Code et Codex pour traduire le code C++ en Rust
Ce n’était pas entièrement automatique : des humains ont piloté l’ensemble et affiné le résultat avec des centaines de petits prompts
Ils ont imposé dès le départ que la sortie des deux pipelines soit strictement identique au byte près, et au final 25 000 lignes de code Rust ont été produites en deux semaines
L’AST et le bytecode correspondaient tous les deux, avec zéro régression
Je pense que c’est exactement la bonne manière d’utiliser l’IA pour des portages entre langages
En 80 minutes, il a analysé la structure de Drupal, restauré le design initial et l’architecture des modules à l’identique, et implémenté jusqu’aux plugins personnalisés
On raconte maintenant que ce site a ensuite été migré vers WordPress, ProcessWire, Node.js, puis désormais jusqu’à Next.js
Je ne veux pas d’un « code fini en un seul prompt », mais d’un outil qui augmente l’intelligence humaine (IA) au fil de longues sessions de va-et-vient avec l’IA
Mais ce type d’outil ne peut être utilisé que par des gens qui ont déjà des connaissances en développement, donc le marché sera sans doute plus petit
Claude n’écrit pas directement le code : il donne seulement des indices et fait la revue
Rust est difficile à écrire de manière improvisée à cause des caractéristiques du langage, donc cette façon de faire me satisfait beaucoup
Il en existe maintenant même une version wasm qui tourne dans le navigateur
Je n’ai pas implémenté moi-même les parties liées au chiffrement, donc pas d’inquiétude là-dessus
La transition vers Rust est intéressante, mais c’est surprenant parce que l’équipe Ladybird avait auparavant une position assez marquée de « anti-Rust hype »
Cela dit, si le projet passe à Rust, il me sera sans doute bien plus facile d’y contribuer
Un langage n’est qu’un outil, et je ne pense pas qu’il faille lier son identité à un langage particulier
Andreas est un excellent ingénieur avec un vrai sens entrepreneurial
Je trouve impressionnant qu’il ait fait évoluer un projet hobby vers un projet industriel
En revanche, ce genre de changement de langage rapide me rend un peu nerveux
Je vois cela comme le résultat d’une croissance naturelle du projet
La phrase « code Rust non idiomatique qu’on nettoiera plus tard » donne l’impression d’annoncer une autre réécriture, ce qui m’inquiète
Quand une startup change de langage, cela ressemble souvent à un signal de risque
Quand le développement de la nouvelle version et celui des fonctionnalités existantes avancent en parallèle, il y a une course à la vitesse, et la nouvelle version peut ne jamais rattraper l’ancienne
Linux, PHP et musl libc ont eux aussi connu plusieurs réécritures complètes
Maintenant que l’IA s’est généralisée, le calcul autour d’une « réécriture complète dans un nouveau langage » a totalement changé
Surtout si on dispose d’une suite de tests, le risque diminue énormément
On vit à une époque où l’importance des tests a été multipliée par dix
Pouvoir essayer rapidement différentes interfaces comme Streamlit, Shiny ou Dash rend le prototypage très agréable
Sur certains projets, une combinaison low-code + agent suffit déjà largement
La partie disant qu’ils ont confié la revue de code à l’IA me semble inquiétante
Les modèles ont des limites pour repérer des erreurs logiques
La vraie question est surtout de savoir si le « nettoyage » annoncé sera réellement fait ensuite
Plus on dépend de code produit par l’IA, plus on risque d’entrer dans un cercle vicieux de dépendance à l’IA
Le fait que le projet développe en parallèle C++ et Rust paraît inefficace
Je me demande s’il ne vaudrait pas mieux unifier directement sur un seul langage memory-safe
Tant que chaque composant est écrit dans un seul langage, il n’y a pas de problème
Lors de l’adoption de Swift en 2024, Andreas avait tweeté à propos de Rust
Il disait que Rust était excellent pour les programmes de courte durée, mais malcommode pour les programmes de longue durée qui maintiennent des graphes d’objets complexes
Il ajoutait aussi que la communauté avait une réputation toxique
Lien vers le tweet concerné
Je me demande si ce code Rust non idiomatique ne risque pas de devenir plus tard de la dette technique
Le projet Servo a lui aussi rencontré ce problème, mais cela a aussi permis d’identifier des bugs potentiels au passage
Le passage à Rust semble correspondre à ce principe comme un choix mûri