- Le langage Zig est en train d’évoluer vers une implémentation directe des fonctionnalités de libc dans la bibliothèque standard Zig, en supprimant progressivement l’ancien code source en C
- À ce jour, environ 250 fichiers source C ont été supprimés, et il en reste 2032
- Cette transition apporte notamment une amélioration de la vitesse de compilation, une réduction de la taille d’installation et une diminution de la taille des binaires lors de l’édition de liens statique
- Une amélioration récente permet à zig libc d’être optimisée avec d’autres morceaux de code à l’intérieur d’une Zig Compilation Unit (ZCU), plutôt que comme archive statique séparée, ce qui rend possible l’élimination du code dupliqué et des optimisations de niveau LTO
- Avec la transition de Zig vers son propre rôle de fournisseur de libc statique, il faut désormais soumettre directement les rapports de bugs au projet Zig en cas de problème connexe
Vue d’ensemble du projet Zig libc
- Plusieurs contributeurs participent au sous-projet zig libc afin de remplacer l’implémentation libc existante en C par des wrappers de la bibliothèque standard Zig
- L’objectif est de supprimer le code C redondant et de fournir soit des fonctions de mappage simple comme
memcpy, atan2, soit des wrappers de fonctions plus générales comme strnlen
- Par exemple, la fonction
strnlen est implémentée à l’aide de std.mem.findScalar de Zig
- Jusqu’à présent, environ 250 fichiers source C ont été supprimés, et 2032 restent encore
Améliorations de performance et de structure
- À mesure que chaque fonction est convertie vers Zig, les dépendances aux projets externes et au langage C diminuent
- Cela entraîne une hausse de la vitesse de compilation, une simplification et une réduction de la taille d’installation, ainsi qu’une réduction de la taille des binaires des applications utilisateur liées statiquement
- Un changement récent fait que zig libc est compilée à l’intérieur d’une Zig Compilation Unit (ZCU) avec le reste du code Zig
- Au lieu d’être liée comme archive statique distincte, elle exploite la structure intégrée du compilateur et de l’éditeur de liens
- Cela permet l’élimination du code dupliqué et l’optimisation inter-fonctions
- C’est similaire à l’optimisation au moment de l’édition de liens (LTO), mais réalisé à l’étape du front-end plutôt qu’à celle du linker
Possibilités d’extension futures
- Combiné aux récents changements de
std.Io, cela pourrait permettre à l’utilisateur de contrôler le comportement d’E/S de libc
- Exemple : intégrer les appels
read et write dans une boucle d’événements io_uring
- Il serait aussi possible d’appliquer des fonctions de détection des fuites de ressources à du code C tiers
- Cependant, cela reste pour l’instant au stade d’idée non expérimentée
Tests et assurance qualité
- Le projet libc-test de Szabolcs Nagy aide grandement à prévenir les régressions sur les fonctions mathématiques
- Cet ensemble de tests sert à vérifier la précision de Zig libc
Informations pour les utilisateurs
- Zig est en train d’évoluer vers une étape où il fournit lui-même les fonctionnalités de musl, mingw-w64 et wasi-libc
- En cas de problème connexe, il faut soumettre directement un rapport de bug au projet Zig
- L’objectif est d’éviter que des tickets erronés soient transmis aux mainteneurs des projets libc indépendants
Conclusion
- La dernière phrase du billet est : « Abolish ICE » (sans explication supplémentaire)
Aucun commentaire pour le moment.