Aller au contenu

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
Google 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.