La sortie du langage de programmation polyvalent Rust 1.77, fondé par le projet Mozilla, mais maintenant développé sous les auspices de l'organisation indépendante à but non lucratif Rust Foundation, a été publiée. Le langage se concentre sur la sécurité de la mémoire et fournit les moyens d'atteindre un parallélisme élevé des tâches tout en évitant l'utilisation d'un ramasse-miettes et d'un temps d'exécution (le temps d'exécution est réduit à l'initialisation et à la maintenance de base de la bibliothèque standard).
Les méthodes de gestion de la mémoire de Rust évitent au développeur les erreurs lors de la manipulation des pointeurs et protègent contre les problèmes qui surviennent en raison de la gestion de la mémoire de bas niveau, comme l'accès à une zone mémoire après qu'elle a été libérée, le déréférencement des pointeurs nuls, les dépassements de mémoire tampon, etc. Pour distribuer les bibliothèques, fournir des builds et gérer les dépendances, le projet développe le gestionnaire de packages Cargo. Le référentiel crates.io est pris en charge pour l'hébergement de bibliothèques.
La sécurité de la mémoire est fournie dans Rust au moment de la compilation grâce à la vérification des références, au suivi de la propriété des objets, au suivi des durées de vie des objets (portées) et à l'évaluation de l'exactitude de l'accès à la mémoire pendant l'exécution du code. Rust fournit également une protection contre les débordements d'entiers, nécessite une initialisation obligatoire des valeurs de variables avant utilisation, gère mieux les erreurs dans la bibliothèque standard, applique le concept de références et de variables immuables par défaut, propose un typage statique fort pour minimiser les erreurs logiques.
Principales nouveautés :
- Ajout de la prise en charge des littéraux pour les chaînes C (c"text"), qui sont stockés en mémoire avec un caractère terminé par un caractère nul et sont associés au type "CStr". On s'attend à ce que la prise en charge des chaînes C simplifie l'écriture de code qui interagit avec les couches des langages de programmation qui utilisent des chaînes terminées par un caractère nul et permettra d'effectuer les vérifications nécessaires au stade de la compilation. const BONJOUR : &core::ffi::CStr = c"Bonjour tout le monde !";
- Dans les fonctions exécutées de manière asynchrone déclarées à l'aide de l'expression « async fn », l'utilisation de la récursivité est autorisée, c'est-à-dire de telles fonctions peuvent désormais s'appeler elles-mêmes. async fn fib(n: u32) -> u32 { match n { 0 | 1 => 1, _ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await } }
- La macro offset_of! a été stabilisée, permettant de déterminer le décalage en octets des champs des structures, énumérations, unions et tuples, par rapport au début du type. En pratique, une macro peut être utile dans les situations où vous devez travailler au niveau du décalage de champ en l'absence d'instance de ce type. En particulier, la fonctionnalité offset_of est nécessaire lors du développement de composants de bas niveau tels que des pilotes. utilisez std :: mem ; #[repr(C)] struct FieldStruct { premier : u8, deuxième : u16, troisième : u8 } assert_eq!(mem::offset_of!(FieldStruct, first), 0); assert_eq!(mem::offset_of!(FieldStruct, second), 2); assert_eq!(mem::offset_of!(FieldStruct, troisième), 4);
- Dans le gestionnaire de packages Cargo, dans les profils de version, le nettoyage des fichiers des données de débogage est activé par défaut (strip = « debuginfo »), sauf si le mode débogage est explicitement activé dans le profil Cargo, c'est-à-dire si paramètre debug = 0.
- L'option "-Zthir-unsafeck=on" est activée par défaut, fournissant une vérification non sécurisée pour le THIR (Typed High-Level Intermediate Representation).
- Ajout d'une vérification des charpies pour static_mut_refs afin d'afficher un avertissement lors de l'utilisation de références à des valeurs statiques mutables.
- La possibilité d'utiliser le type « From<&[T; » a été implémentée. N]>" pour le type "Vache<[T]>". fn foo (données : impl dans >) { /* … */ } fn main() { foo(&[« bonjour », « monde »]); }
- Le compilateur assure l'alignement des types i16 et u128 128 octets pour les systèmes x86.
- Une nouvelle partie de l'API a été déplacée vers la catégorie stable, dont les méthodes et les implémentations des traits ont été stabilisées :
- tableau :: chaque_ref
- tableau :: chaque_mut
- noyau :: net
- f32::round_ties_even
- f64::round_ties_even
- mem::offset_of!
- tranche ::first_chunk
- slice::first_chunk_mut
- tranche :: split_first_chunk
- tranche :: split_first_chunk_mut
- tranche::last_chunk
- slice::last_chunk_mut
- tranche :: split_last_chunk
- tranche :: split_last_chunk_mut
- tranche ::chunk_by
- tranche ::chunk_by_mut
- Lié ::carte
- Fichier ::create_new
- Mutex ::clear_poison
- RwLock ::clear_poison
- Le troisième niveau de support a été implémenté pour les plateformes aarch64-unknown-illumos, hexagon-unknown-none-elf, riscv32imafc-esp-espidf et riscv32im-risc0-zkvm-elf. Le troisième niveau implique un support de base, mais sans tests automatisés, sans publication de versions officielles ni vérification si le code peut être construit.
Source: opennet.ru
