Rust 1.25 met à niveau son LLVM vers LLVM 6, ajoute la prise en charge des groupes d'importation imbriqués dans les instructions use
, l'alignement personnalisé de struct
et les stabilisations de bibliothèque. Cette dernière version de Rust n'inclut cependant pas les fonctionnalités très attendues telles que impl Trait
, la prise en charge stable SIMD et les entiers 128 bits.
La mise à jour de LLVM 6 est motivée par un certain nombre d'avantages, tels que des corrections de bugs, y compris les erreurs de compilation liées à SIMD, mais surtout par le fait qu'elle permet de suivre plus facilement le backend Wasm en amont de LLVM, ainsi de nouvelles fonctionnalités Wasm peuvent être prises en charge rapidement. Cela a une exception importante pour le backend JavaScript fonctionnant avec Emscripted, qui utilise une version verrouillée avec LLVM 4. Selon le développeur Steve Klabnik de Rust, LLVM 6 n'apporte pas nécessairement d'amélioration des performances dans le cas général, et cela dépendra du code exact, qu'il s'agisse d'une compilation plus rapide ou plus lente.
La nouvelle syntaxe de l'instruction use
permet aux développeurs de spécifier des groupes d'importation imbriqués, afin de rendre le code plus lisible et plus concis. Par exemple, l'ensemble d'importations suivant :
use std::fs::File;
use std::io::Read;
use std::path::{Path, PathBuf};
peut maintenant être écrit comme :
use std::{fs::File, io::Read, path::{Path, PathBuf}};
En outre, vous pouvez définir l'alignement des structs
Rust 1.25 en utilisant les annotations #[repr(align(x))]
:
struct Number(i32);
assert_eq!(std::mem::align_of::<Number>(), 4);
assert_eq!(std::mem::size_of::<Number>(), 4);
#[repr(align(16))]
struct Align16(i32);
assert_eq!(std::mem::align_of::<Align16>(), 16);
assert_eq!(std::mem::size_of::<Align16>(), 16);
Cette fonctionnalité peut être utile lors de l'utilisation de matériel avec des exigences d'alignement spécifiques, pour une meilleure interopérabilité avec le code C, comme par exemple pour faciliter le passage correct d'une structure qu'un code C s'attend à aligner d'une manière donnée et pour des cas avancés allouer des tables de pages dans le kernel.
Au niveau de la bibliothèque, le changement le plus significatif est l'introduction de std::ptr::NonNull
, qui est comme *mut T
mais avec la garantie d'être non nul et covariant. Son utilisation est surtout appropriée lors de la construction de structures de données avec un code unsafe.
Dans l'état actuel des choses, Rust 1.25 n'est pas la grosse version de Rust que de nombreux développeurs attendent, car elle n'inclut pas les fonctionnalités majeures sur lesquelles l'équipe Rust travaille depuis longtemps, y compris impl Trait
(ce qui devrait permettre d'améliorer les performances, simplifier la syntaxe et les diagnostics génériques), les entiers de 128 bits, le support de bibliothèque SIMD stable et autres. La bonne nouvelle, selon Klabnik, est qu'ils vont probablement atterrir dans les deux prochaines versions, 1.26 et 1.27.