È stato pubblicato il rilascio del linguaggio di programmazione general-purpose Rust 1.65, originariamente basato su un progetto di Mozilla, ma ora sviluppato sotto l'egida dell'organizzazione non profit indipendente Rust Foundation. Il linguaggio si concentra sulla gestione sicura della memoria e fornisce strumenti per raggiungere un alto parallelismo nell'esecuzione dei compiti, evitando l'uso di garbage collector e runtime (il runtime si limita a una base di inizializzazione e al supporto 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 aggiunta la supporto per i tipi associati generici (GAT, Generic Associated Types), che offrono la possibilità di creare alias di tipo associati a un altro tipo e consentono di legare i costruttori di tipo alle trait. trait Foo { type Bar; }
- È stata implementata l'espressione «let … else», che consente di controllare la corrispondenza di un pattern direttamente all'interno dell'espressione «let» ed eseguire codice arbitrario se il pattern non corrisponde. let Ok(count) = u64::from_str(count_str) else { panic!(«Impossibile analizzare l'intero: ‘{count_str}'»); };
- È consentito l'uso dell'espressione break per uscire anticipatamente dai blocchi nominati, utilizzando il nome del blocco (etichetta) per identificare il blocco da completare. let result = 'block: { do_thing(); if condition_not_met() { break 'block 1; } do_next_thing(); if condition_not_met() { break 'block 2; } do_last_thing(); 3 };
- Per Linux è stata aggiunta la possibilità di salvare separatamente le informazioni di debug (split-debuginfo), precedentemente disponibile solo per la piattaforma macOS. Specificando l'opzione '-Csplit-debuginfo=unpacked', i dati di debuginfo nel formato DWARF verranno salvati in diversi file oggetto separati con estensione '.dwo'. Specificando '-Csplit-debuginfo=packed' verrà creato un pacchetto nel formato '.dwp', contenente tutti i dati di debuginfo per il progetto. Per integrare il debuginfo direttamente nella sezione .debug_* degli oggetti ELF, si può utilizzare l'opzione '-Csplit-debuginfo=off'.
- Una nuova serie di API è stata traslata nella categoria stabile, stabilizzando i metodi e le implementazioni dei tipi:
- std::backtrace::Backtrace
- Bound::as_ref
- std::io::read_to_string
- ::cast_mut
- ::cast_const
- L'attributo 'const', che definisce la possibilità di utilizzo in qualsiasi contesto al posto delle costanti, è stato applicato nelle funzioni ::offset_from e ::offset_from
- Nella fase finale della traduzione del protocollo LSP (Language Server Protocol) per rust-analyzer, l'implementazione obsoleta di Rust Language Server (RLS) è stata sostituita da un server fittizio che genera un avviso con la proposta di utilizzare rust-analyzer.
- Durante la compilazione è stata attivata la supporto per l'inline deployment del codice intermedio MIR, che porta a un'accelerazione della compilazione dei pacchetti crate tipici del 3-10%.
- Per velocizzare le compilazioni pianificate, il gestore pacchetti Cargo ha implementato l'ordinamento dei lavori in attesa di esecuzione nella coda.
Inoltre, è interessante notare un’intervista sull'uso del linguaggio Rust in Volvo per lo sviluppo dei componenti dei sistemi informativi automobilistici. Non è prevista la riscrittura del codice già esistente e testato in Rust, ma per il nuovo codice Rust è una delle opzioni preferite per migliorare la qualità a costi inferiori. Gruppi di lavoro associati all'uso del linguaggio Rust sono stati creati anche nelle associazioni automobilistiche AUTOSAR (Automotive Open System Architecture) e SAE (Society of Automotive Engineers).
Inoltre, David Kleidermacher, vicepresidente di Google per l'ingegneria, ha parlato della migrazione del codice utilizzato nella piattaforma Android per la gestione delle chiavi di crittografia al linguaggio Rust, così come dell'applicazione di Rust nell'implementazione del protocollo DNS over HTTPS, nel stack per i chip UWB (Ultra-Wideband) e nel framework di virtualizzazione Android, legato al chip Tensor G2. Per Android vengono sviluppati anche nuovi stack per Bluetooth e Wi-Fi, riscritti in Rust. La strategia complessiva consiste in un rafforzamento graduale della sicurezza, inizialmente attraverso la migrazione all'uso di Rust dei componenti software più vulnerabili e critici, per poi estendersi ad altri sottosistemi correlati. Lo scorso anno, il linguaggio Rust è stato incluso tra i linguaggi autorizzati per lo sviluppo della piattaforma Android.
Fonte: opennet.ru
