Pourquoi programmer en Rust ?

Rust est un langage de programmation développé par Mozilla qui se concentre sur la sécurité et la concurrence. Il est développé conjointement par un des leaders du langage web, Brendan Eich (inventeur de JavaScript en 1995), Dave Herman, et Graydon Hoare de Mozilla.
Rust est un excellent langage pour la sécurité, la concurrence avec l'utilisation automatique des systèmes multicœurs et comporte des caractéristiques importantes, comme d'autres langages dynamiques, telles que :
gestion automatique de la mémoire,
suppression des pointeurs nuls,
sécurité du code, etc.
Rust est un logiciel libre et gratuit qui est mis à la disposition de tous et partagé publiquement afin que les utilisateurs puissent améliorer le langage et la conception du logiciel.
Et depuis 2020, il y a le projet Rust for Linux !
Naissance
Rust est un langage de programmation rapide, concurrent, sûr et puissant. Il a été créé et développé à l'origine par Graydon Hoare, développeur chez Mozilla, en 2006 dans un projet personnel.
Il s'agit désormais d'un langage open source qui est développé principalement par une équipe de Mozilla, avec la collaboration de nombreux acteurs de l'open source. La première version stable, 1.0, a été publiée en mai 2015. Le projet a débuté dans l'espoir d'atténuer les problèmes de sécurité de la mémoire qui sont apparus dans Gecko avec l'utilisation du langage C++. Gecko était le moteur de navigation utilisé dans le navigateur Firefox de Mozilla.
Le C++, tout comme le C, n'est pas un langage facile à apprivoiser et possède des abstractions de concurrence qui peuvent être facilement utilisées à mauvais escient. Et dans Gecko, avec C++, il y a eu quelques tentatives (en 2009 et 2011) pour paralléliser la partie du code qui analyse des feuilles de style en cascade (fichiers CSS) afin d'exploiter les processeurs parallèles modernes. Ces tentatives ont échoué, car le code C++ concurrent était trop compliqué pour être bien maîtrisé intellectuellement, et donc très difficile à maintenir.
De plus, avec le grand nombre de développeurs collaborant sur le code gigantesque de Gecko, écrire du code concurrent en C++ n'a pas été pas une partie de plaisir.
Dans l'espoir d'éliminer progressivement les aspects pénibles du C++, Rust a vu le jour et, avec lui, Servo, un nouveau projet de recherche visant à créer un moteur de navigateur à partir de zéro.
Le projet Servo a fourni un retour d'expérience à l'équipe de développement de Rust, en utilisant les fonctionnalités de pointe du langage qui, à leur tour, ont influencé l'évolution du langage.
Vers novembre 2017, des parties du projet Servo, en particulier le projet Stylo (un analyseur CSS parallèle en Rust), ont commencé à être greffées à la version de Firefox (Project Quantum), ce qu’on peut qualifier d’assez grand exploit en si peu de temps. L'objectif final de Servo étant de remplacer progressivement tous les composants de Gecko par ses propres composants.
Fondements
Rust s'inspire d'une multitude de langages, notamment :
Caml, car le compilateur Rust, rustc, a été écrit à l'origine en Ocaml, un langage fonctionnel,
Cyclone pour ses idées sur les techniques de gestion de la mémoire par région.
Ce langage est une variante sécurisée du langage C, créé par un groupe de chercheurs de la Cornell University et des laboratoires AT&T, qui corrige les défauts de gestion de mémoire du C,
C++ pour son principe RAII, qui signifie Resource Acquisition Is Initialization. Ce paradigme suggère que les ressources doivent être acquises pendant la phase d'initialisation d'un objet et doivent être libérées lors de l'appel de leur destructeur ou lorsqu'elles sont désallouées.
Haskell pour son système de typage, sa gestion des erreurs et ses classes de types.
Le langage a une rapidité d'exécution surprenante, n'a pas besoin de « garbage collector », et préfère par défaut l'allocation sur la pile (le stack) à l'allocation sur le tas (heap) pour n'importe quelle valeur déclarée dans un programme.
Le compilateur est devenu un compilateur auto-hébergé en 2011 après avoir été écrit en lui-même.
Remarque :
On parle d'auto-hébergement lorsqu'un compilateur est construit en compilant son propre code source. Ce processus est connu sous le nom de "bootstrapping" (démarrage) d'un compilateur. Compiler son propre code source c’est, en plus, un excellent test pour valider le compilateur.
Le puissant système de typage et le modèle d’ownership (propriété des objets) de Rust garantissent la sécurité mémoire ainsi que la sécurité des threads et nous permettent d'éliminer de nombreuses variétés de bugs dès la compilation.
Evolution
Rust est développé ouvertement sur GitHub à l'adresse https://github.com/rust-lang/rust et continue d'évoluer à un rythme rapide.
De nouvelles fonctionnalités sont ajoutées au langage par le biais d'un processus de demande de commentaires (RFC) piloté par la communauté, dans le cadre duquel tout le monde peut proposer de nouvelles fonctionnalités. Celles-ci sont ensuite décrites en détail dans un document RFC. Un consensus est alors recherché pour le RFC et, en cas d'accord, la phase de mise en œuvre de la fonctionnalité commence.
La fonctionnalité mise en œuvre est ensuite examinée par la communauté, où elle est finalement intégrée à la branche principale après avoir été testée par les utilisateurs dans le cadre de versions nocturnes. Le retour d'information de la communauté est crucial pour l'évolution du langage.
Toutes les six semaines, une nouvelle version stable du compilateur est publiée. En plus des mises à jour incrémentales rapides, Rust a également cette notion d'éditions, qui est proposée pour fournir une mise à jour consolidée du langage. Cela inclut l'outillage, la documentation, son écosystème, et l'introduction progressive de tous les changements de rupture.
Jusqu'à présent, il y a eu deux éditions : Rust 2015, qui mettait l'accent sur la stabilité, et Rust 2018, qui est l'édition actuelle au moment de l'écriture de cet article et qui met l'accent sur la productivité.
Utilisations
Bien qu'il s'agisse d'un langage multi-paradigmes à usage général,
il vise le domaine de la programmation système où C et C++ sont
prédominants.
Cela signifie que nous pouvons écrire des
systèmes d'exploitation, des moteurs de jeu et de nombreuses
applications critiques en termes de performances.
Parallèlement, il est suffisamment expressif pour nous permettre de créer des applications web à haute performance, des applications de sécurité, des services de réseau, des bibliothèques ORM (Object Relational Mapper) de bases de données sûres, et peut également fonctionner sur les systèmes d'exploitations des entreprises.
Rust peut aussi être utilisé pour des applications « front web » grâce à la compilation en WebAssembly.
Rust a également suscité un intérêt certain pour la création d'applications de type temps réel et pour la sécurité de plateformes embarquées telles que les microcontrôleurs ARM de la famille Cortex-M, un domaine principalement dominé par le C jusqu'à l'heure actuelle.
Le support, par un seul langage, d’une aussi large gamme d'applications dans divers domaines, est très rare.
De plus, des entreprises bien établies telles que Cloudflare, Dropbox, Chuckfish, npm, et bien d'autres encore l'utilisent déjà en production pour leurs projets à fort enjeu.
Rust for Linux
Les principaux mainteneurs du noyau Linux ont un âge qui dépasse le demi-siècle. Certains ont même dépassé la soixantaine. Aussi, la communauté du célèbre noyau libre commence à penser au changement de générations. Une nouvelle, dont la tranche d’âge se situe dans la trentaine, gravit les échelons, mais comme Linus lui-même le souligne : « Il s'avère qu'il est vraiment difficile de trouver des personnes qui sont des mainteneurs » ; un fait lié à ceci est que le développement du kernel Linux continue de se faire en C et assembleur, des langages auxquels la vieille génération est plus accoutumée.
Ajoutons à cela le volume important du code. Au 1er
janvier 2020, le noyau Linux rassemblait dans l’arbre source Git
plus de 27,8 millions de lignes (en incluant les fichiers Kconfig,
les docs, etc) réparties en 66 492 fichiers, il totalisait 887 925
commits avec plus de 21 000 auteurs. Il dépasse sans doute aujourd'hui les 30 millions de lignes de code.
Ceci explique
pourquoi en 2022 le langage Rust a fait son entrée au sein du noyau
Linux.
C'est ainsi qu'est né le projet Rust-for-Linux :
initié en 2020 par Miguel Ojeda, un ingénieur logiciel du CERN, il
a reçu le soutien de Linus Torvalds, le créateur du noyau Linux. Le
projet a été fusionné dans la branche principale de la version 6.1
du noyau, en tant qu’expérience visant à déterminer si Rust est
adapté pour le noyau, c’est-à-dire s’il vaut les compromis.
Le
projet fournit une infrastructure et des outils pour compiler,
charger et déboguer du code Rust dans le noyau, ainsi qu’une
bibliothèque standard minimale (core) et une bibliothèque
d’abstraction du noyau (kernel).
Rust a une propriété
clé qui le rend très intéressant à considérer comme un autre
langage du noyau : il garantit qu'aucun comportement indéfini n'a
lieu (tant que le code non sécurisé est sain). Cela inclut
l'absence d'erreurs de type :
use after-free : un Use-After-Free (UAF) est une vulnérabilité liée à une utilisation incorrecte de la mémoire dynamique lors du fonctionnement du programme. Si après avoir libéré un emplacement mémoire, un programme n'efface pas le pointeur vers cette mémoire, un attaquant peut utiliser l'erreur pour pirater le programme,
double free : ce sont des erreurs qui surviennent lorsque free() est utilisé plus d’une fois avec la même adresse mémoire comme entrée. Appeler free() deux fois sur la même variable peut entraîner une fuite de mémoire,
data race : une data race survient quand une donnée partagée est accédée par au moins deux threads dont au moins un en écriture et ce, sans synchronisation, etc.
Le projet Rust for Linux n’a pas pour objectif de réécrire le noyau entier en Rust, mais plutôt d’ajouter du nouveau code, écrit en Rust, qui s’interface proprement avec l’infrastructure existante du noyau.
Le projet vise également à encourager les développeurs à utiliser Rust pour les parties du noyau qui sont particulièrement sensibles ou complexes, telles que les pilotes de périphériques, les sous-systèmes de sécurité ou les protocoles réseau.
Rust pourrait ainsi apporter des bénéfices en termes de qualité, de performance et de sécurité du code du noyau, tout en réduisant les coûts de développement et de maintenance.