Histoire de Rust¶
Rust est ne en 2006 comme projet personnel de Graydon Hoare, ingénieur chez Mozilla, avant d'être adopte officiellement par Mozilla Research en 2009. Le langage a été conçu pour résoudre un problème fondamental des systèmes logiciels : garantir la sécurité mémoire sans recourir a un garbage collector, éliminer les data races par construction, et offrir des performances comparables au C et au C++.
Origines et motivations¶
En 2006, Graydon Hoare est frustre par un bug de corruption mémoire dans un ascenseur de son immeuble — le logiciel embarque, écrit en C, plante régulièrement. Il commence à concevoir un langage qui rendrait impossible ce type de bug par construction.
Mozilla Research s'interesse au projet en 2009 : le moteur de rendu Gecko, écrit en C++, souffre chroniquement de bugs de sécurité mémoire (use-after-free, buffer overflows, data races). Rust devient le vehicule pour construire Servo, un moteur de rendu experimental en parallèle de Gecko.
Les problèmes que Rust cherche à résoudre :
| Problème | Solution Rust |
|---|---|
| Use-after-free | Ownership : le compilateur suit la durée de vie |
| Double free | Move semantics : une seule source de vérité |
| Buffer overflow | Vérification des bornes à l'exécution |
| Data race | Le type système interdit les accès concurrents non sur |
| Null pointer dereference | Option<T> à la place des pointeurs nuls |
| Garbage collector pause | Aucun GC : la mémoire est libérée deterministe |
// Exemple fondamental : l'ownership empeche le use-after-free
// Ce code ne compile pas — le compilateur rejette le bug
fn main() {
let s1 = String::from("hello"); // s1 possede la chaine
let s2 = s1; // s1 est "deplace" dans s2 (move)
// println!("{}", s1); // ERREUR : s1 a ete moved, il n'existe plus
println!("{}", s2); // OK : s2 est le proprietaire
} // s2 est libere ici automatiquement (drop)
De Mozilla Research a Rust 1.0¶
Le développement de Rust est intense entre 2010 et 2015. Le langage change profondement plusieurs fois — le système de types est repense, le garbage collector experimental est retire en 2013 pour être remplacé entièrement par le système d'ownership.
Chronologie des étapes fondatrices :
| Année | Événement |
|---|---|
| 2006 | Graydon Hoare commence Rust comme projet personnel |
| 2009 | Mozilla Research adopte officiellement le projet |
| 2010 | Première annonce publique de Rust |
| 2011 | Le compilateur Rust compile lui-même (self-hosting) |
| 2012 | Première version alpha publique (0.1) |
| 2013 | Suppression du garbage collector experimental |
| 2015 | Rust 1.0 — première version stable, garantie de compatibilité |
| 2016 | Rust elu "langage le plus aime" sur Stack Overflow (première fois) |
| 2018 | Edition 2018 — async/await syntax, module system révisé |
| 2019 | async/await stable (1.39) |
| 2021 | Rust Foundation créée — Mozilla, Google, Microsoft, Amazon, Huawei |
| 2021 | Edition 2021 |
| 2022 | Linux kernel 6.1 : premier code Rust fusionne dans le noyau |
| 2024 | Edition 2024 — améliorations lifetime, async dans les traits |
// Rust 1.0 — un programme stable depuis 2015
// La garantie de compatibilite est analogue a celle de Go
fn saluer(nom: &str) -> String {
format!("Bonjour, {} !", nom)
}
fn main() {
let message = saluer("monde");
println!("{}", message);
}
Les editions Rust¶
Rust utilise un mécanisme d'editions pour introduire des changements incompatibles sans briser le code existant. Chaque crate déclaré son edition dans Cargo.toml. Le compilateur supporte toutes les editions simultanément et permet l'interopérabilité entre crates d'editions différentes.
| Edition | Changements principaux |
|---|---|
| 2015 | Edition initiale — base du langage stable |
| 2018 | async/await syntax, use paths simplifiés, module system révisé |
| 2021 | Prelude étendu (TryInto, TryFrom, FromIterator), closures plus permises |
| 2024 | Lifetimes dans async plus ergonomiques, gen blocks, unsafe extern |
# Cargo.toml — declaration de l'edition
[package]
name = "mon-projet"
version = "0.1.0"
edition = "2024" # Edition la plus recente
[dependencies]
tokio = { version = "1", features = ["full"] }
Migrer vers une nouvelle edition
La commande cargo fix --edition automatise la migration. Elle transforme le code source pour qu'il soit compatible avec l'edition suivante. La migration est incrementale et sans risque.
Versions majeures et jalons techniques¶
| Version | Date | Jalons techniques |
|---|---|---|
| 1.0 | Mai 2015 | Première version stable, ownership/borrowing finalise |
| 1.26 | Mai 2018 | impl Trait en position de retour |
| 1.31 | Dec 2018 | Edition 2018, const fn de base |
| 1.36 | Juil 2019 | Future stable, fondation pour async/await |
| 1.39 | Nov 2019 | async/await stable |
| 1.45 | Juil 2020 | proc_macro stabilises, casts numériques surs |
| 1.51 | Mars 2021 | const generics (min const generics) |
| 1.56 | Oct 2021 | Edition 2021 |
| 1.58 | Jan 2022 | Captured identifiers in format strings (let x = 5; println!("{x}")) |
| 1.65 | Nov 2022 | GATs (Generic Associated Types) stables |
| 1.70 | Juil 2023 | OnceLock, OnceCell dans la stdlib |
| 1.75 | Dec 2023 | async fn dans les traits (AFIT) stable |
| 1.80 | Juil 2024 | LazyCell, LazyLock stables |
| 1.82 | Oct 2024 | Raw références, &raw const/&raw mut |
| 1.85 | Fev 2025 | Edition 2024 stable |
Rust dans le noyau Linux¶
L'adoption de Rust dans le noyau Linux est un jalon historique. Linus Torvalds a accepte les premiers drivers Rust dans Linux 6.1 (decembre 2022). C'est la première fois en trente ans qu'un second langage est admis dans le noyau.
Les raisons de cet ajout :
- Les drivers C représentent la source principale de vulnérabilités noyau (CVE)
- Rust peut exprimer les invariants de bas niveau que le noyau exige
- L'ABI est compatible avec le C — l'intégration est progressive, module par module
// Structure typique d'un module noyau en Rust (simplifie)
// Necessite le crate kernel fourni par les sources Linux
use kernel::prelude::*;
module! {
type: MonModule,
name: "mon_module",
author: "Auteur",
description: "Module exemple en Rust",
license: "GPL",
}
struct MonModule;
impl kernel::Module for MonModule {
fn init(_module: &'static ThisModule) -> Result<Self> {
pr_info!("Module Rust charge\n");
Ok(MonModule)
}
}
impl Drop for MonModule {
fn drop(&mut self) {
pr_info!("Module Rust decharge\n");
}
}
Rust dans le noyau — statut en 2024
Le support Rust dans le noyau Linux est encore experimental pour la majorité des sous-systèmes. Les bindings kernel:: evoluent et ne garantissent pas encore la stabilité API. Les contributions Rust dans le noyau passent par le dépôt rust-for-linux.
Rust Foundation¶
La Rust Foundation est créée en fevrier 2021. Mozilla, qui avait porte le projet seul pendant dix ans, transfere la gouvernance a une fondation indépendante.
Membres fondateurs :
| Membre | Rôle dans l'écosystème Rust |
|---|---|
| Mozilla | Créateur historique, transfere les droits de marque |
| Utilisé Rust dans Android, ChromeOS, Fuchsia | |
| Microsoft | Rust dans Windows kernel, Azure, VS Code |
| Amazon | Rust dans AWS Firecracker, Lambda, s2n-tls |
| Huawei | Rust dans les systèmes embarqués et telecom |
La fondation finance le développement du compilateur, géré crates.io et organisé la RustConf annuelle.
Positionnement actuel¶
Rust occupe une niche unique : performance C/C++ avec garanties de sécurité mémoire. Son adoption s'etend au-delà des systèmes embarqués.
| Domaine | Usages et projets notables |
|---|---|
| Systèmes | Linux kernel, Windows kernel (drivers), Android (AOSP) |
| WebAssembly | Wasmtime, Wasmer, web apps via wasm-bindgen |
| CLI | ripgrep, fd, bat, exa, delta, cargo lui-même |
| Cloud / infra | Firecracker (AWS), Bottlerocket OS, Linkerd proxy (Linkerd2) |
| Cryptographie | rustls, ring, aws-lc-rs |
| Blockchain | Solana, Polkadot, Near Protocol |
| Navigateurs | Firefox (Stylo, WebRender), Servo |
| Bases de données | TiKV (TiDB), Neon (Postgres), SurrealDB |
Rust elu langage le plus aime 9 années consecutives
De 2016 a 2024, Rust est classe premier dans le sondage annuel Stack Overflow Developer Survey dans la catégorie "langage le plus aime / admire". Cette distinction reflate l'expérience developer : une fois la courbe d'apprentissage franchie, les développeurs aprecient les garanties que le compilateur offre.