È stata pubblicata la versione 1.88 del linguaggio di programmazione generale Rust, inizialmente sviluppato da Mozilla e ora portato avanti da un'organizzazione no-profit indipendente, la Rust Foundation. Il linguaggio si concentra sulla gestione sicura della memoria e offre strumenti per raggiungere un elevato parallelismo nell'esecuzione delle attività, senza ricorrere a garbage collector e runtime (il runtime si limita alla inizializzazione di base 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 possibilità di specificare più espressioni «let» all'interno dei blocchi condizionali «if» e «while» utilizzando l'operatore «&&» (AND logico) per combinarle. Le espressioni «let» possono essere combinate con espressioni condizionali booleane. Le variabili dichiarate nelle espressioni let possono essere utilizzate nelle espressioni condizionali successive, così come all’interno dei blocchi «if» e «while». if let Channel::Stable(v) = release_info() && let Semver { major, minor, .. } = v && major == 1 && minor == 88 {
- È stata aggiunta la supporto per la scrittura di funzioni "nude", contrassegnate dall'attributo "#[unsafe(naked)]" e contenenti all'interno una chiamata a "naked_asm!". Le funzioni create in questo modo non hanno epilogo e prologo generati dal compilatore, il che consente allo sviluppatore di controllare completamente il codice assembler di servizio allegato alla funzione (una funzione "nuda" contiene solo le istruzioni assembler specificate dallo sviluppatore e non include gestori speciali per argomenti e valori restituiti, aggiunti dal compilatore). Le funzioni "nude" sono considerate un'alternativa più conveniente alle funzioni definite nel blocco "global_asm!". #[unsafe(naked)] pub unsafe extern "sysv64" fn wrapping_add(a: u64, b: u64) -> u64 { core::arch::naked_asm!( "add rax, rdi, rsi", "ret" ); }
- Nel linguaggio dei predicati, utilizzato negli attributi di compilazione condizionale «cfg» e «cfg_attr» (che permettono di abilitare o disabilitare parti del codice in base a condizioni specificate), è stata aggiunta la supporto per i letterali booleani «true» e «false», che sono identificati con le configurazioni sempre attive o sempre disattive. Questi letterali possono anche essere utilizzati nel macro «cfg!» e nelle tabelle «[target]» nei manifesti e nelle configurazioni per Cargo. Le espressioni cfg(true) e cfg(false) possono essere utilizzate al posto di cfg(all()) e cfg(any()) per esprimere le proprie intenzioni in modo più chiaro.
- Nel gestore di pacchetti Cargo è stata integrata l'esecuzione automatica del raccoglitore di spazzatura per pulire la cache nella directory home dell'utente. In precedenza, i pacchetti memorizzati nella cache con dipendenze scaricate non venivano puliti, portando a una crescita continua dello spazio su disco consumato. Il meccanismo di raccolta della spazzatura attivato eliminerà automaticamente i file crate scaricati che non sono stati utilizzati per più di 3 mesi e i file crate installati localmente non utilizzati per più di un mese. La pulizia della cache non viene attivata quando si utilizza in cargo le opzioni «—offline» o «—frozen».
- Una nuova serie di API è stata traslata nella categoria stabile, stabilizzando i metodi e le implementazioni dei tipi:
- Cell::update
- impl Default for *const T
- impl Default for *mut T
- mod ffi::c_str
- HashMap::extract_if
- HashSet::extract_if
- hint::select_unpredictable
- proc_macro::Span::line
- proc_macro::Span::column
- proc_macro::Span::start
- proc_macro::Span::end
- proc_macro::Span::file
- proc_macro::Span::local_file
- ::as_chunks
- ::as_rchunks
- ::as_chunks_unchecked
- ::as_chunks_mut
- ::as_rchunks_mut
- ::as_chunks_unchecked_mut
- Il flag «const» è stato applicato nelle funzioni:
- NonNull::replace
- ::replace
- std::ptr::swap_nonoverlapping
- Cell::replace
- Cell::get
- Cell::get_mut
- Cell::from_mut
- Cell::as_slice_of_cells
- È stato rimosso il primo livello di supporto per la piattaforma target i686-pc-windows-gnu.
Si possono inoltre segnalare eventi legati a Rust:
- Il progetto Munal OS sviluppa un sistema operativo sperimentale, scritto in Rust e basato sul concetto di unikernel. In Munal OS non viene utilizzata la multi-tasking preemptiva, il mapping della memoria e lo spazio di indirizzamento virtuale (viene utilizzata la mappatura della memoria di UEFI). Il nucleo e le applicazioni vengono eseguiti in uno stesso spazio di indirizzamento con un modello di sicurezza basato sull'isolamento sandbox WASM (incluso un motore wasmi per eseguire applicazioni in forma di bytecode WebAssembly).
Il sistema operativo è dotato di un'interfaccia grafica e supporta la gestione tramite tastiera e mouse. Per lo sviluppo di applicazioni grafiche viene utilizzato un toolkit proprietario con una libreria di widget. Per l'interazione di rete sono disponibili uno stack TCP e un driver per il dispositivo di rete. Tra le applicazioni disponibili per Munal OS ci sono: un browser web con supporto basico per HTML e HTTPS, un editor di testo e un terminale per l'esecuzione di codice Python. Il codice è aperto sotto licenza MIT.

- È stata rilasciata la versione 0.15.2 del kernel Asterinas, scritto in Rust e che fornisce un'ABI compatibile con il kernel Linux. Il kernel supporta le architetture x86-64 e RISC-V e implementa 206 delle 368 chiamate di sistema di Linux. Sono coinvolti nello sviluppo del kernel 45 sviluppatori, principalmente provenienti da vari università cinesi. Il kernel è costruito utilizzando l'architettura "framekernel", in cui i componenti del kernel sono collocati in uno spazio di indirizzi comune, e la sicurezza viene raggiunta a livello di separazione logica del codice sicuro e del codice in cui potrebbero sorgere problemi di sicurezza. Tutte le chiamate di sistema, i filesystem e i driver sono implementati a livello di OS Services e non possono includere blocchi unsafe. Il codice è distribuito sotto la licenza MPL 2.0.
- È stata sviluppata un'utilità rsched per il kernel Linux, che consente di analizzare le statistiche relative al funzionamento dello scheduler dei task. Nella pratica, l'utilità permette di valutare le decisioni dello scheduler riguardanti l'assegnazione delle risorse ai processi e di monitorare i ritardi che si verificano durante la pianificazione. Per la raccolta dati, viene utilizzato il sottosistema BPF, mentre l'utility in spazio utente è scritta in Rust. L'autore dell'utilità è Chris Mason, creatore e architetto principale del file system Btrfs.
- L'azienda Collabora ha annunciato lo sviluppo di una variante dell'utility Coccinelle per il linguaggio Rust. Coccinelle è originariamente progettato per automatizzare la ricerca e la trasformazione del codice in linguaggio C nel kernel Linux. Le trasformazioni sono definite sotto forma di regole, che ricordano patch astratte, non legate a una posizione specifica nel codice.
- Gli sviluppatori di GNOME hanno presentato la libreria glycin per il caricamento delle immagini, scritta in Rust e che garantisce la decodifica delle immagini tramite isolamento in sandbox. Supporta la restituzione dei contenuti decodificati attraverso gdk::Textures ed estrae i metadati. Sono disponibili dei wrapper per utilizzare glycin in GTK4, così come un backend per integrare glycin nella libreria GdkPixbuf, usata in GNOME per il caricamento delle immagini. Glycin è già utilizzato nell'applicazione per la visualizzazione delle immagini Loupe, proposta come predefinita in GNOME. Inoltre, il backend per GdkPixbuf consente di utilizzare glycin in GNOME Shell, nei generatori di miniature e in applicazioni GNOME arbitrarie, senza necessità di modifiche a questi programmi.
Fonte: opennet.ru

