URL: https://linuxfr.org/news/rust-a-5-ans-retrospective Title: Rust a 5 ans, rĂ©trospective Authors: StyMaar Aldebaran, Ysabeau đ§¶, bubarđŠ„, Lawless, Anonyme, Cetera, Yves Bourguignon, Sylvestre Ledru, ariasuni, palm123, M5oul, olivierweb, BAud, abriotde, Xavier Teyssier, karchnu, Davy Defaud, esdeem, thomasv, Papey, ZeroHeure, thoasm, cpm, Bruno Michel, BenoĂźt Sibaud, Leirda et redfoxx7 Date: 2018ćčŽ08æ28æ„T09:57:00+02:00 License: CC By-SA Tags: rust, debian et firefox Score: 91 Rust est un langage de programmation dĂ©veloppĂ© principalement par Mozilla. La premiĂšre version stable, la [1.0](https://blog.rust-lang.org/2015/05/15/Rust-1.0.html), est sortie en 2015. La derniĂšre version disponible Ă ce jour est la [1.46.0](https://blog.rust-lang.org/2020/08/27/Rust-1.46.0.html), publiĂ©e le 27 aoĂ»t 2020. DĂ©pourvu de [ramasseâmiettes](https://fr.wikipedia.org/wiki/Ramasse-miettes_(informatique)), il permet une gestion fine de la mĂ©moire, de maniĂšre sĂ©curisĂ©e pour prĂ©venir les erreurs de segmentation. Il garantit aussi la sĂ©curitĂ© des fils dâexĂ©cution (_thread safety_). Ces caractĂ©ristiques en font un langage sĂ»r et performant. Ses bonnes performances, comparables Ă celles du C et du C++, le rendent particuliĂšrement adaptĂ© Ă la programmation systĂšme. Ainsi, il est utilisable dans un grand nombre de situations oĂč ces deux langages Ă©taient habituellement utilisĂ©s : noyau de systĂšme dâexploitation, services de systĂšmes, embarquĂ©, moteurs de jeu vidĂ©o 3D, etc. Cette dĂ©pĂȘche se propose de revenir sur son histoire, courte mais riche, et dâexaminer la situation prĂ©sente. ---- [Rust en 2018](https://blog.rust-lang.org/2018/07/27/what-is-rust-2018.html) [Liste et Ă©volution des contributeurs pour chaque version publiĂ©e](https://thanks.rust-lang.org) [Réécriture en Rust dâoutils courants en ligne de commande](https://zaiste.net/posts/shell-commands-rust/) ---- # Retours sur les Ă©volutions de Rust depuis sa sortie Rust a Ă©tĂ© largement couvert sur _LinuxFr.org_, Ă travers les versions [0.7](https://linuxfr.org/users/guiea_7/journaux/sortie-de-rust-0-7), [0.8](https://linuxfr.org/news/presentation-de-rust-0-8), [0.9](https://linuxfr.org/news/quelques-nouvelles-sur-rust-a-l-occasion-de-la-0-9), [0.10](https://linuxfr.org/news/rust-s-oxyde-en-version-0-10), [0.11](https://linuxfr.org/news/encore-une-couche-de-rouille-avec-rust-0-11), [0.12](https://linuxfr.org/news/rust-0-12-non-pas-le-jeu-video-le-langage), [1.0âalpha](https://linuxfr.org/news/le-langage-rust-en-version-1-0-alpha-on-arrete-de-tout-casser). Le 15 mai 2015, la premiĂšre version stable de Rust Ă©tait publiĂ©e [1.0](https://linuxfr.org/news/rust-1-0-entree-dans-la-periode-stable), les versions [1.1, 1.2 et 1.3](https://linuxfr.org/news/rust-versions-1-1-1-2-et-1-3), lâ[Ă©dition 2018](https://linuxfr.org/news/l-edition-2018-de-rust-est-sortie). LâannĂ©e 2020 marque les cinq ans du langage, et Ă cette occasion la fondation Mozilla a publiĂ© un [rĂ©capitulatif des principales amĂ©liorations (EN)](https://blog.rust-lang.org/2020/05/15/five-years-of-rust.html) portĂ©es au langage ! En cinq ans le langage a donc beaucoup Ă©voluĂ©, la version 2018 Ă©tant la derniĂšre traitĂ©e sur _LinuxFr.org_ une petite mise Ă jour sâimpose. En 2019 ------- 1.33 â **Le _Pinning_** : il est parfois utile dâavoir la garantie quâun objet ne bougera pas en mĂ©moire, comme un objet ayant un pointeur sur luiâmĂȘme qui serait invalidĂ© en cas de changement dâadresse. Le type `Pin` assure que les donnĂ©es pointĂ©es par nâimporte quel pointeur de type P ont une adresse stable, la donnĂ©e ne peut pas bouger ou ĂȘtre dĂ©sallouĂ©e jusquâĂ ce quâon enlĂšve le _Pin_. La donnĂ©e est dite « _pinned_ ». 1.34 â **Des dĂ©pĂŽts de Crates alternatifs pour Cargo** : le Rust est de plus en plus utilisĂ© en production, il y a un besoin grandissant de dĂ©pĂŽts privĂ©s. Cargo a toujours permis des dĂ©pendances via Git mais avec les [_Alternative Registries_ (EN)](https://boats.gitlab.io/blog/post/2017-10-28-alternative-registries/) une organisation peut facilement crĂ©er et partager son propre dĂ©pĂŽt de _crates_, dâune façon similaire Ă [_crates.io_ (EN)](https://crates.io/). 1.39 â **_Async/Await_, le futur est lĂ ** : la stabilisation des mots clefs `async` et `await` Ă©tait une des tĂąches majeures pour faire de Rust un langage de premier ordre. Tout juste six mois aprĂšs sa libĂ©ration, la programmation asynchrone se dĂ©veloppe en un Ă©cosystĂšme diversifiĂ© et performant. Notamment avec [Tokio (EN)](https://github.com/tokio-rs/tokio) ! Pour utiliser _async-await_, il faut commencer par ajouter `async` devant une fonction : ```rust async fn first_function() -> u32 { .. } ``` Ă la diffĂ©rence dâune fonction ordinaire, un appel Ă une `async fn` retourne un _Future_. Câest une opĂ©ration en suspend qui attend quâon lui dise de sâexĂ©cuter. Pour exĂ©cuter un _future_ on utilisera lâopĂ©rateur `.await` : ```rust async fn another_function() { // Create the future: let future = first_function(); // Await the future, which will execute it (and suspend // this function if we encounter a need to wait for I/O): let result: u32 = future.await; ... } ``` Dans cet exemple, on utilise `future.await` en lieu et place de `await future` dans la plupart des langages, cela permet une meilleure intĂ©gration avec le mot clef « `?` » pour la gestion dâerreur. Vous pouvez simplement Ă©crire `future.await ?`. Contrairement Ă dâautres langages lâimplĂ©mentation des _futures_ en Rust est dite sans coĂ»t, en effet les _futures_ de Rust ne font rien Ă moins dâĂȘtre interrogĂ©s. Dans dâautres langages, appeler une fonction asynchrone lance un futur qui commence Ă sâexĂ©cuter immĂ©diatement. Pour plus de [dĂ©tails (EN)](https://aturon.github.io/blog/2016/08/11/futures/) ! En 2020 ------- 1.42 â **_Subslice patterns_** : ce nâest pas le plus grand changement du langage mais câĂ©tait une fonctionnalitĂ© depuis longtemps attendue qui va amĂ©liorer le confort des dĂ©veloppeurs et lâexpressivitĂ© de la recherche de motifs (_pattern matching_). Lâintroduction du « _rest pattern_ » permet de vĂ©rifier la correspondance avec le reste dâun _slice_ grĂące au mot clef `..` , comme dans cet exemple : ```rust fn foo(words: &[&str]) { match words { // Ignore everything but the last element, which must be "!". [.., "!"] => println!("!!!"), // `start` is a slice of everything except the last element, which must be "z". [start @ .., "z"] => println!("starts with: {:?}", start), // `end` is a slice of everything but the first element, which must be "a". ["a", end @ ..] => println!("ends with: {:?}", end), rest => println!("{:?}", rest), } } ``` Cette liste nâest, bien entendu, pas du tout exhaustive, le langage sâest continuellement amĂ©liorĂ© sur le plan de la stabilitĂ©, des performances et des fonctionnalitĂ©s. Le compilateur est plus performant et un peu moins pointilleux, de nouvelles macros sont apparues, pour faciliter le dĂ©bogage par exemple et tout un tas de petites fonctionnalitĂ©s sâadditionnent pour hisser le langage Ă un autre niveau. Le blog officiel en expose le [dĂ©tail (EN)](https://blog.rust-lang.org/) ! Une autre grande annonce de 2020 est la crĂ©ation dâune fondation pour le langage. Créé et poussĂ© par la Fondation Mozilla depuis ses dĂ©buts, le langage sâoffre une fondation en propre, la [_Rust Fondation_ (EN)](https://blog.rust-lang.org/2020/08/18/laying-the-foundation-for-rusts-future.html). AuâdelĂ des difficultĂ©s rencontrĂ©es rĂ©cemment par Mozilla câest avant tout une maniĂšre de rendre le projet plus autonome et indĂ©pendant des dĂ©cisions dâun seul groupe. # Des chiffres ! En 2018, le dĂ©pĂŽt [Rust (EN)](https://github.com/rust-lang/rust) sur GitHub compte plus de 87 000 _commits_ et plus de 2 200 contributrices et contributeurs. Au niveau des statistiques spĂ©cifiques Ă GitHub, le projet est suivi par plus de 5 400 personnes et a Ă©tĂ© marquĂ© dâune Ă©toile par plus de 32 000 personnes. Il y a [plus de 28 000 dĂ©pĂŽts sur GitHub (EN)](https://github.com/search?utf8=%E2%9C%93&q=language%3ARust+language%3ARust&type=Repositories&ref=advsearch&l=Rust) utilisant le langage Rust. Pour comparaison : * 1 428 dĂ©pĂŽts lors de la sortie de la version 0.10 ; * 3 262 dĂ©pĂŽts lors de la sortie de la version 0.12 ; * 4 892 dĂ©pĂŽts lors de la sortie de la version 1.0âalpha ; * 7 000 dĂ©pĂŽts lors de la sortie de la version 1.0. Toujours en 2018, Open Hub compte 650 projets en Rust, plus de 7 300 contributrices et contributeurs, prĂšs de 350 000 _commits_ et plus de 11 300 000 lignes de code. Pour comparaison : * 121 projets lors de la sortie de la version 0.10 ; * 165 projets et 1 007 386 lignes de code lors de la sortie de la version 0.12 ; * 200 projets et 1 200 000 lignes de code lors de la sortie de la version 1.0. Ces chiffres montrent que depuis mai 2015 lâintĂ©rĂȘt pour Rust a fortement crĂ». En 2020, le dĂ©pĂŽt [Rust (EN)](https://github.com/rust-lang/rust) sur GitHub compte plus de 125 000 _commits_. # Ă qui sâadresse Rust ? Rust sâadresse aussi bien aux dĂ©veloppeurs C et C++, quâaux dĂ©veloppeurs de langages de plus haut niveau qui souhaiteraient sâinitier Ă la programmation systĂšme sans avoir Ă affronter les galĂšres de gestion de la mĂ©moire ou de gestion de dĂ©pendances. Il a trois avantages majeurs par rapport au C et au C++ : - il empĂȘche les problĂšmes dâaccĂšs concurrents Ă la mĂ©moire, le code est alors facile Ă parallĂ©liser, mĂȘme dans des bases de code trĂšs volumineuses ; - grĂące Ă son systĂšme de type Ă©voluĂ©, il Ă©vite la plupart des bogues liĂ©s Ă la gestion de la mĂ©moire que lâon retrouve dans un grand nombre de [CVE](https://fr.wikipedia.org/wiki/Common_Vulnerabilities_and_Exposures "Common Vulnerabilities and Exposures â informations publiques relatives aux vulnĂ©rabilitĂ©s de sĂ©curitĂ©") de systĂšmes critiques : _useâafterâfree_ (utilisation de [la mĂ©moire] aprĂšs [sa] libĂ©ration), _double free_ (double libĂ©ration), _iterator invalidation_ (invalidation dâitĂ©rateur [lors du parcours dâun tableau]) ou encore un dĂ©bordement de tampon (_buffer overflow_). Cette vĂ©rification sâeffectue essentiellement Ă la compilation, mais certaines vĂ©rifications additionnelles sont Ă©galement effectuĂ©es Ă lâexĂ©cution (_boundâchecking_ (contrĂŽle des bornes) sur les tableaux) ; - il dispose de fonctionnalitĂ©s modernes dont ne disposent pas des langages plus anciens : une gestion simple et intuitive des dĂ©pendances (via lâoutil `cargo`) et des fonctionnalitĂ©s issues de la programmation fonctionnelle (_patternâmatching_, `map()`, `filter()`, `reduce()`, etc.), entre autres. De plus, puisquâil ne nĂ©cessite pas dâenvironnement dâexĂ©cution, il est facile Ă interfacer avec des projets Ă©crits dans dâautres langages comme [Python (EN)](https://developers.redhat.com/blog/2017/11/16/speed-python-using-rust/) ou Go, dans le but de bĂ©nĂ©ficier du maximum de performances sur une partie critique du code. Par exemple avec [cette bibliothĂšque (EN)](https://github.com/BurntSushi/rure-go) qui utilise le moteur dâexpressions rationnelles de Rust depuis Go, amĂ©liorant significativement les performances par rapport Ă la version de la bibliothĂšque standard Go. Il existe dâailleurs des bibliothĂšques qui permettent de faire facilement le lien entre le Rust et dâautres langages : [Ruru (EN)](https://github.com/d-unseductable/ruru) ou [Helix (EN)](https://usehelix.com/) pour le langage Ruby ; [Neon (EN)](https://github.com/neon-bindings/neon) pour Ă©crire des modules natifs rapides et sĂ»rs pour Node.js, la plateâforme Ă©vĂ©nementielle en JavaScript cĂŽtĂ© serveur ; [PyO3 (EN)](https://github.com/PyO3/PyO3) et [milksnake (EN)](https://github.com/getsentry/milksnake) pour le langage Python ; [Bindgen (EN)](https://github.com/rust-lang-nursery/rust-bindgen) pour les langages C et C++. # Adoption de Rust Rust a mis toutes les chances de son cĂŽtĂ©, mais ses chances Ă©taient bien minces de percer tant le problĂšme est ardu. LâintĂ©rĂȘt des informaticiens pour un langage de haut niveau performant et « sĂ»r » est rĂ©el mais, pour les convaincre, il faut arriver Ă avoir un gain suffisant de performances par rapport Ă Python et un gain significatif dans la facilitĂ© de programmation par rapport au C++ sans ĂȘtre trop diffĂ©rent afin dâĂȘtre adoptĂ© facilement. La sortie de Firefox 56 avec lâintĂ©gration de code Rust a propulsĂ© lâintĂ©rĂȘt du langage. Les performances du navigateur ont prouvĂ© ses capacitĂ©s. On sait maintenant quâil est possible de coder en autre chose quâen C/C++ avec des performances similaires pour le programme final. En juin 2020, [12 % de Firefox (EN)](https://twitter.com/eroc/status/1287804986231894016) Ă©taient codĂ©s en Rust. De la mĂȘme maniĂšre Discord [bascule de Go Ă Rust](https://blog.discord.com/why-discord-is-switching-from-go-to-rust-a190bbca2b1f) pour son Ă©cosystĂšme de bibliothĂšques, notamment en matiĂšre dâasynchronisme avec [Tokio (EN)](https://github.com/tokio-rs/tokio), sa gestion mĂ©moire et ses performances globales. En plus de ces avantages techniques purs, comme un gestionnaire de paquet et de construction quasiment magique : [Cargo (EN)](https://doc.rust-lang.org/stable/cargo/), le langage peut Ă©galement compter sur un Ă©cosystĂšme de bibliothĂšques foisonnant (_crates_ de leur petit nom, publiĂ©es sur [_crates.io_ (EN)](https://crates.io/)) et qui est, de plus, de trĂšs bonne qualitĂ©. De nombreuses distributions GNU/Linux ont empaquetĂ© le compilateur Rust et Cargo, ainsi que diffĂ©rentes applications dĂ©veloppĂ©es en utilisant Rust. Par exemple, Debian propose depuis sa derniĂšre version stable (_Buster_), [ripgrep (EN)](https://github.com/BurntSushi/ripgrep), [exa (EN)](https://github.com/ogham/exa) ou encore [fd (EN)](https://github.com/sharkdp/fd). Certains projets comme [Actix (EN)](https://actix.rs/) ou [Alacritty (EN)](https://github.com/alacritty/alacritty) dĂ©montrent les performances du langage, lâun en se hissant en haut du [_Web Framework Benchmarks_ (EN)](https://www.techempower.com/benchmarks/#section=data-r18&hw=ph&test=fortune) de TechEmpower, passant mĂȘme devant des cadriciels en C ou C++, tout en proposant des fonctionnalitĂ©s de trĂšs haut niveau comme les _closures_, de lâasynchronisme ou du _pattern matching_ ! Dâautres projets comme [Bevy (EN)](https://github.com/bevyengine/bevy), un moteur de jeu 2D/3D multiâplateâforme sur le modĂšle EntitĂ©âComposantâSystĂšme) bien que trĂšs jeunes se constituent rapidement une belle [communautĂ© (EN)](https://bevyengine.org/news/scaling-bevy/), signe quâil y a une appĂ©tence des dĂ©veloppeurs pour le langage. Le langage creuse aussi son trou dans dâautres projets oĂč on lâattend moins, comme [npm (EN)](https://www.npmjs.com/), qui lâutilise en plus du JavaScript, ou bien [Deno (EN)](https://deno.land/), un possible successeur de [Node.js (EN)](https://nodejs.org/en/). Par ailleurs, [il a Ă©tĂ© question dâintĂ©grer du Rust dans le noyau Linux](https://lkml.org/lkml/2020/7/9/952). LâidĂ©e pourrait attirer de [nouveaux dĂ©veloppeurs qui ne veulent pas forcĂ©ment faire du C (EN)](https://www.theregister.com/2020/06/30/hard_to_find_linux_maintainers_says_torvalds/). En conclusion ============= Que dire ? Le Rust est Ă©lĂ©gant, bien construit, dispose de fonctionnalitĂ©s de haut niveau tout en restant trĂšs performant et mĂȘme sâil a encore quelques lacunes, par exemple en ce qui concerne les interfaces graphiques (avec cependant de [bons candidats (EN)](https://www.areweguiyet.com/)), il nâen demeure pas moins trĂšs stable et tout Ă fait utilisable. RĂ©cemment, les dĂ©veloppeurs derriĂšre Chromium et Chrome ont publiĂ© un [billet (EN)](https://www.chromium.org/Home/chromium-security/memory-safety/rust-and-c-interoperability) concernant la possible utilisation de Rust au sein de leur base de code, soulignant les gains ainsi que les dĂ©fis que cela reprĂ©sente dans le cas trĂšs pointu et particulier qui est le leur. Pour avoir une petite idĂ©e de ce Ă quoi ressemble lâĂ©cosystĂšme de Rust, vous pouvez consulter cette [liste (EN)](https://github.com/rust-unofficial/awesome-rust) qui recense des applications, bibliothĂšques, outils et ressources jugĂ©es impressionnantes. Le langage est encore jeune, mais il promet, et le plus simple pour vous faire un avis câest de lâessayer ! Allez sur le [site officiel (EN)](https://www.rust-lang.org/learn) du projet qui a une trĂšs bonne documentation, des cours et un « [Book](https://doc.rust-lang.org/book/) » (EN) trĂšs agrĂ©able Ă lire. Si vous prĂ©fĂ©rez avoir du papier entre les mains, on trouve de bons bouquins ; par exemple, en anglais, chez lâĂ©diteur OâReilly : _[Programming Rust, 2^(nd) Edition](https://www.oreilly.com/library/view/programming-rust-2nd/9781492052586/)_ et _[The Rust Programming Language (Covers Rust 2018)](https://www.oreilly.com/library/view/the-rust-programming/9781098122539/)_, ou chez Eyrolles, en français, _[Programmer avec Rust](https://www.eyrolles.com/Informatique/Livre/programmer-avec-rust-9782412046593/)_. Vous pouvez mĂȘme directement lâessayer en ligne si [ça vous dit (EN)](https://play.rust-lang.org/) !