Rust est un langage de programmation système, compilé et multi-paradigme.
\begin{itemize}
\item Langage de programmation système : très peu de fonctionnalités sont implémentés dans les binaires résultants du langage. Par exemple, il n'y a pas de ramasse-miettes ou d'allocateur automatique.
\item Langage compilé : il est obligatoire de transformer le code Rust via un compilateur pour pouvoir l'exécuter.
\item Langage multi-paradigme : Le langage prend beaucoup de concepts des langages concurrents, orientés objets et fonctionnel.
\item Langage compilé : le code source n'est pas exécutable tel quel, il faut d'abord le
transformer avec un compilateur.
\item Langage de programmation système : très peu de fonctionnalités sont implémentés dans
les binaires résultants du langage.
en général il ne se passe rien qui n'ait été explicitement demandé dans le code source.
Par exemple, il n'y a pas de ramasse-miettes ou d'allocateur automatique.
\item Langage multi-paradigme : le langage prend beaucoup de concepts des langages
concurrents, orientés objets et fonctionnel.\\
Par exemple :
\begin{itemize}
\item tout comme dans les langages orientés objets, la plupart du code se fait
en définissant des structures de données et des méthodes qui opèrent dessus.
\item tout comme dans les langages fonctionnels, tout est une expression
(voir \Cref{expressionsEverywhere})
\end{itemize}
\end{itemize}
L'objectif du Rust est d'atteindre trois objectifs : rapidité, sécurité, et concurrent.
L'objectif du Rust est de ne sacrifier aucun des trois critères :
rapidité, sécurité, et concurrence.
Pour atteindre ces objectifs, la syntaxe de Rust est enrichie pour permettre au compilateur d'avoir l'ensemble des informations nécessaires.
Pour ce faire, la syntaxe de Rust est enrichie pour permettre au compilateur
d'avoir l'ensemble des informations nécessaires : il y aura souvent plus d'indications de types
à écrire qu'en OCaml et plus d'opérations à rendre explicite (conversions de type,
mutabilité, durées de vies) qu'en C/C++.
\section{Environnement et outils}
L'environnement de Rust se compose de beaucoup d'outils aidant le développement ainsi que le déploiement.
L'environnement de Rust se compose de beaucoup d'outils aidant le développement ainsi
que le déploiement.
\subsection{\texttt{rustc} : compilateur Rust}
Le compilateur Rust fonctionne principalement comme les autres compilateurs.
Cependant, il est rare de l'utiliser directement.
Cependant, il est rare de l'utiliser directement car \texttt{cargo} permet
souvent de s'affranchir d'invoquer explicitement \texttt{rustc}.
Voici un exemple de compilation d'un fichier nommé \texttt{source.rs} vers
un binaire exécutable nommé \texttt{bin} en activant les optimisations :
\texttt{rustc source.rs -o bin -O}
\subsection{\texttt{cargo} : outil de gestion de projet}
\texttt{cargo} est un outil de build, comme peut l'être \texttt{make}, mais comporte beaucoup plus de fonctionnalités :
\texttt{cargo} est un outil de build, comme peut l'être \texttt{make}, mais comporte
beaucoup plus de fonctionnalités :
\begin{itemize}
\item Téléchargement automatique des dépendances externes
\item Compilation pour le développement et pour la production
\item Création de la documentation
\item Lancement des tests
\item téléchargement automatique des dépendances externes
\item compilation pour le développement et pour la production
(le premier est plus rapide à compiler mais est moins rapide à l'exécution)
\item création de la documentation
\item lancement des tests
\item appel de commandes externes
\end{itemize}
\subsection{\texttt{clippy} : linter Rust}
Le linter permet d'optimiser le code en utilisant par exemple des fonctionnalités de Rust.
Le linter lit le code et recherche des patterns qui sont...
\begin{itemize}
\item ...souvent des indices d'un bug\\
(variable inutilisée, conversion de type inutile, code inaccessible, ...)
\item ...considérés comme de mauvaises pratiques\\
(trop de variables à une lettre, ...)
\item ...connus pour être moins performants qu'une alternative\\
(copies profondes inutiles, pointeurs inutiles, structures de données peu
efficaces en mémoire, ...)
\end{itemize}
On peut lancer un linter basique avec \texttt{cargo check}, et \texttt{cargo clippy} en
est la version plus poussée.
Il peut être inclus directement dans le compilateur.
On trouve à l'addresse \href{https://rust-lang.github.io/rust-clippy/master/index.html}{https://rust-lang.github.io/rust-clippy/master/index.html}
une liste exhaustive des vérifications de \texttt{clippy} (pas toutes activées par défaut),
avec des explications de pourquoi le pattern est dangereux ou considéré mauvais.
\subsection{\texttt{rls} : language Server Protocol}
\subsection{\texttt{rls} : Language Server Protocol}
L'ensemble des IDE migrent vers le protocole Open-Source de Microsoft : Lang Server Protocol.
L'ensemble des IDE migrent vers le protocole Open-Source de Microsoft : Language Server Protocol.
Ce protocole permet d'avoir les fonctionnalités principales d'un IDE (auto-complétion, saut vers les définitions...) par le biais d'un serveur propre au langage.
...
...
@@ -87,6 +127,8 @@ Ce protocole permet d'avoir les fonctionnalités principales d'un IDE (auto-comp
Formatage du code afin que tout le monde puisse lire, écrire, et maintenir aisément du code.
Il est la plupart du temps invoqué par \texttt{cargo fmt}.
\section{Apprendre le Rust}
...
...
@@ -97,6 +139,17 @@ Il existe plusieurs sources d'informations pour apprendre le Rust :
\item\href{https://doc.rust-lang.org/stable/rust-by-example/}{Rust by example} : apprendre par de nombreux exemples de cas d'utilisations
\end{itemize}
Quelques autres liens utiles :
\begin{itemize}
\item\href{https://play.rust-lang.org/}{Playground} : pour faire des tests rapides
dans le navigateur ou regarder l'assembleur généré
\item\href{https://this-week-in-rust.org/}{This Week in Rust} : newsletter officielle
\item\href{https://github.com/rust-lang/rust/}{github:rust} : le code source intégral de
\texttt{rustc} et de la librairie standard
\item\href{https://crates.io}{Crates} : le dépôt de paquets officiel depuis lequel sont
téléchargées les dépendances
\item\href{https://docs.rs/}{Docs} : la documentation officielle de tous les paquets
\end{itemize}
\section{Premiers programmes : découverte du Rust}