Rust 1.32 Release

L'équipe de développement de Rust est heureuse d'annoncer la sortie d'une nouvelle version de Rust, 1.32.0. Rust est un langage de programmation qui permet à chacun de créer des logiciels fiables et efficaces.


Si vous avez une version précédente de Rust installée à l'aide de rustup , alors pour mettre à niveau Rust vers la version 1.32.0, il vous suffit de faire:


 $ rustup update stable 

Si vous n'avez pas encore installé rustup , vous pouvez l' installer à partir de la page correspondante de notre site Web. Des notes de version détaillées pour Rust 1.32.0 sont disponibles sur GitHub.


Une note rustup : plusieurs nouvelles versions de rustup ont été rustup ! Pour mettre à jour rustup lui-même, effectuez rustup self update .

Ce qui est inclus dans la version stable 1.32.0


Rust 1.32.0 a acquis plusieurs améliorations améliorant la vie, a changé l'allocateur de mémoire par défaut et a rendu plus de fonctions constantes. Lisez ces modifications ci-dessous ou voyez-en plus dans les notes de version .


Macro dbg


Commençons par une amélioration qui améliore la vie. Utilisez-vous le débogage d'impression? Si c'est le cas et que vous souhaitez imprimer une valeur tout en travaillant sur le code, vous êtes obligé de le faire:


 let x = 5; println!("{:?}", x); //    println!("{:#?}", x); 

Ce n'est pas le plus gros obstacle qui ralentit le développement, mais il faut trop d'efforts pour simplement déboguer la sortie de la valeur x . De plus, le contexte n'est pas pris en compte ici. Si vous en possédez plusieurs println! s, il devient difficile de déterminer à quoi se réfère la sortie, jusqu'à ce que vous ajoutiez vous-même des informations de contexte à chaque appel, ce qui nécessite encore plus de travail.


À ces fins, dans Rust 1.32.0, nous avons ajouté une nouvelle macro dbg! :


 fn main() { let x = 5; dbg!(x); } 

Après avoir démarré ce programme, vous verrez:


 [src/main.rs:4] x = 5 

Avec le nom de la variable et sa valeur, le nom du fichier et le numéro de ligne où l'appel dbg! été effectué seront affichés dbg! .


De plus, println! imprime à la sortie standard, il est donc préférable d'utiliser eprintln! pour imprimer dans le flux d'erreur standard. Macro dbg! sorties à stderr , et à juste titre.


Cela fonctionne même dans les cas difficiles. Prenons un exemple de mise en œuvre factorielle:


 fn factorial(n: u32) -> u32 { if n <= 1 { n } else { n * factorial(n - 1) } } 

Afin de le déboguer, nous pouvons utiliser eprintln! :


 fn factorial(n: u32) -> u32 { eprintln!("n: {}", n); if n <= 1 { eprintln!("n <= 1"); n } else { let n = n * factorial(n - 1); eprintln!("n: {}", n); n } } 

Nous voulons afficher n à chaque itération et voir le contexte de chacune des branches. Pour factorial(4) affichera:


 n: 4 n: 3 n: 2 n: 1 n <= 1 n: 2 n: 6 n: 24 

C'est acceptable, mais pas particulièrement bon. Peut-être pourrions-nous travailler à améliorer la sortie des informations contextuelles pour rendre la conclusion plus claire. Mais ensuite, au lieu de déboguer notre code, nous améliorerons le code de débogage.


Prenons le même exemple en utilisant dbg! :


 fn factorial(n: u32) -> u32 { if dbg!(n <= 1) { dbg!(1) } else { dbg!(n * factorial(n - 1)) } } 

Nous avons simplement encapsulé une macro avec chacune des expressions que nous voulons afficher. En conséquence, nous obtenons:


 [src/main.rs:3] n <= 1 = false [src/main.rs:3] n <= 1 = false [src/main.rs:3] n <= 1 = false [src/main.rs:3] n <= 1 = true [src/main.rs:4] 1 = 1 [src/main.rs:5] n * factorial(n - 1) = 2 [src/main.rs:5] n * factorial(n - 1) = 6 [src/main.rs:5] n * factorial(n - 1) = 24 [src/main.rs:11] factorial(4) = 24 

Puisque la macro est dbg! renvoie la valeur de débogage elle-même, contrairement à eprintln! , qui retourne () , alors nous n'avons pas besoin de modifier la structure de notre code. De plus, nous obtenons une conclusion beaucoup plus utile.


Nous avons accordé beaucoup d'attention à une si petite macro, car nous espérons qu'elle simplifiera votre processus de débogage. Bien sûr, nous continuons également à travailler sur le soutien de gdb and Co.


jemalloc supprimé par jemalloc


Il était une fois, Rust avait une grande autonomie similaire à Erlang. Pour lui, jemalloc a été choisi à la place de l'allocateur système, car il était souvent plus productif. Peu à peu, nous nous sommes débarrassés de l'exécution de plus en plus et à la fin, presque tout a été supprimé, mais jemalloc est resté. Nous n'avions aucun moyen de choisir un allocateur personnalisé, et donc nous ne pouvions pas supprimer complètement jemalloc, afin de ne pas nuire à ceux qui en avaient besoin.


De plus, l'affirmation selon laquelle jemalloc a toujours été l' jemalloc par défaut était principalement liée au monde UNIX, car il n'était par défaut que sur certaines plates-formes. En particulier, l'objectif de MSVC sur Windows utilise depuis longtemps un allocateur système.


Enfin, bien que jemalloc ait généralement de bonnes performances, ce n'est pas toujours le cas. De plus, il ajoute environ 300 kilo-octets à chaque exécutable. De plus, nous avons accumulé de nombreux autres problèmes avec jemalloc. En général, il est étrange que le langage système n'utilise pas l'allocateur système par défaut.


Pour ces raisons, dès que Rust 1.28 a fourni un moyen de choisir un allocateur global , nous avons commencé à planifier de basculer vers l'allocateur système par défaut et de fournir jemalloc tant que bibliothèque externe. Dans Rust 1.32, nous avons finalement terminé ce travail, et maintenant par défaut votre programme utilisera l'allocateur système.


Si vous souhaitez continuer à utiliser jemalloc, utilisez la bibliothèque jemallocator . Pour ce faire, spécifiez dans Cargo.toml :


 jemallocator = "0.1.8" 

Et dans le fichier racine de votre projet:


 #[global_allocator] static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc; 

C'est tout! Si vous n'avez pas besoin de jemalloc, vous n'êtes plus obligé de l'utiliser, mais si vous en avez besoin, le problème est résolu avec quelques lignes de code.


Améliorations du système de module final


Dans les deux dernières versions, nous avons parlé de plusieurs améliorations apportées au système de modules. Dans la version 1.32.0 et l'édition 2018, nous avons ajouté la dernière modification. Il est appelé "chemins uniformes" et vous permet de travailler avec des chemins d'importation de la même manière qu'avec d'autres chemins, qui fonctionnaient auparavant de manière incorrecte. Par exemple:


 enum Color { Red, Green, Blue } use Color::*; 

Ce code n'a pas été compilé auparavant , car les chemins use devraient avoir commencé avec super , self ou crate . Maintenant, grâce au compilateur prenant en charge les chemins cohérents, ce code fonctionnera et fera ce que vous attendez: importer des variantes de l'énumération Color définie ci-dessus.


Cette modification complète notre révision du système de modules. Nous espérons que vous apprécierez l'utilisation du système simplifié!


Améliorations des macros


Rust 1.32.0 a publié plusieurs améliorations de macro. Tout d'abord, un nouveau spécificateur de fragment littéral a été ajouté:


 macro_rules! m { ($lt:literal) => {}; } fn main() { m!("some string literal"); } 

Le fragment literal est mappé à des littéraux de tout type: chaîne, numérique et caractère.


Dans l' macro_rules 2018 macro_rules pouvez-vous également utiliser des macro_rules ? :


 macro_rules! bar { ($(a)?) => {} } 

Fragment avec ? une occurrence zéro ou une sera mise en correspondance, tout comme un fragment avec * correspond déjà à des occurrences «zéro ou plus», et avec + , une ou plusieurs occurrences.


Stabilisation de la bibliothèque standard


Macro dbg! , que nous avons déjà décrit ci-dessus, est devenu un ajout important à la bibliothèque standard. De plus, 19 fonctions ont été rendues constantes et tous les types primitifs numériques ont reçu des fonctions de conversion en un tableau d'octets et vice versa avec l'ordre d'octets spécifié. Il y a six fonctions avec les noms to_<endian>_bytes et from_<endian>_bytes , où <endian> est:


  • ne - ordre natif (endianité native)
  • le - ordre du junior au senior (petit endian)
  • be - ordre du plus vieux au plus jeune (big endian)

Voir les notes de version pour plus de détails.


Améliorations du fret


Cargo a reçu l' alias cargo c pour la commande cargo check et autorise désormais l' utilisation des noms d'utilisateur dans les URL du référentiel .


Voir les notes de version pour plus de détails.


Développeurs 1.32.0


Beaucoup de gens ont créé ensemble Rust 1.32.0. Nous n'aurions pas pu terminer le travail sans chacun de vous. Je vous remercie!


De la part d'un traducteur: Je remercie tout particulièrement les membres de la communauté Rustycrate et personnellement @dashadee et ozkriff pour leur aide dans la traduction et la relecture.

Source: https://habr.com/ru/post/fr436854/


All Articles