- En se concentrant sur les différences de philosophie et de valeurs entre les trois langages, l’article compare les problèmes que chacun cherche à résoudre
- Go est présenté comme un langage qui privilégie la simplicité et la stabilité, en réduisant les fonctionnalités au minimum pour faciliter la collaboration et la maintenance
- Rust vise à la fois la sécurité et les performances, et garantit la sécurité mémoire grâce à un système de types complexe et à une structure fondée sur les traits
- Zig est décrit comme un langage expérimental qui donne un contrôle total au développeur grâce à la gestion manuelle de la mémoire et à une conception orientée données
- Les approches contrastées des trois langages révèlent le système de valeurs mis en œuvre par un langage de programmation, et le critère de choix devient la philosophie à laquelle le développeur adhère
Angle de comparaison entre les langages
- L’auteur cherche à comprendre le système de valeurs propre à chaque langage non pas à travers celui utilisé au travail, mais via l’expérimentation de nouveaux langages
- Il souligne qu’au-delà d’une simple comparaison de listes de fonctionnalités, l’essentiel est de voir quels compromis le langage a choisis
- Go, Rust et Zig se recoupent largement sur le plan fonctionnel, mais les valeurs privilégiées par leurs concepteurs diffèrent
- Comprendre la philosophie de chaque langage permet de juger dans quels environnements et pour quels objectifs il est adapté
Go — un langage centré sur la simplicité et la collaboration
- Go se distingue par son minimalisme, avec cette caractéristique qu’« on peut garder l’ensemble du langage en tête »
- Les génériques n’ont été ajoutés qu’au bout de 12 ans, et des fonctionnalités comme les tagged unions ou le sucre syntaxique pour la gestion des erreurs n’existent toujours pas
- L’ajout de fonctionnalités se fait avec une extrême prudence, ce qui entraîne beaucoup de code boilerplate, mais renforce la stabilité et la lisibilité du langage
- Les slices de Go couvrent des fonctions que remplissent
Vec<T> en Rust ou ArrayList en Zig, tandis que l’emplacement mémoire est géré automatiquement à l’exécution
- Le langage est né d’un mécontentement face à la complexité de C++ et à la lenteur de compilation, avec pour objectif une compilation simple et rapide
- Il accorde une grande importance à l’efficacité de la collaboration en environnement d’entreprise, en privilégiant un code clair et cohérent plutôt que des fonctionnalités complexes
Rust — complexe, mais puissant en sécurité et en performances
- Rust revendique les « abstractions à coût nul » et se présente comme un langage maximaliste combinant de nombreux concepts
- Si son apprentissage est difficile, c’est parce que sa densité conceptuelle est élevée, avec un système de types complexe et une structure fondée sur les traits
- L’objectif central de Rust est de concilier performances et sécurité mémoire
- Il effectue des vérifications à la compilation pour empêcher les UB (Undefined Behavior)
- Il bloque les comportements imprévisibles causés par des références de pointeurs invalides ou des doubles libérations, entre autres
- Pour permettre au compilateur de comprendre le comportement du code à l’exécution, le développeur doit définir explicitement les types et les traits
- Grâce à cette structure, la fiabilité du code écrit par autrui est élevée, et l’écosystème de bibliothèques reste particulièrement dynamique
Zig — contrôle total et conception orientée données
- Zig est le plus récent des trois langages ; il en est à la version 0.14 et sa bibliothèque standard est presque dépourvue de documentation
- Il adopte une gestion manuelle de la mémoire, ce qui oblige le développeur à appeler lui-même
alloc() et à choisir un allocator
- Contrairement à Rust ou Go, il permet de créer facilement des variables globales et interrompt le programme à l’exécution lorsqu’un « illegal behavior » est détecté
- Il propose quatre modes de release sélectionnables à la compilation pour ajuster l’équilibre entre performances et stabilité
- Les fonctionnalités de la programmation orientée objet (OOP) sont volontairement exclues
- Il n’y a ni champs privés ni dispatch dynamique, et même
std.mem.Allocator n’est pas implémenté comme une interface
- À la place, le langage vise une conception orientée données (data-oriented design)
- Pour la gestion mémoire également, au lieu d’un contrôle fin objet par objet à la manière de RAII, il recommande une structure consistant à allouer et libérer périodiquement de gros blocs de mémoire
- Zig est décrit comme un langage au tempérament libre et anti-establishment, qui écarte la pensée OOP et pousse au maximum le contrôle exercé par le développeur
- L’équipe se concentre actuellement sur la réécriture de toutes les dépendances, et la version stable (1.0) n’a pas encore de date fixée
Conclusion — les différences de valeurs révélées par les langages
- Go met au centre la collaboration et la simplicité, Rust la sécurité et les performances, et Zig la liberté et le contrôle
- Les différences entre les trois ne relèvent pas d’une simple comparaison de fonctionnalités, mais reflètent un choix philosophique sur le développement logiciel
- Les développeurs finissent par choisir un langage en fonction des valeurs auxquelles ils adhèrent
Aucun commentaire pour le moment.