È stato pubblicato il rilascio del linguaggio di programmazione Rust 1.89, originariamente sviluppato dal progetto Mozilla e ora supportato da un'organizzazione indipendente e senza scopo di lucro, la Rust Foundation. Il linguaggio è focalizzato sulla gestione sicura della memoria e offre strumenti per raggiungere un elevato parallelismo nell'esecuzione delle operazioni, senza utilizzare un garbage collector e un runtime (il runtime è limitato all'inizializzazione di base e alla gestione della libreria standard).
I metodi di gestione della memoria in Rust liberano gli sviluppatori dagli errori di manipolazione dei puntatori e li proteggono da problemi derivanti da operazioni a basso livello con la memoria, come l'accesso a aree di memoria dopo il loro rilascio, la dereferenziazione di puntatori nulli, l'uscita dai limiti del buffer, ecc. Per la distribuzione delle librerie, l'assicurazione della compilazione e la gestione delle dipendenze, il progetto promuove il gestore di pacchetti Cargo. È supportato un repository per l'hosting delle librerie su crates.io.
La gestione sicura della memoria in Rust è garantita durante la compilazione attraverso il controllo dei riferimenti, il tracciamento della proprietà degli oggetti, la considerazione del tempo di vita degli oggetti (ambiti di visibilità) e la valutazione della correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust fornisce anche strumenti per proteggere da overflow interi, richiede l'inizializzazione obbligatoria delle variabili prima dell'uso, gestisce meglio gli errori nella libreria standard, applica il concetto di riferimenti e variabili immutabili per impostazione predefinita e offre una forte tipizzazione statica per minimizzare gli errori logici.
Novità principali:
- È stata fornita la possibilità di utilizzare il simbolo «_» come argomento per parametri generici contrassegnati come «const» per dedurre i valori di questi parametri in base al contesto circostante. pub fn all_false<const LEN: usize>() -> [bool; LEN] { [false; _] }
- È stato aggiunto un nuovo avviso lint «mismatched_lifetime_syntaxes» per risolvere il problema della definizione non chiara delle durate di vita nelle firme delle funzioni quando si utilizza il meccanismo di «lifetime elision» (che determina automaticamente le durate di vita dei riferimenti, consentendo di evitarne l'indicazione manuale). L'avviso verifica che i parametri di input e output di una funzione appartengano al medesimo gruppo di tipi. I gruppi sono formati sulla base del supporto per la definizione esplicita delle durate di vita e la possibilità di inferirle automaticamente dal compilatore (ad esempio, nei tipi «&’a T» e «ContainsLifetime<‘a>» la durata di vita può essere esplicitamente presente, ma il compilatore non può inferirla automaticamente, mentre nei tipi «&T», «&’_ T» e «ContainsLifetime<‘_>» è consentita sia la definizione esplicita che l'inferenza automatica).
- Nell'attributo «target_feature» per i sistemi x86 è stata implementata la possibilità di verificare il supporto per i set di istruzioni avanzate sha512, sm3, sm4, kl e widekl, oltre a funzioni specifiche avx512. #[target_feature(enable = «avx512bw»)] pub fn cool_simd_code(b7 .. b7) -> b7b7b7 { b7b7b7 }
- È stato garantito l'esecuzione del doctest (test incorporati nella documentazione) non solo per la piattaforma bersaglio attuale, ma anche per altre piattaforme specificate all'avvio del gestore pacchetti «cargo» («cargo test —doc —target other_target»).
- Per le funzioni ‘extern «C»‘ durante la compilazione per la piattaforma bersaglio «wasm32-unknown-unknown» è stato implementato il C ABI standard per WebAssembly.
- Con alcune riserve riguardanti la compatibilità dei tipi, è consentito l'uso dei tipi i128 e u128 nelle funzioni C esterne (extern "C"), per le quali era stata precedentemente mostrata l'avvertenza lint "improper_ctypes_definitions".
- Una nuova serie di API è stata trasformata in versioni stabili, inclusi i metodi stabilizzati e le implementazioni delle trait:
- Molte funzioni incorporate nel compilatore (Intrinsics) per processori x86, comprese le funzioni per AVX512, SHA512, SM3 e 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
Il segnale «const» è stato applicato nelle funzioni:
- ::as_mut_slice
- ::eq_ignore_ascii_case
- str::eq_ignore_ascii_case
- È iniziato il processo di traduzione della piattaforma target "x86_64-apple-darwin" dal primo livello di supporto al secondo (Apple pianifica di interrompere il supporto per l'architettura x86_64). Il primo livello di supporto implica la creazione di build binarie, un test approfondito e la massima garanzia di supporto della piattaforma: ogni modifica nel compilatore viene verificata mediante l'esecuzione dell'intero set di test. Il secondo livello di supporto implica la garanzia di compilazione, ma senza garanzie in merito al superamento del set di test.
- È stato implementato un terzo livello di supporto per le piattaforme "loongarch32-unknown-none" e "loongarch32-unknown-none-softfloat". Il terzo livello implica supporto di base, ma senza test automatizzati, pubblicazione di build ufficiali e verifica della possibilità di compilare codice.
In aggiunta, si possono notare eventi e progetti correlati a Rust:
- È stato pubblicato un rapporto sullo stato dei pacchetti Rust in Debian. Si segnala che nel ramo Debian Unstable (Sid) circa l'8% dei pacchetti src nel repository principale è collegato a dipendenze di build con almeno un pacchetto "librust-*". In Debian 12, erano presenti il 4,5% di tali pacchetti. Si nota inoltre che oltre 3.000 pacchetti includono codice in Rust, estratto nei pacchetti librust-..-dev, mentre 150 pacchetti src forniscono file eseguibili o librerie Rust compilati.
Tra i pacchetti di interesse per Debian, sono stati menzionati sudo-rs, ntpd-rs, uutils, Sequoia, rpgp, hickory (DNS), Rustls, rav1d e fish. Il supporto Rust opzionale è stato implementato in APT, QEMU (virtiofsd), nel kernel Linux e in Mesa, ed è previsto anche in LibreOffice. È stato sviluppato uno strumento debcargo per convertire i pacchetti crate in pacchetti src Debian.
- È stato presentato il progetto tmux-rs, che sviluppa un clone del multiplexor di terminale tmux (gestore di finestre console), riscritto da C a Rust.
- Lo sviluppatore del driver Tyr dell'azienda Collabora ha pubblicato un articolo sui dispositivi che lavorano a livello kernel dei driver per GPU e sui principi di sviluppo di tali driver in Rust.
- È stata dimostrata un'applicazione universale in Rust, in grado di funzionare sia su CPU che su diverse piattaforme GPU: CUDA per NVIDIA, SPIR-V per GPU che supportano Vulkan, Metal per Apple, DirectX 12 per Windows e WebGPU per i browser.
Fonte: opennet.ru
