Rappelons que Rust est un langage de programmation compilé multiparadigme, conçu par Graydon Hore alors employé chez Mozilla Research, avec la contribution du créateur de JavaScript Brendan Eich. Utilisé par plusieurs grandes entreprises et par de nombreux développeurs dans le monde, Rust est devenu le langage de base pour certaines des fonctionnalités fondamentales du navigateur Firefox et de son moteur Gecko, ainsi que pour le moteur Servo de Mozilla.
Notons également qu’en début d’année dernière, AWS, Huawei, Google, Microsoft et Mozilla se sont associés pour lancer la fondation Rust et se sont engagés à lui consacrer un budget de deux ans à hauteur d'un million de dollars. Ce budget permettra au projet de développer des services, des programmes et des événements qui aideront les responsables du projet Rust à développer le meilleur Rust possible.
L'annonce a été faite par Ashley Williams, Directeur exécutif par intérim de la fondation, le 8 février sur le site Internet de l'organisation. « Aujourd'hui, au nom de l'équipe de Rust, je suis heureux d'annoncer la création de la Fondation Rust, une nouvelle organisation indépendante à but non lucratif chargée de gérer le langage de programmation et l'écosystème Rust, en mettant l'accent sur le soutien de l'ensemble des responsables qui régissent et développent le projet ».
Outre l'arrivée de nouveaux talents dans son équipe Rust, Facebook a également annoncé qu'elle rejoignait officiellement la Fondation Rust. « Facebook Open Source est heureux d'annoncer son soutien à la fondation Rust en qualité de membre important. Aux côtés des autres membres de la fondation, Facebook s'engage à soutenir et à faire croître l'écosystème et la communauté open source Rust », a indiqué Facebook sur son blog.
Faisant référence à un cours récemment publié par Microsoft sur les premiers pas avec Rust, Miguel de Icaza, ingénieur distingué de Microsoft a tweeté : « le Rustening a commencé chez Microsoft ». Ce que la plupart des adeptes de Rust sur Twitter voient comme un signe que l'entreprise augmente encore ses faveurs pour son langage de prédilection. Bien sûr, ce n'est pas la première fois que Microsoft se tourne vers Rust pour gérer les 70 % de vulnérabilités de Microsoft qui, selon l'entreprise, proviennent de l'utilisation du langage de programmation C++, peu sûr pour la mémoire, dans ses logiciels.
Contrôle du code à la source
Le support de l'instrumentation de couverture basée sur LLVM a été stabilisé dans rustc. Vous pouvez l'essayer sur votre code en reconstruisant votre code avec -Cinstrument-coverage, par exemple comme ceci :
RUSTFLAGS="-C instrument-coverage" cargo build
Après cela, il est possible d'exécuter le binaire résultant, qui produira un fichier default.profraw dans le répertoire courant. (Le chemin et le nom de fichier peuvent être remplacés par une variable d'environnement ; voir la documentation pour plus de détails). Le composant llvm-tools-preview comprend llvm-profdata pour le traitement et la fusion de la sortie brute du profil (comptes d'exécution des régions de couverture) ; et llvm-cov pour la génération de rapports. llvm-cov combine la sortie traitée, provenant de llvm-profdata, et le binaire lui-même, parce que le binaire incorpore un mappage des compteurs aux régions réelles du code source.
Code : | Sélectionner tout |
1 2 3 4 5 6 | rustup component add llvm-tools-preview $(rustc --print sysroot)/lib/rustlib/x86_64-unknown-linux-gnu/bin/llvm-profdata merge -sparse default.profraw -o default.profdata $(rustc --print sysroot)/lib/rustlib/x86_64-unknown-linux-gnu/bin/llvm-cov show -Xdemangler=rustfilt target/debug/coverage-testing \ -instr-profile=default.profdata \ -show-line-counts-or-regions \ -show-instantiations |
Les commandes ci-dessus sur un simple binaire helloworld produisent ce rapport annoté, montrant que chaque ligne de l'entrée a été couverte.
Code : | Sélectionner tout |
1 2 3 4 | 1| 1|fn main() { 2| 1| println!("Hello, world!"); 3| 1|} |
cargo –timings
Cargo a stabilisé la prise en charge de la collecte d'informations sur la construction avec l'indicateur --timings.
Code : | Sélectionner tout |
1 2 3 4 | $ cargo build --timings Compiling hello-world v0.1.0 (hello-world) Timing report saved to target/cargo-timings/cargo-timing-20220318T174818Z.html Finished dev [unoptimized + debuginfo] target(s) in 0.98s |
Le rapport est également copié dans target/cargo-timings/cargo-timing.html. Un rapport sur la version de Cargo a été mis en ligne ici. Ces rapports peuvent être utiles pour améliorer les performances de construction. Plus d'informations sur les rapports de timing peuvent être trouvées dans la documentation.
Nouvelle syntaxe pour les fonctionnalités de Cargo
Cette version introduit deux nouveaux changements pour améliorer la prise en charge des fonctionnalités de Cargo et leur interaction avec les dépendances optionnelles : Les dépendances à espacement de noms et les fonctionnalités de dépendance faible.
Cargo supporte depuis longtemps les fonctionnalités avec des dépendances optionnelles, comme l'illustre l'extrait ci-dessous.
Code : | Sélectionner tout |
1 2 3 4 5 6 | [dependencies] jpeg-decoder = { version = "0.1.20", default-features = false, optional = true } [features] # Enables parallel processing support by enabling the "rayon" feature of jpeg-decoder. parallel = ["jpeg-decoder/rayon"] |
- la syntaxe jpeg-decoder/rayon active la dépendance jpeg-decoder et active la fonctionnalité rayon de la dépendance jpeg-decoder ;
- la dépendance facultative jpeg-decoder définit implicitement une fonctionnalité du même nom. L'activation de la fonctionnalité jpeg-decoder activera la dépendance jpeg-decoder.
Code : | Sélectionner tout |
1 2 3 4 5 6 | [dependencies] serde = { version = "1.0.133", optional = true } rgb = { version = "0.8.25", optional = true } [features] serde = ["dep:serde", "rgb?/serde"] |
Les fonctionnalités à espacement de noms permettent de résoudre le premier problème. Vous pouvez maintenant utiliser le préfixe dep : dans la table [features] pour faire explicitement référence à une dépendance optionnelle sans l'exposer implicitement comme une fonctionnalité. Cela vous donne plus de contrôle sur la façon de définir la fonctionnalité correspondant à la dépendance optionnelle, y compris en cachant les dépendances optionnelles derrière des noms de fonctionnalités plus descriptifs.
Les fonctionnalités de dépendance faible traitent le deuxième problème où la syntaxe optional-dependency/feature-name activerait toujours la dépendance optionnelle. Cependant, il arrive souvent que vous souhaitiez activer la fonctionnalité sur la dépendance optionnelle uniquement si une autre fonctionnalité a activé la dépendance optionnelle. À partir de la version 1.60, il est possible d'ajouter un "?" comme dans package-name?/feature-name qui n'activera la fonctionnalité donnée que si une autre fonctionnalité a activé la dépendance optionnelle. Par exemple, disons que nous avons ajouté un support de sérialisation à notre bibliothèque, et que cela nécessite d'activer une fonctionnalité correspondante dans certaines dépendances optionnelles. Cela peut être fait comme suit :
Dans cet exemple, l'activation de la fonctionnalité serde activera la dépendance serde. Elle activera également la fonctionnalité serde pour la dépendance rgb, mais seulement si quelque chose d'autre a activé la dépendance rgb.
Statut de la compilation incrémentale
La compilation incrémentale est réactivée pour la version 1.60. L'équipe Rust continue de travailler à la correction des bogues dans la compilation incrémentale, mais aucun problème entraînant une rupture généralisée n'est connu à l'heure actuelle, nous avons donc choisi de réactiver la compilation incrémentale. De plus, l'équipe du compilateur continue à travailler sur une stratégie à long terme pour éviter de futurs problèmes de ce type. Ce processus n'en est qu'à ses débuts, nous n'avons donc rien à partager à ce sujet. Cette version réactive la compilation incrémentale, à moins que l'utilisateur ne l'ait explicitement choisie via la nouvelle variable d'environnement RUSTC_FORCE_INCREMENTAL=1
Garanties instantanées de monotonicité
Sur toutes les platesformes, Instant essaiera d'utiliser une API de système d'exploitation qui garantit un comportement monotone si celui-ci est disponible (ce qui est le cas sur toutes les plates-formes de niveau 1).
En pratique, de telles garanties sont - dans de rares circonstances - brisées par des bogues du matériel, de la virtualisation ou du système d'exploitation. Pour contourner ces bogues et les plateformes n'offrant pas d'horloges monotones, Instant::duration_since, Instant::elapsed et Instant::sub saturent maintenant à zéro. Dans les anciennes versions de Rust, cela conduisait plutôt à une panique. Instant::checked_duration_since peut être utilisé pour détecter et gérer les situations où la monotonicité est violée, ou les Instants sont soustraits dans le mauvais ordre.
Cette solution de contournement masque les erreurs de programmation où les instants précédents et suivants sont accidentellement échangés. Pour cette raison, les futures versions de Rust pourront réintroduire les paniques au moins dans ces cas, si cela est possible et efficace.
Avant la version 1.60, les garanties de monotonicité étaient fournies par des mutex ou des atomics dans std, ce qui peut introduire d'importantes surcharges de performance à Instant::now(). De plus, le comportement de panique signifiait que le logiciel Rust pouvait paniquer dans un sous-ensemble d'environnements, ce qui était largement indésirable, car les auteurs de ce logiciel pouvaient ne pas être en mesure de réparer ou de mettre à niveau le système d'exploitation, le matériel ou le système de virtualisation sur lequel ils s'exécutent. De plus, l'introduction de paniques inattendues dans ces environnements rendait le logiciel Rust moins fiable et portable, ce qui est plus préoccupant que d'exposer aux utilisateurs finaux des bogues de plateforme généralement inintéressants dans la gestion des horloges monotones.
API stabilisées
Les méthodes et implémentations de traits suivantes sont maintenant stabilisées :
- i8::abs_diff
- u8::abs_diff
- i16::abs_diff
- i32::abs_diff
- i64::abs_diff
- u16::abs_diff
- u32::abs_diff
- u64::abs_diff
- Rc::new_cyclic
- i128::abs_diff
- u128::abs_diff
- usize::abs_diff
- isize::abs_diff
- u8::escape_ascii
- slice::EscapeAscii
- <[u8]>::escape_ascii
- From<u8> for ExitCode
- Vec::spare_capacity_mut
- Not for ! (the "never" type)
- Display for io::ErrorKind
- MaybeUninit::assume_init_drop
- MaybeUninit::assume_init_read
- arch::is_aarch64_feature_detected!
- _Op_Assign<$t> for Wrapping<$t>
Rust est l’un des langages de programmation les plus appréciés et dont la croissance est la plus rapide à l'heure actuelle. Avec la version précédente de Rust installée via rustup, il est possible d’obtenir la 1.60.0 avec :
$ rustup update stable
Source : Rust
Et vous ?
Quel est votre avis sur le sujet ?
Voir aussi :
Facebook rejoint AWS, Huawei, Google, Microsoft et Mozilla dans la Fondation Rust et renforce son équipe Rust par des nouveaux talents
Microsoft annonce Rust preview pour Windows, alors que la comparaison entre Rust et C++ reste un sujet d'actualité
Microsoft, Google, AWS, Huawei et Mozilla s'associent pour créer la Fondation Rust, une organisation à but non lucratif chargée de gérer le langage de programmation
Rust 1.53.0 est disponible et s'accompagne de IntoIterator pour les tableaux, Cargo prend désormais en charge les référentiels git où la branche HEAD par défaut n'est pas "master"