Chez Oâclock, nous mettons un point dâhonneur Ă toujours ĂȘtre au courant de ce qui se fait de mieux dans la tech, mais surtout de ce qui sera lâavenir dans les mĂ©tiers de la tech. Nous pensons que Rust, entre autres, est lâun des futurs piliers de la programmation. Câest pour cela que nous avons lancĂ© notre toute premiĂšre formation Rust et qu’on vous partage notre tuto pour installer Rust sur Windows, MacOS ou Linux.
Mais câest quoi Rust ?
Rust est un langage de programmation dit de âbas niveauâ avec un typage fort. Comme lâindique Rust-lang.org, Rust est âun langage qui offre Ă tous le pouvoir de construire des logiciels fiables et efficacesâ.
Il est Ă©galement connu pour ĂȘtre un langage de programmation trĂšs productif, grĂące Ă  ses diffĂ©rents outils quâil met Ă  disposition pour ĂȘtre le plus efficace possible et ça, mĂȘme pendant son apprentissage.
Nous abordons ici, lâinstallation de Rust, mais Ă©galement de ces fameux outils satellites.
Table des matiĂšres
Rustup, une installation pour les unir tous
Rustup est tout simplement un logiciel qui vous permet non seulement dâinstaller Rust, mais Ă©galement de le maintenir Ă jour, dâailleurs, il est utile pour Rust, mais aussi pour dâautres outils. On en reparlera plus tard.
Que vous soyez sur Linux, MacOS ou Windows, vous serez tous logĂ© Ă la mĂȘme enseigne pour installer Rust et ses outils : Rustup ! Rendez-vous sur la page et vous trouverez la mĂ©thode pour lâinstaller.
Si vous ĂȘtes sur Linux ou MacOS, ce sera une ligne de commande dans votre terminal :
				
					$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 
				
			
		Si vous ĂȘtes sur Windows (quelle drĂŽle d’idĂ©e ;-)), vous trouverez un exĂ©cutable « .exe » qui fera la mĂȘme chose que cette ligne de commande – c’est-Ă -dire tĂ©lĂ©charger et installer Rustup, Rust et dâautres outils dont Cargo, ce dernier est un outil multi-fonctions, câest un gestionnaire de paquet, au travers de sa CLI, il lance le compilateur, les tests unitaires, la documentation locale, etc. Et il permet aussi de crĂ©er de nouveaux projets.
Et nous allons donc commencer par ça.
Â
Mon premier projet Rust
Je prĂ©cise ici, peu importe votre OS, Ă partir de maintenant, câest pareil pour tout le monde. Il est temps de sây mettre, dans votre terminal, vous allez donc Ă©crire ceci :
				
					$ cargo new first_project
 
				
			
		Cargo va crĂ©er votre projet dans un nouveau dossier âfirst_projectâ, dĂ©jĂ versionnĂ© en plus. Vous allez pouvoir entrer dedans et constater lâarchitecture.
				
					first_project/
|-- Cargo.toml
`-- src/
    |-- main.rs
 
				
			
		Expliquons chaque élément en détail :
- 
- first_project/ : ce rĂ©pertoire contient tous les fichiers et sous-rĂ©pertoires associĂ©s Ă  votre projet, qui s’appelle « first_project« .
- 
- Cargo.toml : ce fichier est le manifeste du projet. Il décrit les métadonnées du projet (nom, version, auteur) ainsi que ses dépendances. Le manifeste permet également à Cargo de construire, tester, et gérer les dépendances de votre projet Rust. Le manifeste permet également à Cargo de construire, tester, et gérer les dépendances de votre projet Rust, et est une base essentielle pour bien structurer un projet Rust.
 
 
- 
- src/ : ce répertoire contient le code source de votre application. Par convention, les fichiers source sont stockés dans ce répertoire.
- 
- main.rs : ce fichier est l’entrĂ©e principale de votre programme. Il doit contenir une fonction 
fn main(). Cette fonction sera exĂ©cutĂ©e lorsqu’on lancera votre application via la commandecargo run. 
 - main.rs : ce fichier est l’entrĂ©e principale de votre programme. Il doit contenir une fonction 
 
 - 
 
 - src/ : ce répertoire contient le code source de votre application. Par convention, les fichiers source sont stockés dans ce répertoire.
 
 - 
 
 - first_project/ : ce rĂ©pertoire contient tous les fichiers et sous-rĂ©pertoires associĂ©s Ă  votre projet, qui s’appelle « first_project« .
 
Ainsi, lorsque vous crĂ©ez un nouveau projet avec cargo new, il inclura ces trois composants principaux par dĂ©faut. Vous pouvez commencer Ă  Ă©crire du code Rust dans le fichier src/main.rs, puis utiliser des commandes comme cargo build ou cargo run pour compiler et exĂ©cuter votre application.
Jetons rapidement un Ćil dans le fichier main.rs :
				
					fn main() {
    println!("Hello, world!");
} 
				
			
		Dans cet exemple simple, la fonction main ne fait qu’afficher un message sur la sortie standard grĂące Ă  la macro println!. Lorsque vous exĂ©cuterez votre application, vous verrez apparaĂźtre le texte « Hello, world! » dans votre terminal.
Â
Build & Run
Nous allons tout de suite compiler notre projet. Dans le terminal, placez-vous dans le dossier âfirst_projectâ et lancez la commande cargo build. Voici Ă  quoi ressemble votre terminal Ă  lâissue de cette commande :
				
					Compiling first_project v0.1.0 (/home/andre/oclock/rust/first_project)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.11s 
				
			
		Aucun problĂšme constatĂ© sur notre projet, nous pouvons donc lancer notre nouveau programme Ă  lâaide de la commande cargo run. Et voir notre fameux âHello, world!â. 
				
					Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/first_project`
Hello, world! 
				
			
		VoilĂ , vous avez les bases de la crĂ©ation et l’exĂ©cution dâun nouveau projet en Rust.
Â
Pourquoi est-ce un compilateur âBienveillantâ ?
Avant de parler des outils, je voulais vous montrer pourquoi on dit que le compilateur de Rust est bienveillant. Jusquâici, vous nâavez vu quâun projet fonctionnel qui ne nĂ©cessite pas dâoptimisation.
Amusons-nous un peu en créant une faute dans notre script main.rs nous allons ajouter aprÚs le println!() ceci :
				
					let test = âtestâ
 
				
			
		On sauvegarde et on lance dans notre terminal cargo build : 								
				
					Compiling first_project v0.1.0 (/home/user/oclock/rust/first_project)
error: expected `;`, found `}`
 --> src/main.rs:7:22
  |
7 |     let test = "test"
  |                      ^ help: add `;` here
8 | }
  | - unexpected token
 
				
			
		Ici, on constate Ă  quel point lâerreur est trĂšs âverbeuseâ, tout est expliquĂ© clairement, non seulement le message dâerreur âclassiqueâ error: expected ;, found } avec la ligne, mais aussi un aperçu du code en lui-mĂȘme avec une phrase explicite.
Â
Si on corrige son erreur en ajoutant le point-virgule Ă  la fin de notre ligne et que lâon relance cargo build, voici ce quâil nous retourne :
				
					warning: unused variable: `test`
 --> src/main.rs:7:9
  |
7 |     let test = "test"
  |         ^^^^ help: if this is intentional, prefix it with an underscore: `_test`
  |
  = note: `#[warn(unused_variables)]` on by default
 
				
			
		Dans ce cas, ce nâest plus une erreur, mais bien un âwarningâ, il nous indique que la variable âtestâ nâest pas utilisĂ©, et que si câest intentionnel de notre part, il est de bon usage de prĂ©fixĂ© par un tiret bas â_â.
Nous pouvons donc suivre le conseil du compilateur et relancer un cargo build.
				
					Compiling first_project v0.1.0 (/home/andre/oclock/rust/first_project)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.10s
 
				
			
		Et on constate que tout fonctionne parfaitement. Vous pouvez voir Ă quel point ce compilateur est trĂšs bien structurĂ© pour vous permettre de tout de suite comprendre votre erreur et surtout d’Ă©crire du code dĂ©jĂ trĂšs propre.
Vous ĂȘtes maintenant prĂȘt Ă vous lancer dans Rust ! ThĂ©oriquement, rien ne vous empĂȘche de commencer tout de suite Ă apprendre les concepts de ce langage. Mais je vais vous parler dâune derniĂšre chose, que jâaurais aimĂ© connaĂźtre avant de dĂ©marrer et qui va vous faire gagner beaucoup de temps.
Pourquoi choisir Rust Analyzer quand on choisit d’installer Rust sur Windows, macOS ou Linux ?
Vous lâavez vu dans la prĂ©cĂ©dente section, le compilateur est trĂšs bienveillant, mais câest le passage entre le code et le terminal pour tester ce que lâon Ă©crit qui est un peu âlourdâ et je le comprends trĂšs bien.
Câest pour cela que nous allons installer âRust Analyzerâ, un outil qui va faire les mĂȘmes vĂ©rifications quâun cargo build, mais en direct dans votre IDE et aussi faire de lâauto-complĂ©tion, vous proposer des amĂ©liorations de code, etc.
Vous pouvez consulter une nouvelle fois rust-lang.org vous rendre sur la page afin de trouver comment installer Rust Analyzer sur votre IDE prĂ©fĂ©rĂ©. Dans notre cas, nous allons lâinstaller sur VSCode Ă lâaide dâune extension officielle.
Une fois installĂ© si on refait les mĂȘmes erreurs dans notre code :
				
					fn main() {
    println!("Hello, world!");
    let test = âtestâ
} 
				
			
		Voici Ă quoi va ressembler notre IDE :Â
On peut voir lâerreur soulignĂ©e en rouge et le warning en jaune. Et si on passe la souris dessus voici un exemple de ce qui apparaĂźt :
Et tout ceci apparaĂźt sur notre IDE dĂšs que lâon sauvegarde, donc beaucoup plus rapide.
Vous aurez peut-ĂȘtre constatĂ© autre chose, entre le nom de notre variable test et le signe Ă©gale il y a un : &str qui sâaffiche en gris, je nâai absolument rien ajoutĂ©, câest bien une suggestion de typage de la part de Rust Analyzer. Un simple double-clic permet de lâappliquer.
Voici donc à quoi ressemble notre ligne une fois que tout est corrigé.
Â
Cas pratique et dépendances
Amusons-nous un petit peu, avec un cas pratique et lâinstallation dâune dĂ©pendance. Vous allez vous rendre sur le site https://crates.io . Câest un site qui rĂ©pertorie toutes les dĂ©pendances de Rust. Nous allons installer rand ( https://crates.io/crates/rand ) Ă  lâaide de la commande cargo add rand.
Une fois installĂ©, rendez-vous dans votre fichier main.rs afin dâajouter du code, je ne rentre pas dans les dĂ©tails ici, mais en Ă©crivant le code nâhĂ©sitez pas Ă  sauvegarder votre code afin de voir les diffĂ©rents messages de Rust Analyzer.
				
					 use rand::prelude::*;
fn main() {
    let x = random();
    println!(âHello, world!â);
    println!(âRandom number : {x}â);
}
 
				
			
		Si vous avez recopié le code ci-dessus, vous allez voir apparaßtre une erreur sur let x.
Si vous cliquez sur la ligne âClick for full compiler diagnosticâ voici ce que vous affichera Rust Analyzer :
				
					error[E0283]: type annotations needed
   --> src/main.rs:4:9
    |
4   |     let x = random();
    |         ^   -------- type must be known at this point
    |
    = note: cannot satisfy `Standard: Distribution<_>`
note: required by a bound in `rand::random`
   --> /home/user/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rand-0.8.5/src/lib.rs:184:17
    |
183 | pub fn random() -> T
    |        ------ required by a bound in this function
184 | where Standard: Distribution {
    |                 ^^^^^^^^^^^^^^^ required by this bound in `random`
help: consider giving `x` an explicit type
    |
4   |     let x: /* Type */ = random();
    |          ++++++++++++   
				
			
		Une version plus complĂšte du message dâerreur avec mĂȘme un exemple de comment rĂ©soudre le problĂšme :Â
				
					help: consider giving `x` an explicit type
    |
4   |     let x: /* Type */ = random();
    |          ++++++++++++ 
				
			
		Le but ici nâest pas de « debug » cette erreur, donc simplement si on lit la documentation de rand on va trouver quel type est attendu et il suffit de corriger notre ligne comme ceci :
				
					let x: u8 = random();
 
				
			
		Et voilà, vous pouvez maintenant faire un cargo run pour voir le résultat : 								
				
					Compiling libc v0.2.155
   Compiling cfg-if v1.0.0
   Compiling ppv-lite86 v0.2.17
   Compiling getrandom v0.2.15
   Compiling rand_core v0.6.4
   Compiling rand_chacha v0.3.1
   Compiling rand v0.8.5
   Compiling first_project v0.1.0 (/home/andre/oclock/rust/first_project)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.83s
     Running `target/debug/first_project`
Hello, world!
Random number : -49
 
				
			
		On remarque que la nouvelle dĂ©pendance rand ainsi que ses propres dĂ©pendances sont compilĂ©es avec notre programme. Si vous relancez cargo run, il nâaura pas besoin de les recompiler vu quâelles sont dĂ©jĂ  compilĂ©es, et il vous affichera directement le rĂ©sultat : 								
				
					    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/first_project`
Hello, world!
Random number : -21 
				
			
		Et voilĂ !
Au-delĂ des premiers pas : optimisez votre parcours d’apprentissage Rust
Rust a cette mauvaise rĂ©putation dâĂȘtre difficile et long Ă apprendre, et mĂȘme si elle nâest pas vraiment juste (câest un long dĂ©bat), elle est sans doute impactĂ©e par un mauvais dĂ©part pour de nombreux dĂ©veloppeurs. Utiliser au mieux Cargo & Rust Analyzer nâest quâun premier pas vers des conditions optimales pour dĂ©couvrir et travailler sur Rust. Il reste encore plein de choses dont je nâai pas encore parlĂ© comme par exemple RustFMT ou Clippy. Mais ce sera pour un autre jour. Nâoubliez pas de jeter un Ćil Ă notre formation Rust.
				
															
								


