La version 1.89 du langage de programmation Rust a été publiée, initialement développée par Mozilla, mais désormais maintenue par l'organisation à but non lucratif Rust Foundation. Ce langage se concentre sur une gestion sécurisée de la mémoire et fournit des outils pour atteindre un haut degré de parallélisme dans l'exécution des tâches, tout en évitant l'utilisation d'un ramasse-miettes et d'un runtime (le runtime se limite à une initialisation de base et à l'accompagnement de la bibliothèque standard).
Les méthodes de gestion de la mémoire en Rust éliminent les erreurs lors de la manipulation des pointeurs et protègent contre les problèmes liés à la gestion bas niveau de la mémoire, tels que l'accès à une zone mémoire après sa libération, la déréférence de pointeurs nuls, le dépassement de tampon, etc. Pour faciliter la diffusion des bibliothèques, assurer la compilation et gérer les dépendances, un gestionnaire de paquets nommé Cargo est en développement. Un dépôt pour le déploiement des bibliothèques, crates.io, est également supporté.
La sécurité de la mémoire dans Rust est assurée au moment de la compilation grâce à la vérification des références, au suivi de la propriété des objets, à la prise en compte de la durée de vie des objets (portée) et à l'évaluation de l'accès mémoire pendant l'exécution du code. Rust offre également des outils pour se protéger contre les débordements d'entiers, exige l'initialisation obligatoire des valeurs des variables avant leur utilisation, gère mieux les erreurs dans la bibliothèque standard, applique le concept d'immuabilité (immutable) pour les références et les variables par défaut, et propose une forte typage statique pour minimiser les erreurs logiques.
Les principales nouveautés :
- Il est désormais possible d'utiliser le caractère « _ » comme argument de paramètres génériques avec l'indicateur « const » pour déduire les valeurs de ces paramètres en fonction du contexte environnant. pub fn all_false<const LEN: usize>() -> [bool; LEN] { [false; _] }
- Un nouvel avertissement lint « mismatched_lifetime_syntaxes » a été ajouté pour résoudre le problème de la définition peu claire des durées de vie dans les signatures de fonctions lors de l'utilisation du mécanisme « lifetime elision » (qui détermine automatiquement la durée de vie des références, permettant d'éviter de spécifier cela manuellement). Cet avertissement vérifie que les paramètres d'entrée et de sortie d'une fonction appartiennent au même groupe de types. Les groupes sont formés en fonction de la prise en charge de la spécification explicite de la durée de vie et de la capacité du compilateur à inférer automatiquement cette durée (par exemple, dans les types « &’a T » et « ContainsLifetime<‘a> » une durée de vie peut être explicitement présente, mais le compilateur ne peut pas déterminer cette durée de vie automatiquement, alors que pour les types « &T », « &’_ T » et « ContainsLifetime<‘_> » une spécification explicite et une inférence automatique sont toutes deux autorisées).
- Dans l'attribut « target_feature » pour les systèmes x86, la possibilité de vérifier le support des ensembles d'instructions avancés sha512, sm3, sm4, kl et widekl, ainsi que certaines fonctions avx512, a été implémentée. #[target_feature(enable = «avx512bw»)] pub fn cool_simd_code(.. *) -> … * { … * }
- Il est désormais possible d'exécuter des doctests (tests intégrés dans la documentation) non seulement pour la plateforme cible actuelle, mais aussi pour d'autres plateformes spécifiées lors du lancement du gestionnaire de paquets « cargo » (« cargo test —doc —target other_target »).
- Pour les fonctions ‘extern «C»‘ lors de la compilation pour la plateforme cible « wasm32-unknown-unknown », l'ABI C standard pour WebAssembly a été mis en œuvre.
- Sous certaines réserves concernant la compatibilité des types, l'utilisation des types i128 et u128 est autorisée dans les fonctions externes C (extern «C»), pour lesquelles un avertissement lint «improper_ctypes_definitions» avait été précédemment montré.
- Une nouvelle série d'API a été stabilisée dans la catégorie des API stables, notamment des méthodes et des implémentations de traits stabilisées :
- De nombreuses fonctions intriquées intégrées dans le compilateur pour les processeurs x86, y compris celles pour AVX512, SHA512, SM3 et SM4.
- NonZero
- File::lock
- File::lock_shared
- File::try_lock
- File::try_lock_shared
- File::unlock
- NonNull::from_ref
- NonNull::from_mut
- NonNull::without_provenance
- NonNull::with_exposed_provenance
- NonNull::expose_provenance
- OsString::leak
- PathBuf::leak
- Result::flatten
- std::os::linux::net::TcpStreamExt::quickack
- std::os::linux::net::TcpStreamExt::set_quickack
L'attribut «const» est appliqué dans les fonctions :
- ::as_mut_slice
- ::eq_ignore_ascii_case
- str::eq_ignore_ascii_case
- Le processus de transition de la plateforme cible «x86_64-apple-darwin» est passé du premier niveau de support au second (Apple prévoit de mettre fin au support de l'architecture x86_64). Le premier niveau de support implique la génération de binaires, la réalisation de tests approfondis et la fourniture de la plus haute garantie de support de la plateforme : chaque changement dans le compilateur est vérifié par l'exécution de l'ensemble complet de tests. Le second niveau de support implique une garantie de construction, mais aucune garantie lors de l'exécution de l'ensemble de tests.
- Un troisième niveau de support pour les plateformes «loongarch32-unknown-none» et «loongarch32-unknown-none-softfloat» a été mis en œuvre. Le troisième niveau implique un support de base, mais sans tests automatisés, publication de builds officiels et vérification de la possibilité de construction du code.
Il convient également de noter les événements et projets liés à Rust :
- Un rapport sur l'état des paquets Rust dans Debian a été publié. Il est noté qu'environ 8 % des paquets source dans la branche Debian Unstable (Sid) sont liés par des dépendances de construction à au moins un paquet «librust-*». Dans Debian 12, ce chiffre était de 4,5 %. Il est également noté que plus de 3 000 paquets incluent du code Rust, distribué sous forme de paquets librust-..-dev, tandis que 150 paquets source fournissent des fichiers exécutables ou des bibliothèques Rust compilés.
Parmi les paquets d'intérêt pour Debian, on mentionne sudo-rs, ntpd-rs, uutils, Sequoia, rpgp, hickory (DNS), Rustls, rav1d et fish. Le support optionnel de Rust a été implémenté dans APT, QEMU (virtiofsd), le noyau Linux et Mesa, et est attendu dans LibreOffice. Des outils comme debcargo ont été mis en place pour convertir les paquets crate en paquets source Debian.
- Le projet tmux-rs a été présenté, développant un clone du multiplexeur de terminal tmux, réécrit de C en Rust.
- Le développeur du pilote Tyr de la société Collabora a publié un article sur les dispositifs fonctionnant au niveau du noyau des pilotes pour GPU et sur les principes de développement de tels pilotes en langage Rust.
- Une application universelle écrite en Rust a été démontrée, capable de s'exécuter à la fois sur CPU et sur diverses plateformes GPU : CUDA pour NVIDIA, SPIR-V pour les GPU prenant en charge Vulkan, Metal pour Apple, DirectX 12 pour Windows, WebGPU pour les navigateurs.
Source : opennet.ru
