- Le projet Git a officiellement annoncé qu’il allait introduire Rust dans son cœur, et qu’à partir de Git 3.0, Rust deviendrait une exigence obligatoire pour la build
- Cette série de patchs est menée comme un test ballon comparable à l’introduction passée de fonctionnalités C99, avec pour objectif de mettre progressivement en place l’infrastructure nécessaire à l’adoption de Rust
- Comme première étape, le module varint.c, avec très peu de dépendances, a été converti en Rust afin de valider l’interopérabilité C-Rust et les outils de build
- Pour l’instant, seule la build avec Meson est prise en charge ; par la suite, le projet prévoit d’ajouter la prise en charge du Makefile ainsi que, dans la CI, la validation des builds Rust et des contrôles de cohérence de formatage basés sur
cargo format
- Il s’agit d’un changement important qui laisse à la communauté Git et aux distributeurs le temps de s’adapter aux nouvelles exigences de la toolchain Rust, tout en améliorant à long terme la sûreté du code et sa capacité d’évolution
Contexte de l’introduction de Rust
- Git étudie depuis longtemps une évolution du langage utilisé afin d’améliorer sa stabilité et sa maintenabilité
- L’introduction de Rust signifie un renforcement de la sûreté mémoire, l’usage d’une toolchain moderne et la possibilité d’optimisations de performance
- Elle vise aussi à construire une base de code plus robuste grâce à l’adoption d’un langage moderne
- En annonçant à l’avance que Rust deviendra indispensable au moment de la sortie de Git 3.0, le projet veut laisser à l’écosystème le temps de se préparer
- Le périmètre du code Rust sera élargi progressivement, avec à terme l’objectif de réimplémenter en Rust certaines fonctionnalités clés
Série de patchs expérimentale
- Le projet a choisi varint.c comme premier module porté vers Rust
- il est très simple et sans dépendances
- il permet de vérifier l’interop C ↔ Rust
- il permet de mener l’expérience sans impact sur l’ensemble des fonctionnalités de Git
- Tous les tests passent avec la version varint.rs
Changements dans le système de build
- Pour l’instant, la prise en charge de Rust n’a été ajoutée que dans le système de build Meson
- Le projet prévoit ensuite d’ajouter la prise en charge de Rust dans le Makefile
- Des travaux sont également nécessaires côté CI
- validation de la build Rust et de son bon fonctionnement
- garantie de la cohérence du style de code via
cargo format
- autres automatisations liées au tooling et à la maintenance
Suite du plan
- Ce travail se concentre davantage sur l’expérimentation du processus d’adoption que sur les fonctionnalités Rust elles-mêmes
- Par la suite, davantage de composants internes de Git, y compris le module xdiff, pourraient être réécrits en Rust
- Le projet prévoit d’étendre progressivement l’usage de Rust afin d’amener l’ensemble de l’écosystème à s’adapter à un environnement de build fondé sur Rust
Points à retenir
- Git se prépare à l’une des transitions de langage les plus importantes de son histoire
- Le caractère obligatoire de Rust peut apporter sûreté, maintenabilité et potentiel d’évolution à long terme
- Pour les distributeurs et les développeurs, la mise en place d’un environnement de développement Rust deviendra incontournable dans l’écosystème Git
1 commentaires
Avis Hacker News
Lien vers la discussion connexe
Comme le support de Rust concerne aussi un langage sans standard formel, il soupçonne qu’avec le temps l’implémentation prendra beaucoup de retard (comme ce fut le cas pour Java autrefois)
Git semble déjà être un outil très abouti, qui n’aurait besoin que de maintenance ou d’améliorations, sans nécessiter assez de nouveau code massif pour justifier l’introduction d’un nouveau langage
Contrairement à Linux, qui a continuellement besoin de nouveaux pilotes, il ne voit pas de raison équivalente pour Git
Il aimerait que quelqu’un lui explique ce qu’il lui manque
On peut consulter les changements de Git dans les RelNotes, ou de façon plus lisible dans la catégorie Git du blog GitHub
Par exemple, git-branchless propose des fonctions comme les fusions en mémoire, écrites en Rust
Pour ce qui concerne Rust, on peut aussi chercher davantage sur cette mailing list
(Il précise qu’il ne porte pas lui-même de jugement pour ou contre, et que quelqu’un d’autre le fera sans doute)
Presque personne ne veut développer Git en C, alors que des développeurs intéressés par une réécriture en Rust sont très motivés pour rejoindre le projet
Git est très abouti et n’ajoutera probablement pas tant de nouveau code que cela
Rust est bien plus complexe que le C
Si l’on a vraiment besoin de fonctionnalités orientées objet, utiliser simplement du C++98 serait bien plus simple et plus facile à comprendre que le C++ récent ou Rust
Rust ne sera pas obligatoire pour les futurs patchs, mais devrait le devenir dans le système de build
Si c’est incorrect, il pourra encore le modifier
Est-ce nécessaire pour construire le système de build lui-même, ou aussi obligatoire pour construire l’application ?
Elle a beaucoup investi dans Git et construit plusieurs projets autour de lui, et ne veut pas perdre sa capacité à le hacker
En pratique, Rust est plus facile à apprendre que le C moyen (surtout le C bogué), et certainement plus facile que d’assimiler le code source de Git ou de Linux
D’après GitHub : C 50 %, Shell 38 %, Perl 4 %, et le reste en TCL/Python, etc.
Perl/TCL sont même plus atypiques encore
Le projet a grossi avec beaucoup de code bricolé ajouté un peu partout, et il est désormais temps d’améliorer la sécurité et les performances, ainsi que de nettoyer cet ancien code de fortune
Rust semble bien adapté à cela
Le fait que Git utilise un peu de Rust ne devrait pas gêner le développement de clients ou serveurs Git écrits par soi-même
Les notes de version de Debian mentionnent aussi les problèmes liés aux paquets Rust/Go
Lors de la compilation des paquets Rust, les problèmes de liens statiques imposent souvent des reconstructions fréquentes, ce qui est peu pratique en usage réel
Si Rust continue d’ignorer la question de l’ABI stable et des bibliothèques partagées, pourtant indispensables sur Linux, cela risque de susciter encore plus de plaintes que le C
Il pense qu’il faut être plus prudent sur les grandes architectures logicielles
On peut chercher le mot-clé NonStop dans cet article pour voir un exemple
Dans le RESF et ailleurs, on dit parfois que « la plateforme ne supporte pas Rust », mais en réalité il faut que le compilateur Rust la prenne en charge pour que cela fonctionne vraiment
git semble stabilisé en 2.x, donc il ne voit pas pourquoi casser la compatibilité
Il se demande si la culture de développement récente ne s’est pas éloignée de cette maîtrise des toolchains
Le contrôle de source, le build et l’environnement d’exécution étaient distincts, nécessitaient des copies distantes ou de l’exécution à distance, et les règles de build devaient obligatoirement détecter la plateforme cible
Avec un seul flag
--target, on peut compiler pour une centaine de plateformes sans problème particulierLe vrai souci viendrait plutôt du fait qu’une partie des développeurs de Git tiennent à leurs anciennes machines de développement figées
Elle a toujours été traitée comme un citoyen de seconde zone, et dans les projets externes il ne s’attend même pas à ce qu’elle fonctionne correctement
Certaines distributions Linux imposent même de compiler sur le vrai matériel, comme pour le Raspberry Pi
C’est pourquoi personne ne fait vraiment l’effort de bien la prendre en charge
Linux est particulièrement mauvais sur ce point, car l’architecture de glibc a vieilli au point de rendre difficile le ciblage du plus petit dénominateur commun glibc sur n’importe quel matériel
La plupart des projets n’essaient même pas de prendre en charge la cross-compilation
Zig essaie d’améliorer la situation
Git étant un outil central, le risque des changements est élevé, et en faire une dépendance obligatoire en à peine six mois lui paraît dangereux
Cette complexité sert à attraper plus d’erreurs à la compilation, mais rend en contrepartie le langage lui-même assez complexe
Il ne recommande donc pas son adoption
Il croit savoir que le noyau a lui aussi refusé Rust
Ajouter à un noyau déjà complexe un système de types digne de Haskell et un système de macros de niveau Lisp ne ferait qu’augmenter la complexité
Il est difficile de suivre du code Rust qui utilise serde
À l’inverse, le
Unmarshalde Go est bien plus facile à suivreParce qu’ils permettent de faire porter davantage d’informations au compilateur
Il n’a jamais eu de gros problèmes avec Serde ; en revanche, il a plus souvent dû déboguer le
Unmarshalde GoQuant à l’affirmation selon laquelle le noyau aurait refusé Rust, il s’agissait en réalité d’un conflit entre deux développeurs à propos de l’emplacement de stockage des headers
Rust a une barrière à l’entrée plus élevée que le C, mais l’écart entre du « Rust minimal » et du « Rust rapide et sûr » est bien plus faible qu’en C
Cela est jugé aussi important que le borrow checker
Resultet la gestion des erreurs, Rust est finalement assez facile à apprendreSa syntaxe est aussi permissive
Le noyau Linux n’a d’ailleurs pas réellement refusé Rust