È stato rilasciato il linguaggio di programmazione Rust 1.89, originariamente sviluppato da Mozilla, ma ora mantenuto da un'organizzazione no-profit indipendente, la Rust Foundation. Questo linguaggio si concentra sulla gestione sicura della memoria e offre strumenti per raggiungere un alto parallelismo nell'esecuzione delle attività, evitando l'uso di garbage collector e runtime (il runtime si limita a una semplice inizializzazione e manutenzione della libreria standard).
I metodi di gestione della memoria in Rust liberano gli sviluppatori dagli errori nella manipolazione dei puntatori e li proteggono da problematiche derivanti dal lavoro a basso livello con la memoria, come l'accesso a zone di memoria dopo la loro liberazione, la dereferenziazione di puntatori nulli, il superamento dei limiti del buffer, e così via. Per la distribuzione delle librerie, la gestione della compilazione e delle dipendenze, si è sviluppato un gestore di pacchetti chiamato Cargo. Le librerie sono ospitate nel repository crates.io.
La gestione sicura della memoria in Rust è garantita durante la compilazione tramite il controllo dei riferimenti, il tracciamento della proprietà degli oggetti, la gestione della durata degli oggetti (scope) e la valutazione della correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust offre anche strumenti per proteggere da overflow interi, richiede l'inizializzazione obbligatoria dei valori 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 ridurre al minimo gli errori logici.
Novità principali:
- È stata introdotta la possibilità di utilizzare il simbolo «_» come argomento per i parametri generici con il modificatore «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 affrontare il problema della non chiara definizione delle durate di vita nelle firme delle funzioni quando si utilizza il meccanismo «lifetime elision» (che determina automaticamente la durata di vita dei riferimenti, consentendo di evitare la sua specificazione manuale). Questo avviso verifica che i parametri di input e output delle funzioni appartengano allo stesso gruppo di tipi. I gruppi vengono formati in base alla supporto di specificazione esplicita della durata di vita e alla possibilità di deduzione automatica della durata di vita da parte del compilatore (ad esempio, nei tipi «&’a T» e «ContainsLifetime<‘a>» può essere presente esplicitamente la durata di vita, ma il compilatore non può determinare automaticamente la durata di vita, mentre nei tipi «&T», «&’_ T» e «ContainsLifetime<‘_>» è consentita sia la specificazione esplicita che la deduzione automatica).
- Nell'attributo «target_feature» per i sistemi x86 è ora possibile controllare il supporto per set estesi di istruzioni sha512, sm3, sm4, kl e widekl, oltre a funzioni specifiche avx512. #[target_feature(enable = «avx512bw»)] pub fn cool_simd_code(/* .. */) -> /* … */ { /* … */ }
- È stato garantito l'esecuzione di doctest (test incorporati nella documentazione) non solo per la piattaforma target attuale, ma anche per altre piattaforme specificate al momento dell'esecuzione del gestore di pacchetti «cargo» («cargo test —doc —target other_target»).
- Per le funzioni ‘extern «C»‘ compile per la piattaforma target «wasm32-unknown-unknown» è stato implementato lo standard C ABI per WebAssembly.
- Con alcune avvertenze riguardanti la compatibilità dei tipi, è ora consentito utilizzare i tipi i128 e u128 nelle funzioni C esterne (extern «C»), per cui in precedenza era stato emesso un avviso lint «improper_ctypes_definitions».
- Una nuova serie di API è stata traslata nella categoria stabile, stabilizzando i metodi e le implementazioni dei tipi:
- Molte funzioni integrate nel compilatore (Intrinsics) per i processori x86, comprese le funzioni per AVX512, SHA512, SM3 e SM4.
- NonZero<char>
- 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 flag «const» è stato applicato nelle funzioni:
- <[T; N]>::as_mut_slice
- <[u8]>::eq_ignore_ascii_case
- str::eq_ignore_ascii_case
- È iniziato il processo di passaggio della piattaforma target «x86_64-apple-darwin» dal primo livello di supporto al secondo (Apple prevede di interrompere il supporto per l'architettura x86_64). Il primo livello di supporto implica la creazione di pacchetti binari, test approfonditi e la fornitura della massima garanzia di supporto della piattaforma: ogni modifica nel compilatore viene verificata eseguendo l'intero set di test. Il secondo livello di supporto garantisce la creazione, ma non offre garanzie per il passaggio del set di test.
- È stato implementato il terzo livello di supporto per le piattaforme «loongarch32-unknown-none» e «loongarch32-unknown-none-softfloat». Il terzo livello comporta un supporto di base, ma senza test automatizzati, pubblicazione di build ufficiali e verifica della possibilità di compilare codice.
Inoltre, sono stati segnalati eventi e progetti legati a Rust:
- È stato pubblicato un rapporto sullo stato dei pacchetti Rust in Debian. Si segnala che nella branca Debian Unstable (Sid) circa l'8% dei pacchetti src nel repository main è legato a dipendenze di build con almeno un pacchetto «librust-*». In Debian 12, percentuale è stata del 4.5%. Inoltre, più di 3.000 pacchetti includono codice Rust, suddiviso nei pacchetti librust-..-dev, e 150 pacchetti src forniscono file eseguibili o librerie Rust compilati.
Tra i pacchetti interessanti per Debian si segnalano sudo-rs, ntpd-rs, uutils, Sequoia, rpgp, hickory (DNS), Rustls, rav1d e fish. Il supporto opzionale per Rust è stato implementato in APT, QEMU (virtiofsd), nel kernel Linux e in Mesa, ed è atteso anche in LibreOffice. È stato sviluppato uno strumento debcargo per trasformare i pacchetti crate in pacchetti src per Debian.
- È stato presentato il progetto tmux-rs, che sviluppa un clone del multiplexore di terminale tmux (gestore di finestre della console), riscritto da C a Rust.
- Uno sviluppatore del driver Tyr di Collabora ha pubblicato un articolo sulle architetture progettate per driver che operano a livello di kernel per GPU e sui principi di sviluppo di tali driver in Rust.
- È stata dimostrata un'applicazione universale scritta in Rust, capace di funzionare sia su CPU che su diverse piattaforme GPU: CUDA per NVIDIA, SPIR-V per GPU compatibili con Vulkan, Metal per Apple, DirectX 12 per Windows e WebGPU per i browser.
Fonte: opennet.ru
