Après la sortie de Rust 1.37.0 en août, l’équipe de développement de Rust a publié hier la version 1.38.0 du langage. Les fonctionnalités les plus marquantes de Rust 1.37.0 incluaient les références aux variantes enum via les alias type, le cargo vendor intégré, les éléments const non nommés, l’optimisation guidée par le profil, une clé d’exécution par défaut default - run dans Cargo et #[repr(align(N))] sur des enum.
La version 1.38.0 apporte la prise en charge de la compilation en pipeline et étend l’usage de l’attribut #[deprecated], introduit pour la première fois dans Rust 1.9.0, ce qui permet à présent de l'appliquer également aux macros. Rust 1.38.0 vous permet désormais de connaître le nom d’un type au cours du débogage à l’aide de l’attribut std::any::type_name. Voici plus en détail quelques nouveautés apparues dans Rust 1.38.0.
Compilation en pipeline
Pour plus de performance, Rust 1.38 prend en charge la compilation en pipeline selon laquelle Cargo commencera à construire des caisses (crates) dépendantes à l’instant où les métadonnées seront prêtes. Pour les constructions qui impliquent plusieurs caisses, cela peut conduire à des vitesses de compilation de l'ordre de 10~20 % plus rapides pour des constructions propres et optimisées. Notons qu’une caisse (crate) est une unité de compilation. Cela signifie que c’est un programme ou une bibliothèque. rustc ne compile qu’une caisse à la fois.
En effet, pour compiler une caisse désormais, le compilateur n'a pas besoin que les dépendances soient entièrement construites. Au lieu de cela, il n'a besoin que de leurs « métadonnées » (c'est-à-dire la liste des types, des dépendances, des exportations, etc.). Ces métadonnées sont produites au début du processus de compilation. À partir de Rust 1.38.0, Cargo en profitera et commencera automatiquement à construire des caisses dépendantes dès que les métadonnées seront prêtes.
Selon l’équipe, bien que le changement n'ait pas d'effet sur les builds pour une seule caisse, les tests ont montré une augmentation de la vitesse de compilation de 10 à 20 % pour des builds optimisés et propres de certains graphes de caisse. D'autres ne se sont pas beaucoup améliorés et l'accélération dépend du matériel exécutant la construction. Aucun changement de code n'est nécessaire pour en tirer profit.
Rust 1.38.0 étend l’utilisation de l'attribut #[deprecated] aux macros
L'attribut #[deprecated], introduit pour la première fois dans Rust 1.9.0, permet aux auteurs de caisses (crates) d'informer leurs utilisateurs qu'un élément de leur caisse est obsolète et sera supprimé dans une prochaine version. Rust 1.38.0 étend l'attribut, ce qui permet de l'appliquer également aux macros.
Linting de certaines utilisations incorrectes de mem::{uninitialized, zeroed}
Selon l’équipe de développement de Rust, std::mem::uninitialized n’est pas toujours utilisé en toute sécurité. Il faut utiliser à la place MaybeUninit<T>. L’utilisation de mem::uninitialized n’est pas encore déprécié, mais l’équipe a annoncé que cela sera fait dans une prochaine version. Cependant, à partir de la version 1.38.0, rustc fournira un lint (outil d’analyse de code source) pour une classe d'initialisations incorrectes en utilisant mem::uninitialized ou mem::zeroed. Vous pouvez en savoir plus sur la fonctionnalité en consultant la note de version de la version stable de Rust 1.38.0.
Obtenir le nom d’un type en utilisant std::any::type_name
D’après l’équipe, pour le débogage, il est parfois utile d'obtenir le nom d'un type. Par exemple, dans le code générique, vous pouvez vouloir voir, au moment de l'exécution, avec quels types concrets les paramètres de type d'une fonction ont été instanciés. Ceci peut maintenant être fait en utilisant std::any::type_name.
Comme toutes les fonctions de bibliothèque standard destinées uniquement au débogage, le contenu exact et le format de la chaîne ne sont pas garantis. La valeur retournée n'est qu'une description du type. Selon l’équipe, plusieurs types peuvent partager la même valeur de type_name. Elle a également annoncé que cette valeur peut changer dans les prochaines versions du compilateur.
Il existe aussi d'autres modifications dans la version Rust 1.38.0 et certaines fonctions existantes ont été stabilisées. On peut citer :
- slice::{concat, connect, join} accepte maintenant &[T] en plus de &T ;
- *const T et *mut T implémentent maintenant le marqueur::Unpin ;
- Arc<[T]> et Rc<[T]> implémentent maintenant FromIterator<T> ;
- etc.
Source : Rust
Et vous ?
Qu'en pensez-vous ?
Voir aussi
Rust 1.37.0 est disponible en version stable et apporte des éléments const non nommés, ainsi qu'une clé d'exécution par défaut dans Cargo
« Rust est le futur de la programmation système et C le nouvel assembleur », d'après un ingénieur d'Intel qui explique pourquoi il est pertinent de passer à Rust
L'équipe de npm choisit Rust pour gérer les goulots d'étranglement liés au CPU au détriment de Go, C, C++ et Java. Voici les raisons de ce choix