Commencer à programmer avec Rust

Utiliser Rust quand on n'a jamais codé

a marqué ce sujet comme résolu.

Tout le monde se secoue ! :D

J’ai commencé (jeudi 19 décembre 2019 à 13h00) la rédaction d’un tutoriel au doux nom de « Commencer à programmer avec Rust » et j’ai pour objectif de proposer en validation un texte aux petits oignons. Je fais donc appel à votre bonté sans limites pour dénicher le moindre pépin, que ce soit à propos du fond ou de la forme. Vous pourrez consulter la bêta à votre guise à l’adresse suivante :

Merci !

Salut,

D’abord, merci pour ton initiative ! C’est vraiment chouette de faire connaître ce super langage qu’est Rust sur Zds.

J’ai une simple remarque générale, outre le fait qu’il manque une intro digne de ce nom pour le moment : à faire comme tu fais, je crains qué tu ne finisses par tomber dans le catalogue tout en oubliant totalement de présenter ce qui fait Rust. Un exemple : ça sert en soit à rien de dire qu’un commentaire se fait avec tel code. Surtout que les commentaires sont des features de Rust en soi, qui permettent notamment de générer de la doc et des tests (et ce n’est pas pour rien que c’est entre autres fait ainsi).

J’espère que tu vas nous parler de Rustup, cargo et Clippy, tu ne peux pas passer à côté de ça !

Bonjour remotees, Merci pour ton retour. En effet, je n’ai pas fait l’intro, elle sera faites bientôt. J’essayerai de faire quelque chose qui ressemble moins à un listing des fonctionnalités, pour l’instant sur j’ai voulu poser les bases. Actuellement, il est prévu que d’autres contributeurs fasent un partie sur :

  • L’installation des logiciels pour pouvoir développer avec Rust
  • Comprendre le compilateur

Actuellement, ce tuto est fait dans le cadre d’un projet de master d’informatique, mais on est assez libre sur le plan. Je suis resté sur un plan assez classique mais on parlera des outils dispo, c’est promis.

N’hésite pas à nous dire ce que tu voudrais qu’on parle.

Bonsoir eragon12,

Déjà, de rien si ça a pu t’aider. :) Je trouve que tu as un bon échantillon des spécificités et des points propres à Rust sur le manuel de référence : The Rust Reference. Si je devais citer pêle-mêle des points importants à évoquer selon moi, il y aurait :

  • Le borrow-checker (quelle est sa raison d’être, en détaillant les questions d’accès mémoire concurrents qu’il règle entre autres) + les lifetime.
  • Crates/libs.
  • Les tests/rustdoc.
  • Les macros/derive/génération de code/code "inliné".
  • Les structs/implémentation de structs/traits (et un point sur le fait qu’il n’existe pas de POO en Rust, et expliquer la philosophie de Rust par rapport à ça).
  • La gestion de la mémoire avec les box, etc…
  • Écrire du code unsafe.
  • Les itérateurs, la programmation parallèle (cf la très bonne librairie rayon).
  • Ouverture sur l’utilisation de Rust dans le web (pour ensuite générer du wasm), Rocket, et plein d’autres projets autour de Rust pour faire des projets dans plein de domaines différents.

Ce sont des points à ne pas louper selon moi, mais c’est loin d’être exhaustif. Bon courage ! :)

+1 -0

Je vais poser une question à la fois troll et à la fois pertinente : le borrow-checker apporte une réelle qualité en terme de gestion de la mémoire, mais est-ce que son côté borrow-check-nazi n’apporte pas aussi des unsafe obligé dans certaines parties du code alors même qu’on aimerait pouvoir les écrire sans le mot clé unsafe ? (J’avais entendu parler de potes qui codaient en Rust et qui avaient besoin d’unsafe pour manipuler des strings et le prof leur disait qu’il n’y avait pas d’autres moyens)

Je sais pas si je suis clair ? :s

Honnêtement, je ne sais plus (c’était il y a deux ans). Si ça ne vous vient pas à l’esprit, c’est que ça doit pas être quelque chose de très embêtant. C’était surtout une conversation très animée que j’ai écouté d’une oreille. Désolé, j’ai un peu pollué ce fil :-)

Je dois avouer être assez étonné. Les rares cas d’usage d’unsafe sont pour l’utilisation de FFI (foreign function interface), donc quand t’appelles du code venant d’une lib C généralement, ou bien quand tu fais du bas niveau (SIMD par exemple). Pour ce qui est des strings, je ne vois pas du tout pourquoi t’aurais besoin de unsafe et en quoi ça pourrait t’aider…

+0 -0

Il y a pas mal d’erreurs d’orthographe et surtout des trucs loin d’être exact…

C’est un langage d’assez bas niveau

Pas vraiment non. Il permet de faire des opérations bas niveau mais il n’est pas bas niveau.

Le point virgule à la fin de la ligne est TRÈS important, il faut le mettre à chaque fin d’opérations Par exemple

C’est très incomplet comme déclaration. Le point virgule n’est là que pour signifier la fin d’une expression. Il est très courant d’avoir des fonctions entières sans un seul point-virgule.

Maintenant que tu peux afficher du texte, allons plus loin et faisons des maths.

Pas compris.

Il vaut mieux éviter de mettre des caractères spéciaux dans le nom des variables

Pourquoi ? Ça marche très bien pourtant…

Néanmoins, les variables crées ne sont pas modifiable si on n’utilise pas le mot clé "let" lorsque l’on définit la variable.

Je suppose que tu voulais parler de "mut" ?

Avec Rust, il n’y a pas besoin d’indiquer le type de la variables, c’est un langage dit non typé.

Ok, clairement tu ne connais pas Rust, inutile d’aller plus loin. Rust est un langage fortement typé. Tu confonds avec l’inférence de type. Apprends peut-être mieux le langage avant d’écrire un tuto dessus, des énormités dans ce genre c’est vraiment grave.

Sinon, le tuto est très brouillon. Il n’y a pas de fil directeur. Tu balances les infos un peu n’importe comment (et des infos fausses qui plus est…). Ce tuto n’aurait jamais dû rentrer en bêta étant donné son état actuel…

+0 -0

Euh, pour l’histoire des types j’ai plus l’impression que c’est la définition de "non-typé", "typé dynamiquement", "inférence de types" qui pose problème.

Et … euh, si, le Rust c’est bas-niveau. C’est peut être un chouïa plus haut niveau que le C++, mais c’est bas-niveau. Ce qui me fait dire ça c’est notamment le besoin d’un borrow checker : on peut difficilement être haut niveau si on laisse l’utilisateur gérer en partie l’usage mémoire.

Euh, pour l’histoire des types j’ai plus l’impression que c’est la définition de "non-typé", "typé dynamiquement", "inférence de types" qui pose problème.

Non. "typé dynamiquement" et "non-typé" peuvent être assimilé à la même chose. Mais ça n’a rien à voir avec l’"inférence de type". Rust est un langage fortement typé. Rien que caster entre 2 types est "compliqué". Dire l’inverse prouve un manque cruel de connaissance dans le langage et peut-être même dans la programmation de manière générale.

Et … euh, si, le Rust c’est bas-niveau. C’est peut être un chouïa plus haut niveau que le C++, mais c’est bas-niveau. Ce qui me fait dire ça c’est notamment le besoin d’un borrow checker : on peut difficilement être haut niveau si on laisse l’utilisateur gérer en partie l’usage mémoire.

Non, ça ne l’est pas (tout du moins pas à proprement parler). La gestion de la mémoire est "cachée". On peut descendre vraiment bas dans les étages mais il n’y a pas d’allocations à la main ni de pointeurs tant qu’on interagit pas avec une lib non rust. La seule différence avec du JS ou du Java à ce niveau là est que ça ne run pas dans une VM. Et le borrow checker n’a rien à voir avec la gestion mémoire (ce qui explique son nom d’ailleurs) : il vérfie les "emprunts", aka les ownerships/propriétés.

+0 -0

Non. "typé dynamiquement" et "non-typé" peuvent être assimilé à la même chose. Mais ça n’a rien à voir avec l’"inférence de type". Rust est un langage fortement typé. Rien que caster entre 2 types est "compliqué". Dire l’inverse prouve un manque cruel de connaissance dans le langage et peut-être même dans la programmation de manière générale.

imperio

Il est en effet faux de dire que Rust est non-typé puisqu’il s’agit d’un langage fortement typé, statiquement et par inférence.

Pour autant « typé dynamiquement » et « non-typé » ne sont pas similaires. Un typage dynamique peut être fort, c’est simplement que la vérification des types se fera au runtime.

Tout comme un typage statique n’est pas équivalent à un typage fort.

Et le borrow checker n’a rien à voir avec la gestion mémoire (ce qui explique son nom d’ailleurs) : il vérfie les "emprunts", aka les ownerships/propriétés.

imperio

Et pour toi ça n’est pas une caractéristique qui fait de lui un langage plutôt bas-niveau ? Le fait qu’il permette des blocs unsafe et une manipulation directe de la mémoire non plus ?

C’est là qu’on se heurte aux définitions et au fait qu’on essaye de projeter les langages sur un unique axe bas-niveau / haut-niveau au sens assez flou.

Rust apporte beaucoup d’abstractions, de constructions et de facilités, mais il reste assez proche de la machine.

Il est en effet faux de dire que Rust est non-typé puisqu’il s’agit d’un langage fortement typé, statiquement et par inférence.

Pour autant « typé dynamiquement » et « non-typé » ne sont pas similaires. Un typage dynamique peut être fort, c’est simplement que la vérification des types se fera au runtime.

Tout comme un typage statique n’est pas équivalent à un typage fort.

Absolument ! Je ne voulais pas spécialement rentré dans les explications mais tu l’as fort bien fait, je pense que je repiquerai ton explication de temps à autres. :)

Et pour toi ça n’est pas une caractéristique qui fait de lui un langage plutôt bas-niveau ? Le fait qu’il permette des blocs unsafe et une manipulation directe de la mémoire non plus ?

Pas vraiment non. C’est justement parce qu’il force les blocs unsafe pour faire ces opérations que je ne le considère pas comme un langage bas-niveau. Il est important de noter que je ne le considère pas comme un langage haut-niveau non plus cela dit. :p

Je considère comme langage bas-niveau tout langage forçant la gestion de la mémoire manuellement (allocations et libération de la mémoire manuellement, new/delete, malloc/free, etc…). Cependant c’est une définition très personnelle donc à part si il y a une définition officielle, c’est plus du pinaillage de ma part qu’autre chose…

Rust apporte beaucoup d’abstractions, de constructions et de facilités, mais il reste assez proche de la machine.

Justement, je ne suis pas tout à fait d’accord sur ce point. Par "défaut", il n’est pas proche de la machine justement. Ce sont justement ces abstractions qui font qu’il n’est pas un langage bas-niveau. Cependant, ça reste plus une opinion personnelle qu’une vérité absolue…

+0 -0

Merci pour vos réponse, je suis désolé pour mon retard, entre les projets, et TP, les oraux et se confinements, j’ai du me concentrer sur d’autres choses.

Il y a pas mal d’erreurs d’orthographe et surtout des trucs loin d’être exact…

C’est un langage d’assez bas niveau

Pas vraiment non. Il permet de faire des opérations bas niveau mais il n’est pas bas niveau.

Alors pour cette partie, ce n’est pas moi qui l’ai écrit, je le transmettrais à son auteur. J’ai tout écris sauf l’intro et la partie sur l’installation.

Le point virgule à la fin de la ligne est TRÈS important, il faut le mettre à chaque fin d’opérations Par exemple

C’est très incomplet comme déclaration. Le point virgule n’est là que pour signifier la fin d’une expression. Il est très courant d’avoir des fonctions entières sans un seul point-virgule.

En effet, je vais le reformuler.

Maintenant que tu peux afficher du texte, allons plus loin et faisons des maths.

Pas compris.

C’est juste qu’on passe de simplement afficher du texte à utiliser les variables.

Il vaut mieux éviter de mettre des caractères spéciaux dans le nom des variables

Pourquoi ? Ça marche très bien pourtant…

Je dirai qu’il faut éviter parce que certains langage pose des problèmes avec les caractères spéciaux donc je préfère partir du principe que je n’ai pas besoin. J’évite simplement pour ma part. Après je vais quand même reformuler pour être plus clair sur ce point.

Néanmoins, les variables crées ne sont pas modifiable si on n’utilise pas le mot clé "let" lorsque l’on définit la variable.

Je suppose que tu voulais parler de "mut" ?

Oui, je corrige ça, merci

Avec Rust, il n’y a pas besoin d’indiquer le type de la variables, c’est un langage dit non typé.

Ok, clairement tu ne connais pas Rust, inutile d’aller plus loin. Rust est un langage fortement typé. Tu confonds avec l’inférence de type. Apprends peut-être mieux le langage avant d’écrire un tuto dessus, des énormités dans ce genre c’est vraiment grave.

En effet, je vais le tuto Rust dans le cadre d’un projet M1 et je n’ai pas pu bien utiliser ce langage. En effet, dire cela alors même que j’utilise les types est stupide, je changerai cela, je voulais dire que le type n’est pas nécessaire mais c’est très différent de non-typé.

Sinon, le tuto est très brouillon. Il n’y a pas de fil directeur. Tu balances les infos un peu n’importe comment (et des infos fausses qui plus est…). Ce tuto n’aurait jamais dû rentrer en bêta étant donné son état actuel…

Totalement d’accord, le tuto n’est en beta que pour une raison, pouvoir montrer l’avancement au prof, sinon il serait uniquement en brouillon. Commencer le tuto sans vraiment d’aide sur un sujet que l’on ne maîtrise pas est une mauvaise idée. On devait être à trois pour faire ce tuto mais les travaux de groupe ne se passe que rarement bien (ou du moins à la fac)

Ce sujet est verrouillé.