Version Rust 1.37.0: optimisation guidée par le profil, constantes sans nom et fournisseur de fret

Nous présentons à votre attention une traduction de la publication sur la nouvelle version du langage de programmation Rust bien-aimé.


Présentation


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


Si vous avez installé la version précédente de Rust à l'aide de rustup, pour mettre à niveau vers la version 1.37.0, il vous suffit d'exécuter la commande suivante:


$ rustup update stable 

Si vous n'avez pas encore installé rustup , vous pouvez l' installer à partir de la page correspondante de notre site Web, ainsi que voir les notes de version détaillées sur GitHub.


Qu'est-ce qui est inclus dans la version stable?


Les principales innovations de Rust 1.37.0 incluent des liens vers des options d' enum via des alias de type, un cargo vendor intégré, des constantes sans nom, une optimisation guidée par profil, la clé d' default-run pour les projets Cargo et #[repr(align(N))] pour les énumérations. Voir les notes de version détaillées pour plus d'informations.


Liens vers les options d' enum via les alias de type


Depuis Rust 1.37.0, le référencement des options d' enum est rendu possible grâce aux alias de type:


 type ByteOption = Option<u8>; fn increment_or_zero(x: ByteOption) -> u8 { match x { ByteOption::Some(y) => y + 1, ByteOption::None => 0, } } 

Dans les blocs impl , Self agit comme un alias de type, donc dans Rust 1.37.0 il est devenu possible de se référer aux options d'énumération en utilisant la syntaxe Self::Variant :


 impl Coin { fn value_in_cents(&self) -> u8 { match self { Self::Penny => 1, Self::Nickel => 5, Self::Dime => 10, Self::Quarter => 25, } } } 

Plus précisément, maintenant Rust vous permet de vous référer aux options d'énumération via la "résolution relative au type" , <MyType<..>>::Variant . Une description plus détaillée est disponible dans le rapport de stabilisation .


Prise en charge native du fret pour les dépendances des fournisseurs


Après plusieurs années d'existence en tant que package séparé , l'équipe des cargo vendor est désormais intégrée dans Cargo. Cette commande extrait toutes les dépendances de votre projet dans le répertoire vendor/ et affiche le fragment de configuration nécessaire pour utiliser le code fournisseur pendant l'assemblage.


cargo vendor déjà utilisé dans des projets réels: le compilateur rustc utilise pour envoyer toutes ses dépendances pour libérer des tarballs, et les projets avec des mono-référentiels l'utilisent pour corriger le code de dépendance dans le contrôle de version.


Utilisation de constantes sans nom dans les macros


Vous pouvez maintenant créer une (unnamed) (const ) en remplaçant son identifiant par un trait de soulignement ( _ ). Par exemple, dans le compilateur rustc nous avons trouvé ce code:


 ///   ,    ///  ,   -  . #[macro_export] macro_rules! static_assert_size { ($ty:ty, $size:expr) => { const _: [(); $size] = [(); ::std::mem::size_of::<$ty>()]; // ^    . } } static_assert_size!(Option<Box<String>>, 8); // 1. static_assert_size!(usize, 8); // 2. 

Faites attention à la deuxième static_assert_size!(..) : grâce à l'utilisation de constantes sans nom, il est devenu possible d'éviter les conflits de noms lors de la déclaration de nouveaux éléments. Auparavant, vous auriez besoin d'écrire static_assert_size!(MY_DUMMY_IDENTIFIER, usize, 8); . Avec l'introduction de constantes sans nom, il devient plus facile de créer des macros déclaratives et procédurales ergonomiques et réutilisables à des fins d'analyse statique.


Optimisation guidée par le profil


L'optimisation guidée par le profil (PGO) est désormais disponible dans le compilateur rustc , qui peut être activé via les indicateurs de compilateur -C profile-use -C profile-generate -C profile-use et -C profile-use .


L'optimisation guidée par le profil est une technique d'optimisation logicielle du compilateur qui analyse les tests au lieu du code source. Il fonctionne en compilant un programme d'optimisation en deux étapes:


  1. Tout d'abord, le programme est créé à l'aide des outils intégrés au compilateur. Cela se fait en passant rustc drapeau rustc -C profile-generate . Ensuite, le programme d'outil doit être exécuté sur les échantillons de données et ensuite il écrira les données de profilage dans le fichier.
  2. Le programme rustc ensuite , cette fois en transmettant les données de profilage collectées à rustc utilisant l'indicateur d' -C profile-use . Cet assembly utilisera les données collectées pour permettre au compilateur de prendre de meilleures décisions concernant le placement de code, l'incorporation et d'autres optimisations.

Pour plus d'informations sur l'optimisation guidée par le profil, consultez le chapitre correspondant dans le livre du compilateur rustc .


Sélection d'un fichier exécutable dans les projets Cargo


cargo run est un outil très pratique pour tester rapidement les applications de console. Lorsque plusieurs fichiers exécutables sont présents dans un même package, vous devez déclarer explicitement le nom du fichier exécutable que vous souhaitez exécuter à l'aide de l'indicateur --bin . Cela rend le cargo run non aussi ergonomique que nous le souhaiterions, en particulier lorsqu'un exécutable particulier est appelé plus souvent que d'autres.


Rust 1.37.0 résout ce problème en ajoutant une nouvelle clé d' default-run à Cargo.toml (section [package] ). Ainsi, si l'indicateur --bin n'est pas --bin , Cargo lancera le fichier binaire déclaré dans la configuration.


#[repr(align(N))] pour les énumérations


À partir de Rust 1.37.0, l'attribut #[repr(align(N))] peut être utilisé pour déterminer l' alignement des énumérations en mémoire (auparavant, cet attribut n'était autorisé que pour les structures ( struct ) et les unions ( union )). Par exemple, une énumération Align16 aura, comme prévu, un alignement de 16 octets, tandis que l'alignement naturel sans #[repr(align(16))] sera de 4 :


 #[repr(align(16))] enum Align16 { Foo { foo: u32 }, Bar { bar: u32 }, } 

La sémantique de l'utilisation de #[repr(align(N)) pour les énumérations est la même que la définition d'un wrapper pour une AlignN<T> avec cet alignement, puis l'utilisation d' AlignN<MyEnum> :


 #[repr(align(N))] struct AlignN<T>(T); 

Modifications de la bibliothèque standard


Rust 1.37.0 a stabilisé les composants suivants de la bibliothèque standard:



Autres changements


La syntaxe , le gestionnaire de paquets de fret et l' analyseur Clippy ont également subi quelques modifications.


Membres 1.37.0


Beaucoup de gens se sont réunis pour créer Rust 1.37.0. Nous n'aurions pas pu faire cela sans vous tous, merci!


Nouveaux commanditaires de l'infrastructure de Rust


Nous remercions les deux nouveaux sponsors de l'infrastructure Rust qui ont fourni les ressources nécessaires à la construction de Rust 1.37.0: Amazon Web Services (AWS) et Microsoft Azure:


  • AWS a fourni l'hébergement des artefacts de version (compilateurs, bibliothèques, outils et code source), a accordé l'accès à ces artefacts aux utilisateurs via CloudFront, a empêché les régressions EC2 de Crater et a géré une autre infrastructure liée à Rust hébergée sur AWS.
  • Pour les tests extrêmement exigeants du référentiel rust-lang / rust, Microsoft Azure a fourni des constructeurs.

Des traducteurs


Pour toute question sur la langue rouille, ils pourront vous aider dans le chat Telegram en russe ou dans un chat similaire pour les nouveaux arrivants .


Cet article a été traduit conjointement par andreevlex , ozkriff , funkill et Gymmasssorla .

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


All Articles