Rust 1.50.0 est disponible et s'accompagne de l'indexation de tableau générique Const,
ainsi que des affectations sécurisées aux champs d'union ManuallyDrop<T>

Rust est un langage de programmation open source, dont le code source est disponible sur GitHub, ses domaines de prédilection étant la programmation système, les applications en ligne de commande, les applications Web via WebAssembly, les services réseaux et les systèmes embarqués. Le langage est également apprécié par sa communauté pour les raisons suivantes :
  • performance : Rust est un langage rapide et économique en mémoire, sans environnement d'exécution, ni récupérateur mémoire, il peut dynamiser des services à hautes performances, s'exécuter dans des systèmes embarqués, et s'intégrer facilement à d'autres langages ;
  • fiabilité : le système de typage et le modèle d’ownership de Rust garantissent la sécurité mémoire ainsi que la sécurité des threads. Il permet d'éliminer de nombreuses variétés de bugs dès la compilation ;
  • productivité : Rust dispose d'une excellente documentation, d'un compilateur bienveillant, avec des messages d'erreur utiles. Le langage a également un gestionnaire de paquet et de compilation intégré, divers éditeurs intelligents avec autocomplétions et analyse de type. Il dispose également d’un outil de mise en forme automatique.

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.

Les responsables de son développement ont annoncé la disponibilité de Rust, 1.50.0. Passons en revue quelques nouveautés et améliorations.

Indexation de tableau générique Const

Poursuivant la marche vers des génériques const stables, cette version ajoute des implémentations de ops::Index et IndexMut pour les tableaux [T; N] pour n'importe quelle longueur de const N. L'opérateur d'indexation [] a déjà travaillé sur les tableaux grâce à la magie du compilateur intégré, mais au niveau du type, les tableaux n'ont pas implémenté les caractéristiques de la bibliothèque jusqu'à présent.

Code Rust : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
fn second<C>(container: &C) -> &C::Output
where
    C: std::ops::Index<usize> + ?Sized,
{
    &container[1]
}
 
fn main() {
    let array: [i32; 3] = [1, 2, 3];
    assert_eq!(second(&array[..]), &2); // slices worked before
    assert_eq!(second(&array), &2); // now it also works directly
}

Nom : rust.png
Affichages : 19709
Taille : 55,8 Ko

répétition de la valeur const pour les tableaux

Les tableaux dans Rust peuvent être écrits sous forme de liste [a, b, c] ou de répétition [x; N]. Pour les longueurs N supérieures à un, la répétition n'a été autorisée que pour les x qui sont Copy, et la RFC 2203 a cherché à y autoriser toute expression const. Cependant, alors que cette fonctionnalité était instable pour les expressions arbitraires, son implémentation depuis Rust 1.38 permettait accidentellement une utilisation stable des valeurs const dans la répétition de tableau.

Code Rust : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
fn main() {
    // This is not allowed, because `Option<Vec<i32>>` does not implement `Copy`.
    let array: [Option<Vec<i32>>; 10] = [None; 10];
 
    const NONE: Option<Vec<i32>> = None;
    const EMPTY: Option<Vec<i32>> = Some(Vec::new());
 
    // However, repeating a `const` value is allowed!
    let nones = [NONE; 10];
    let empties = [EMPTY; 10];
}

Dans Rust 1.50, cette stabilisation est officiellement reconnue. À l'avenir, pour éviter de telles constantes nommées « temporaires », vous pouvez vous attendre à des expressions const inline selon la RFC 2920.

Affectations sécurisées aux champs d'union ManuallyDrop<T>

Rust 1.49 a permis d'ajouter des champs ManuallyDrop<T> à union pour permettre des Drop pour les union. Cependant, les unions ne suppriment pas les anciennes valeurs lorsqu'un champ est assigné, car elles ne savent pas quelle variante était auparavant valide, donc Rust limitait auparavant cela aux types de Copy uniquement, qui ne sont jamais Drop. Bien sûr, ManuallyDrop<T> n'a pas non plus besoin de Drop, donc maintenant Rust 1.50 permet également des affectations sûres à ces champs.

Une niche pour File sur les plateformes Unix

Certains types dans Rust ont des limitations spécifiques sur ce qui est considéré comme une valeur valide, qui peut ne pas couvrir toute la plage des valeurs de mémoire possibles. L'équipe appelle toute valeur non valide restante une niche, et cet espace peut être utilisé pour les optimisations de mise en page de type. Par exemple, dans Rust 1.28, l'équipe a introduit des types entiers NonZero (comme NonZeroU8) où 0 est une niche, et cela a permis à Option<NonZero> d'utiliser 0 pour représenter None sans mémoire supplémentaire.

Sur les plateformes Unix, File de Rust est simplement constitué du descripteur de fichier entier du système, et il s'agit là d'une niche possible car il ne peut jamais être -1! Les appels système qui renvoient un descripteur de fichier utilisent -1 pour indiquer qu'une erreur s'est produite, donc il n'est pas possible que -1 soit un vrai descripteur de fichier. À partir de Rust 1.50, ce créneau est ajouté à la définition du type afin qu'il puisse également être utilisé dans les optimisations de mise en page. Il s'ensuit que [C]Option<File>[/B] aura désormais la même taille que File lui-même!

Modifications au niveau de la bibliothèque

Dans Rust 1.50.0, il existe neuf nouvelles fonctions stables:
  • bool::then
  • btree_map::Entry::or_insert_with_key
  • f32::clamp
  • f64::clamp
  • hash_map::Entry::or_insert_with_key
  • Ord::clamp
  • RefCell::take
  • slice::fill
  • UnsafeCell::get_mut

AWS, Huawei, Google, Microsoft et Mozilla s’associent pour lancer la fondation Rust et s'engagent à 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, ce 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 ».

Pour Ashley Williams, Rust est un langage qui donne du pouvoir à tout le monde, mais surtout aux gens qui pensent que la programmation système n'est pas pour eux. « L'une des forces motrices les plus puissantes du projet Rust est la croyance simultanée dans le pouvoir de la programmation système et l'engagement à faire en sorte que ce pouvoir soit utilisable par tous », a-t-il déclaré lors de son discours d’ouverture de la RustConf 2020.

La fondation a pour objectif de fournir une orientation au langage Rust. Comme exemple, le nouveau conseil d'administration de Rust comprendra cinq directeurs issus des cinq membres fondateurs (AWS, Huawei, Google, Microsoft et Mozilla), ainsi que cinq directeurs issus de la direction du projet.

« Mozilla a incubé Rust pour mieux développer Firefox et contribuer à un meilleur Internet », écrit Bobby Holley, membre du conseil d'administration de la fondation Mozilla et Rust, dans une déclaration. « Avec cette nouvelle fondation, Rust aura la possibilité de se développer, tout en continuant à amplifier certaines des valeurs fondamentales que Mozilla partage avec la communauté Rust ».

Source : Rust

Voir aussi :

Évolution de l'écosystème Rust en 2020 : Rust continue de faire des percées en tant que langage utilisé pour la production. Les développeurs réclament une plus grande interopérabilité avec C++
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.49.0 est disponible avec l'amélioration des supports de Linux ARM 64 bits, MacOS et Windows ARM 64 bits