URL: https://linuxfr.org/news/quelques-nouvelles-sur-rust-a-l-occasion-de-la-0-9 Title: Quelques nouvelles sur Rust à l’occasion de la 0.9 Authors: ariasuni olivierweb, Nÿco, Yves Bourguignon, Benoît Sibaud, palm123, Joris R, Pierre Jarillon, spider-mario et Bruno Michel Date: 2013年10月26日T14:13:50+02:00 License: CC By-SA Tags: programmation, ubuntu, rust et mozilla Score: 46 Mozilla et la communauté Rust ont annoncé la version 0.9 de Rust le [9 janvier](https://mail.mozilla.org/pipermail/rust-dev/2014-January/007753.html). Cet article présente l'actualité de ce dernier depuis la [version 0.8 détaillée en octobre](https://linuxfr.org/news/presentation-de-rust-0-8). **Rust est un langage orienté sûreté, concurrence, praticité**. Concrètement, c’est un langage compilé, orienté système, et multi-paradigme (procédural, fonctionnel, orienté objet). Ce fut une autre sortie mouvementée dans laquelle ont été réalisés d'importants changements, et l’activité autour de Rust n’a jamais été aussi importante ! # Résumé Côté syntaxe, on assiste à une amélioration et surtout, une réduction de la variété des fermetures dans le langage. Cette version commence la dernière série de changements prévus concernant la façon dont les pointeurs sont traités dans Rust. À commencer par la dépréciation des pointeurs partagés et son symbole `@`, qu’il faudra remplacer par l’utilisation de types de pointeurs intelligents introduits dans la bibliothèque standard. Le code source du compilateur et de la bibliothèque standard a été nettoyé, optimisé, et de nombreux bogues ont été corrigés. Le travail sur le compilateur a permis d’améliorer la vitesse de compilation et de faire plus d’optimisations. On peut désormais lier statiquement une bibliothèque à la compilation, et le système d’entrées/sorties de la bibliothèque standard a été réécrit. La documentation a été améliorée et la présentation revue. L'infrastructure de construction a été elle aussi modifiée. Pour rappel, toute modification de code du dépôt Git passe en premier lieu par un robot de construction afin de la valider à l'issue de l'exécution de tous les tests. Les changements sont détaillés dans la seconde partie de la dépêche. Note : Comme la précédente version, la version 0.9 doit être considérée comme une version alpha, adaptée pour les curieux, les pionniers et les amateurs du langage. Il y aura encore une 0.10 et probablement une 0.11. ---- [Site web officiel (avec tutoriel et documentation)](http://www.rust-lang.org/) [FAQ du projet](https://github.com/mozilla/rust/wiki/Doc-project-FAQ) [Notes de version](https://github.com/mozilla/rust/blob/master/RELEASES.txt) [Notes de version détaillées](https://github.com/mozilla/rust/wiki/Doc-detailed-release-notes) ---- # Syntaxe ## Macros La macro `fmt!` a été remplacée par `format!`. Cette macro (donc implémentée dans le compilateur) transmet ses invocations au module `std::fmt` pour formater ses arguments à l'exécution en chaines de caractères et flux. Elle a été présentée dans la dépêche sur Rust 0.8, elle offre une syntaxe beaucoup plus sympathique et puissante que les fonctions de bases du module `fmt`. De plus les messages d'erreur de formatage ont été améliorés. Désormais tout Rust profite de `format!` et des macros `info!`, `debug!`, `warn!`, etc. `format!` est utilisée en interne par `print!` et `println!` depuis la version 0.8. D’ailleurs, `print` et `println` (affichage de texte sans formatage) ne sont plus importés par défaut. ```rust format!("Salut") // => ~"Salut" format!("{:s}, j'adore !", "LinuxFr") // => ~"LinuxFr, j'adore !" format!("Le nombre est {:d}", 1) // => ~"Le nombre est 1" format!("{:?}", ~[3, 4]) // => ~"~[3, 4]" format!("{valeur}", valeur=4) // => ~"4" format!("{} {}", 1, 2) // => ~"1 2" ``` ## Type `float` Dans la dernière dépêche sur Rust, je ne vous ai pas présenté le type `float` (qui est un `f32` en 32 bits et un `f64` en 64 bits). C’est normal, il était présent dans la 0.8 mais il avait déjà été supprimé dans la branche maitre, et n’est donc plus disponible à partir de la version 0.9. Par ailleurs, on ne peut plus écrire les flottants (entre autres nouvelles restrictions) sous forme octale et hexadécimale. ## Pointeurs uniques Désormais, ```rust let x = box "Test"; ``` équivaut à ```rust let x = ~"Test"; ``` ## Pointeurs partagés Les pointeurs partagés (@) sont désactivés par défaut en préparation à leur suppression future (on peut les réactiver avec `#[feature(managed_boxes)]`). Il faut utiliser les types de la bibliothèque standard `Gc` (pointeurs gérés par un ramasse-miette) ou `Rc` (pointeurs gérés par des comptages de référence) à la place. Les pointeurs `@mut` ont carrément été supprimés. Il faut utiliser les remplacements possibles qui sont `Gc>` ou de préférence `Rc>`, voire aussi `Cell` pour les types `Pod`. La syntaxe devient beaucoup plus verbeuse mais la prochaine version allégera la syntaxe (diverses idées sont en développement/en cours de réflexion). ## Fermetures La syntaxe et l'utilisation des [fermetures](http://fr.wikipedia.org/wiki/Fermeture_%28informatique%29) (ou clôtures ou *closures* en anglais) ont été modifiées : * `~fn` s’écrit maintenant `proc (args) -> ret { ... }` et ne peut être appelé qu’une seule fois, * `&fn` s’écrit maintenant `|args| -> ret` pour correspondre à la forme littérale, * `@fn`s a été supprimé. `do` qui fonctionnait avec `&fn` ne fonctionne maintenant plus qu’avec `proc`. Le premier peut être appelé plusieurs fois, ne nécessite pas d’allocation et ne peut pas être envoyé à une autre tâche ; le second ne peut être appelé qu’une seule fois, requiert une allocation sur le tas et peut être envoyé à une tâche différente (implémente le trait `Send`). # Compilateur et bibliothèque standard ## Bibliothèque standard Toutes les dépendances au C++ ont été supprimées. De nombreuses autres améliorations ont permis de grandement simplifier le débogage. Rust fournit deux implémentations des tâches et des entrées/sorties, qui ont été séparées du reste de la bibliothèque standard, en deux bibliothèques : [libnative et libgreen](http://static.rust-lang.org/doc/master/guide-runtime.html#implementations-of-the-runtime). Chacune a ses avantages et ses inconvénients, libnative utilise le mécanisme de tâche du système et les appels d’entrées/sorties bloquants de la libc ; libgreen utilise la bibliothèque [libuv](https://github.com/joyent/libuv/). On peut ainsi choisir celle qui convient le mieux à notre programme. Autres changements : * `std::rt::io` est une réécriture de `std::io` et vient le remplacer dans cette version ; * réécriture de `std::comm` (canaux pour communiquer entre différentes tâches) ; * [suppression du suffixe `_iter`](https://github.com/mozilla/rust/pull/10622) des noms des méthodes des itérateurs ; * nouveau type natif mutex `std::unstable::mutex`. ## Compilateur Le processus de compilation a été fortement amélioré, en particulier par [trois](https://github.com/mozilla/rust/pull/7259) _[pull](https://github.com/mozilla/rust/pull/7186) [requests](https://github.com/mozilla/rust/pull/7154)_. La compilation est plus rapide, et produit des binaires plus performants et de taille réduite. Autres changements : * enum variant passé en expérimental ; * amélioration des performances (`include_bin!`, qui inclut le contenu d'un fichier comme *blob* binaire : compilation 187x plus rapide) ; * désormais l'utilisation de caractère non ASCII dans le nom des identifiants nécessite l'utilisation de `feature` ; * [suppression de `#[fixed_stack_segment]`](https://github.com/mozilla/rust/pull/10407) pour l’utilisation de code C dans Rust, le dépassement de pile sera détecté autrement ; * avertissement des codes morts lors de la compilation ; * avertissement des conversions de type (_casts_) inutiles ; * l'attribut de *crate* `pkgid` renommé en `crate_id`, l'attribut `link` disparait (et avec lui `author`), la déclaration d'utilisation de bibliothèque externe (`extern mod`) est modifiée et le compilateur reçoit des options pour extraire ces métadonnées, ce qui facilite l'écriture de Makefile, cela permet d'écrire des fichiers [Makefile](http://metajack.im/2013/12/12/building-rust-code--using-make/) plus évolués ainsi que d'utiliser [CMake](https://mail.mozilla.org/pipermail/rust-dev/2014-January/007659.html). ## Plateformes supportées Rust fonctionne désormais sous Windows (7, Server 2008 R2) seulement x86, Linux (diverses distributions) ARM, x86 et x86-64, OSX 10.6 ("Snow Leopard") et ultérieurs x86 et x86-64, ainsi que Android. Les procédures d'installation déjà en place pour la version 0.8 (pour Windows, Ubuntu, Arch Linux et Gentoo) décrites dans [la précédente dépêche](https://linuxfr.org/news/presentation-de-rust-0-8#tester-ou-faire-des-trucs-s%C3%A9rieux-avec-rust) sont toujours valables et ont été mises à jour pour cette version. Dès l'annonce, les paquets pour Ubuntu ont été générés dans le PPA `hansjorg/rust`, une compilation pour Arch est disponible dans le dépôt `[community]` et pour Gentoo, *l'overlay* `rust` contient un ebuild pour cette version. Le tutoriel détaille aussi [l'installation](http://static.rust-lang.org/doc/master/tutorial.html#getting-started) sur les différentes plateformes. # Outils de développement ## rust et rusti Deux outils ont été supprimés : * `rust` : mentionné dans le paragraphe *Hello, world!* de la précédente dépêche, * `rusti` : [car il n’a jamais été très fiable] (https://github.com/mozilla/rust/issues/9818). Cependant, un projet indépendant d'interpréteur Rust interactif écrit en Ruby est apparu : [iRust](https://github.com/tarcieri/irust). ## rustpkg L'outil d'empaquetage et de construction pour Rust [rustpkg](http://static.rust-lang.org/doc/master/rustpkg.html) a été totalement réécrit et amélioré, il est toujours en développement. Il a été modifié pour prendre en compte le nouvel attribut de caisse `crate_id`, il peut tester les exemples de code dans la documentation, il peut tester les paquets (argument `test`), il supporte les dépendances d’autres langages telles que les bibliothèques C et détecte des caisses (*crates*) dans le dossier courant. Les noms de fichier des bibliothèques (le fichier source contient en entête `#[crate_type = "lib"];`) sont désormais préfixés avec `lib` à la compilation. ## Autres projets indépendants Un projet indépendant de l'équipe de développement de Rust a vu le jour : [rust-ci](http://hiho.io/rust-ci/). C'est un tableau de bord de l'état de compilation des projets en Rust (voire intégration continue) enregistrés sur [Travis CI](https://travis-ci.org/). En complément, un projet vise à rassembler la documentation des paquets Rust : http://docs.octayn.net/. Actuellement, seul le projet noise contient une documentation. Le compteur de lignes de code de Ohloh — Ohcount — a été [modifié](https://github.com/blackducksw/ohcount/pull/30) pour établir les statistiques des projets utilisant Rust. Cette modification vient d'être mise en production, les projets sont mis à jour, le langage Rust est désormais [listé dans Ohloh](https://www.ohloh.net/languages/rust). On peut par exemple suivre le nombre de [lignes de code en Rust](https://www.ohloh.net/p/rust-lang/analyses/latest/languages_summary) dans le projet Rust lui-même. # Documentation ## rustdoc Pour rappel, [rustdoc](http://static.rust-lang.org/doc/master/rustdoc.html) est l’outil qui génère la documentation à partir des commentaires dans le code source, selon la syntaxe Markdown (syntaxe d’ailleurs utilisée pour les contenus de Linuxfr). Le consensus semble être qu’utiliser reStructuredText et [Sphinx](http://sphinx-doc.org/) soit la voie à suivre. Ce sont respectivement le langage de balisage léger utilisé pour la documentation de Python, et l’outil qui permet à partir de cette syntaxe de produire la documentation dans plusieurs formats. Pour le moment, rien n’est décidé, mais la réécriture en cours de rustdoc permettra de changer facilement de syntaxe par la suite. ## Tutoriel Plusieurs paragraphes du tutoriel ont été remaniés pour le rendre plus concret et refléter les nombreux changements du langage (notamment [14 Ownership escape hatches](http://static.rust-lang.org/doc/0.9/tutorial.html#ownership-escape-hatches)). De nombreux [guides](http://static.rust-lang.org/doc/master/index.html) ont été remaniés, renommés ou ajoutés. Côté tutoriel, on a aussi une initiative visant aussi à créer un nouveau tutoriel: [Rust tutorials_NG](http://adridu59.github.io/rust-tuts/). # Liens Sauf indication contraire, les contenus liés sont en anglais. Et il y en a un paquet. ## Notes de version * [Wiki](https://github.com/mozilla/rust/wiki/Doc-detailed-release-notes) * [README.txt](https://github.com/mozilla/rust/blob/master/RELEASES.txt) ## Nouvelles * [État d'avancement](https://github.com/mozilla/rust/issues/milestones) * [Abandon de la pile segmentée](https://mail.mozilla.org/pipermail/rust-dev/2013-November/006314.html) * [This week in Rust](http://cmr.github.io/) : dernières actualités sur les modifications du langage et nouveaux projets, en anglais : * [État de Rust 0.8](http://cmr.github.io/blog/2013/10/06/the-state-of-rust-0-dot-8/) * [12/10/2013](http://cmr.github.io/blog/2013/10/12/this-week-in-rust/), * [19/10/2013](http://cmr.github.io/blog/2013/10/19/this-week-in-rust/), * [De la sûreté de la pile](http://cmr.github.io/blog/2013/10/21/on-stack-safety/), * [28/10/2013](http://cmr.github.io/blog/2013/10/28/this-week-in-rust/), * [Plus sur la sûreté de la pile](http://cmr.github.io/blog/2013/10/28/more-on-stack-safety/), * [9/11/2013](http://cmr.github.io/blog/2013/11/09/these-weeks-in-rust/), * [19/11/2013](http://cmr.github.io/blog/2013/11/19/this-week-in-rust/), * [23/11/2013](http://cmr.github.io/blog/2013/11/23/this-week-in-rust/), * [30/11/2013](http://cmr.github.io/blog/2013/11/30/this-week-in-rust/), * [9/12/2013](http://cmr.github.io/blog/2013/12/09/this-week-in-rust/), * [16/12/2013](http://cmr.github.io/blog/2013/12/16/this-week-in-rust/), * [22/12/2013](http://cmr.github.io/blog/2013/12/22/this-week-in-rust/), * [30/12/2013](http://cmr.github.io/blog/2013/12/30/this-week-in-rust/), * [06/01/2014](http://cmr.github.io/blog/2014/01/06/this-week-in-rust/), * [The state of Rust 0.9](http://cmr.github.io/blog/2014/01/12/the-state-of-rust-0-dot-9/). * [Tweets en français sur Rust](https://twitter.com/rustlang_fr) * [Discussion sur l'évolution de Rust](https://mail.mozilla.org/pipermail/rust-dev/2013-December/007578.html) Vous pouvez constater, en lisant les "This Week in Rust" que de plus en plus de contributeurs rejoignent le développement de Rust ! ## Tutoriels Présentations sur le langage, exemples de code : * [exemple de programme parallèle en Rust](http://blog.leahhanson.us/a-first-parallel-program-in-rust.html), * [explication sur les boites et pointeurs en Rust](http://words.steveklabnik.com/pointers-in-rust-a-guide), * [interfaçage avec le code C en Rust](http://smallcultfollowing.com/babysteps/blog/2013/02/22/interfacing-with-c-functions-in-rust/), * [présentation sur Rust lors de la ScalaIO](http://dev.unhandledexpression.com/slides/rust-scalaio), * présentation [Nobody knows Rust](http://steveklabnik.github.io/nobody_knows_rust/), * présentation vidéo [Rust, Macros, & Hygiene](http://www.youtube.com/watch?v=_KgXy7jnwhY) données lors de *SoCal PLS*, * [un exemple d’utilisation d’une fonction C en Rust](http://redbrain.co.uk/rust-and-readline-c-ffi/), * [une présentation sympathique de Rust](http://www.foocafe.org/event/a-friendly-introduction-to-rust), * [Rust for rubyists](http://www.rustforrubyists.com/) mis à jour, * [types en Rust](http://jvns.ca/blog/2013/12/02/types-in-rust/), * [deux fichiers d’exemple qui, respectivement, lisent et écrivent dans un fichier](https://github.com/pirapira/rust-file-example), * [un nouveau tutoriel en cours de rédaction](http://adridu59.github.io/rust-tuts/index.html), * [FAQ et astuces](http://static.rust-lang.org/doc/master/complement-cheatsheet.html), * [article sur les différents modèles de concurrence](http://www.lars.com/concurrency/rust/servo/2013/12/21/concurrency-rust-and-servo.html), * [comprendre les pointeurs, l’appartenance, et les durées de vie en Rust](http://paulkoerbitz.de/posts/Understanding-Pointers-Ownership-and-Lifetimes-in-Rust.html), * [un compilateur juste-à-temps en Rust](http://hydrocodedesign.com/2014/01/17/jit-just-in-time-compiler-rust/). ## Projets * [Quasar, un petit micro-noyau en Rust](https://github.com/LeoTestard/Quasar), * [frontal Rust à GCC](https://github.com/redbrain/gccrs), * [Ears](https://github.com/JeremyLetang/ears), bibliothèque de lecture des fichiers audio avec OpenAL and libsndfile, * Servo, les travaux sur ACID2 continuent, le fichier de test a été rajouté, réflexions sur l'utilisation du système de revue de code [Critic](https://github.com/jensl/critic/), utilisé par Opera, * [uutils](https://github.com/uutils/coreutils), réécriture des coreutils en Rust et multiplateforme, * [RustyKext](https://github.com/astavonin/RustyKext), équivalent de [rust.ko](https://github.com/tsgates/rust.ko) pour Mac OS X. ## Autres * [Une utilisation en production de Rust](http://www.reddit.com/r/rust/comments/1nqzth/zeromq_helping_us_block_malicious_domains_in_real/). * [Rust and Servo internships with the GNOME Outreach Program for Women](https://mail.mozilla.org/pipermail/rust-dev/2013-October/006036.html). * [Page sur le développement de système d’exploitation en Rust](https://github.com/mozilla/rust/wiki/Operating-system-development). * [Présentation de SprocketNES au bureau de Mozilla à San Francisco](http://thread.gmane.org/gmane.comp.lang.rust.devel/6086) le 20 novembre. * [Une proposition pour ajouter l’héritage simple dans Rust (l’héritage « classique »)](http://smallcultfollowing.com/babysteps/blog/2013/10/24/single-inheritance/). * [Utiliser Rust pour un cours universitaire de système](http://rust-class.org/pages/using-rust-for-an-undergraduate-os-course.html). * [Une présentation de Rust à la linux.conf.au](http://www.youtube.com/watch?v=gfCtbGiHcg0). # Conclusion Le langage approche à vitesse grand V de la version finale. La version 1.0 est prévue pour la fin de 2014, voir l'[état d'avancement de la version 1](https://github.com/mozilla/rust/issues/milestones), mais on en saura plus en cours d'année. Il y aura encore sûrement des changements dans la syntaxe — et dès la parution du la version 0.9, il y en a déjà, voir [This week in Rust du 11 janvier](http://cmr.github.io/blog/2014/01/11/this-week-in-rust/) — mais le langage est très proche de la complétion et il commence à y avoir suffisamment de ressources en ligne pour apprendre. Il n’y a plus d’excuses pour ne pas se mettre au Rust ! ;) ## Futur (0.10) * Introduction des [types à taille dynamique](http://smallcultfollowing.com/babysteps/blog/2014/01/05/dst-take-5/) (Dynamically Sized Types, DST), * Suppression totale de `@` (une bonne nouvelle pour les chieurs qui trouvaient que Rust avaient trop de pointeurs !), * Rajout de sucre syntaxique pour rendre l’utilisation des pointeurs de la bibliothèque standard plus simple, * Un vrai ramasse-miettes.

AltStyle によって変換されたページ (->オリジナル) /