Mozilla et la communauté Rust ont annoncé la version 0.9 de Rust le 9 janvier.

Cet article présente l'actualité de ce dernier depuis la version 0.8 détaillée en octobre. 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.

Sommaire

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.

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,

let x = box "Test" ;

équivaut à

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<RefCell<T>> ou de préférence Rc<RefCell<T>> , voire aussi Cell<T> 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 (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,

s’écrit maintenant et ne peut être appelé qu’une seule fois, &fn s’écrit maintenant |args| -> ret pour correspondre à la forme littérale,

s’écrit maintenant 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. 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. 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 ;

est une réécriture de et vient le remplacer dans cette version ; réécriture de std::comm (canaux pour communiquer entre différentes tâches) ;

(canaux pour communiquer entre différentes tâches) ; suppression du suffixe _iter des noms des méthodes des itérateurs ;

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 pull requests. 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) ;

, 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] pour l’utilisation de code C dans Rust, le dépassement de pile sera détecté autrement ;

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 plus évolués ainsi que d'utiliser CMake.

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 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 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,

: mentionné dans le paragraphe Hello, world! de la précédente dépêche, rusti : car il n’a jamais été très fiable.

Cependant, un projet indépendant d'interpréteur Rust interactif écrit en Ruby est apparu : iRust.

rustpkg

L'outil d'empaquetage et de construction pour Rust rustpkg 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. C'est un tableau de bord de l'état de compilation des projets en Rust (voire intégration continue) enregistrés sur Travis CI.

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é 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. On peut par exemple suivre le nombre de lignes de code en Rust dans le projet Rust lui-même.

Documentation

rustdoc

Pour rappel, rustdoc 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 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). De nombreux guides 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.

Liens

Sauf indication contraire, les contenus liés sont en anglais. Et il y en a un paquet.

Notes de version

Nouvelles

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 :

Projets

Autres

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, 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 — 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 (Dynamically Sized Types, DST),

Suppression totale de @ (une bonne nouvelle pour les chieurs qui trouvaient que Rust avaient trop de pointeurs !),

(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.

Aller plus loin