- Rust est un langage dont les différents concepts sont étroitement imbriqués, si bien qu’il faut apprendre de nombreux éléments en même temps, même pour comprendre un programme de base
- Les fonctions, les génériques, les énumérations, le pattern matching, les traits, les références, l’ownership,
Send/Sync, Iterator, etc. sont tous des éléments fondamentaux conçus pour interagir entre eux
- Comparé à JavaScript, avec JS il est possible d’écrire du code en ne connaissant qu’une partie des concepts, alors qu’avec Rust, il faut comprendre le contexte global du langage pour pouvoir écrire un code réellement pertinent
- Cette complexité propre à Rust augmente la difficulté d’apprentissage, mais apporte en contrepartie sécurité et cohérence, tout en influençant fortement la manière de concevoir le code
- Cette architecture linguistique fait la singularité de Rust, et la vision d’un « Rust plus petit » invite à reconsidérer une philosophie du langage finement articulée
La difficulté d’apprentissage de Rust
- Malgré une barrière à l’entrée élevée, de nombreuses personnes ont contribué à améliorer la documentation, les API et les diagnostics
- Parmi les concepts de base figurent les fonctions comme objets de première classe, les énumérations, le pattern matching, les génériques, les traits, les références, le borrow checker, la sûreté concurrente et les itérateurs
- Ces concepts sont interdépendants et imbriqués, ce qui rend difficile leur apprentissage isolé, et la bibliothèque standard exploite elle aussi largement ces fonctionnalités
- Même pour comprendre une vingtaine de lignes de code Rust, il faut souvent appréhender simultanément plusieurs éléments comme le paradigme fonctionnel,
Result et la gestion des erreurs, les types génériques, les énumérations et les itérateurs
Comparaison entre Rust et JavaScript
- En écrivant le même programme de détection de changements de fichiers en Rust et en JS, on constate qu’en Rust de nombreux concepts du langage s’entrecroisent
- En JS, il suffit globalement de comprendre les fonctions et la gestion de
null pour écrire du code fonctionnel
- Cela ne signifie pas simplement que Rust est plus difficile, mais montre que Rust est conçu pour exiger une compréhension structurelle de l’ensemble du langage
La conception étroitement couplée de Rust
- Le cœur de Rust réside dans la combinaison de fonctionnalités conçues de manière organique
- Les énumérations sont peu pratiques sans pattern matching, et le pattern matching est lui aussi limité sans énumérations
Result et Iterator sont impossibles à implémenter sans génériques
- Les concepts
Send/Sync et les contraintes de println ne peuvent être exprimés de manière sûre qu’avec les traits
- Le borrow checker garantit la sûreté
Send/Sync grâce à l’analyse des captures de closures
- Cette forte interconnexion fait de Rust non pas un simple assemblage de fonctionnalités, mais un système de langage intégré
La vision d’un Rust plus petit
- En 2019, without.boats a évoqué « Smaller Rust » pour discuter de la possibilité d’un Rust plus petit et plus épuré
- Aujourd’hui, Rust est devenu bien plus vaste, mais l’idée d’un Rust plus petit rappelle l’essence d’une conception de langage finement imbriquée
- L’attrait de Rust tient au fait que ses éléments de langage, à la fois indépendants et combinables, offrent ensemble une forte expressivité et une grande sécurité
Conclusion
- Rust est difficile à apprendre, mais la cohérence et l’intégration de ses concepts entrelacés constituent l’un de ses plus grands atouts
- Grâce à cette structure, Rust amène les développeurs non seulement à écrire du code, mais aussi à adopter une manière de penser qui prend simultanément en compte sécurité et performance
- L’essence de Rust réside dans un « petit langage central raffiné », et cette philosophie reste importante même dans le Rust élargi d’aujourd’hui
Aucun commentaire pour le moment.