URL: https://linuxfr.org/users/guiea_7/journaux/sortie-de-rust-0-7 Title: Sortie de Rust 0.7 Authors: GuieA_7 Date: 2013年07月12日T00:29:46+02:00 License: CC By-SA Tags: rust et mozilla Score: 51 Début juillet sortait la version 0.7 du langage de programmation [Rust](http://www.rust-lang.org/). Ayant pour le moment écrit la faramineuse quantité de 0 lignes de code en Rust, je ne me lancerai pas dans l'écriture d'une dépêche (qui n'atteindrait pas les standards de kalitay de linuxfr). En revanche je m'intéresse beaucoup à ce langage depuis quelques mois, et si je peux susciter l’intérêt de quelques lecteurs alors mon but sera atteint. Rust est un langage crée par Mozilla, qui s'en sert pour écrire une moteur de rendu HTML, Servo, qui pourrait un jour remplacer Gecko. Au premier abord, il ressemble au langage [Go](http://golang.org/) de Google - un langage "système", compilable en code natif avec des performances proches du C (je reviendrai sur ce point), mais qui gère automatiquement la mémoire. - typage statique et fort, avec de l'inférence de type, permettant de rendre l'écriture de code proche des langages à typage dynamique. - concurrence gérée de base, favorisant des tâches communiquant via des messages. - langage objet mais qui s'éloignent du modèle C++/java (arborescence de classes). Pourtant ces 2 langages sont au final très différents. Go se veut un langage très simple, qui n'apporte pas vraiment de concept nouveau, mais se "contente" de déployer les bonnes pratiques connues. Rust pour sa part se veut bien plus ambitieux, même si c'est au prix d'une complexité plus grande, et aussi d'une gestation bien plus longue ! Rust n'est pas juste un langage impératif, mais possède aussi des caractéristiques fonctionnelles (closures, types avancés). Il y aussi un système de macro qui semble puissant. Mais le plus fascinant reste sa gestion de la mémoire et des "pointeurs". Il y a 3 types de références : - managed: objets gérés par un garbage collector. - owned: objets alloués sur la pile quand c'est possible, sur le tas sinon (c'est le compilateur qui choisit). Ces objets sont désalloués automatiquement à la fin de leur portée. - borrowed: c'est cette catégorie qui fait une bonne partie de la puissance du langage. Il s'agit d'une référence à un objet owned, mais dont la durée de vie est forcément plus courte que celle de la référence originale. Le compilateur va vérifier statiquement les contraintes de durée de vie (une grande partie de l'intelligence du compilateur est son borrow checker), et va permettre de garantir qu'on ne peut pas avoir de référence vers un objet désalloué. Il y a aussi une sémantique de move, qui permet par exemple à une tâche de passer la responsabilité d'une référence à une autre tâche, et donc d'être sûr à la compilation que celle-ci ne peuvent pas écrire la même zone mémoire en même temps (avec les problèmes que ça entraîne). Cela permet aussi à chaque tâche de gérer son propre pool mémoire. Au final on obtient un langage qui ne permet pas les pointeurs nuls, mais qui permet de se passer bien souvent du garbage collector ou de l'allocation sur le tas. D'ailleurs l'objectif est de se passer du GC dans toute la bibliothèque standard (je ne sais plus si c'est pas déjà le cas ou pas). Le langage est en développement actif, et n'hésite pas à casser la compatibilité entre les versions (ce qui est une bonne chose, tant que la 1.0 n'est pas atteinte en tout cas). Par exemple rien que la sémantique du 'for' n'est pas encore fixée ! En 0.6, on avait quelque chose proche de Ruby: for [1,2,3].each |i| { /* closure */ } En 0.7, on passe d'une itération interne à une itération externe, jugée plus souple et puissante, proche de Python. Le résultat est un peu bâtard: for [1,2,3].iter().advance |i| { /* block */ } Le but étant en 0.8 de pouvoir écrire quelque chose du genre (c'est encore en réflexion je crois): for i in [1,2,3] { /* block */ } Je trouve ça vraiment intéressant que Mozilla teste en grandeur nature son langage (en le cassant régulièrement) pour écrire un vrai gros logiciel (Servo que j'ai cité au début). J'imagine qu'une telle démarche a déjà été faite, mais je ne saurai dire pour quel langage. Au dernières nouvelles, le langage est encore loin des performances du C (genre 5 fois plus lent), mais il est encore jeune ; si je me souviens bien Go a mis du temps atteindre ses performances actuelles. Il y a encore de nombreux progrès à prévoir, mais certaines nouvelles sont encourageantes, comme le fait que Rust peut donner des informations à LLVM qui permettent d'optimiser le binaire, et que la sémantique du C ne permet pas (je ne remets pas la main sur le lien, je ne retrouve que [ça](https://github.com/mozilla/rust/pull/6742)). Il y aurait encore beaucoup à dire (mais j'ai peur d'avoir déjà été indigeste). Pour ma part je suis l'actualité sur la [page reddit](http://www.reddit.com/r/rust/) de Rust (via le flux RSS). Voici 2 articles passionnants que j'ai pu y trouver : - http://roscidus.com/blog/blog/2013/06/09/choosing-a-python-replacement-for-0install/ : l'auteur veut remplacer Python pour son projet et compare plusieurs langages. Les points comparés sont étranges mais l'articles est finalement riche en informations. - http://pcwalton.github.io/blog/2013/05/20/safe-manual-memory-management/ : réflexions sur la gestion mémoire. Tous les articles du monsieur sont excellents. Je place beaucoup d'espoir dans ce langage, qui ressemble beaucoup à ce que j'attends depuis des années.

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