È stato da poco rilasciato Rust 1.86, l’ultima versione del moderno linguaggio di programmazione che va ormai a diffondersi a macchia d’olio tra i software e i sistemi operativi. L’aggiornamento introduce una serie di funzionalità innovative e miglioramenti progettati per supportare gli sviluppatori nella creazione di software sicuro, performante e affidabile.
Rust 1.86: novità nelle funzionalità di linguaggio
Uno dei cambiamenti più attesi di Rust 1.86 è la possibilità di effettuare l’upcasting degli oggetti trait: in termini semplici, se un trait deriva da un supertrait, ora è possibile convertire riferimenti al trait “figlio” in riferimenti al trait “genitore”. In passato, gli sviluppatori dovevano implementare manualmente metodi per ottenere un comportamento simile, ma con questa novità il processo diventa più fluido e integrato nel linguaggio.
Un altro miglioramento significativo è l’introduzione del metodo get_disjoint_mut, disponibile per slice e HashMap. Questo metodo permette di ottenere più riferimenti mutabili contemporaneamente in modo sicuro, superando i limiti delle chiamate ripetute a get_mut, che non garantivano la stessa affidabilità. Grazie a get_disjoint_mut, è possibile modificare elementi distinti di una collezione in parallelo, rispettando le rigide regole del borrow checker di Rust. Questo offre un approccio più chiaro ed espressivo per gestire aggiornamenti parziali, rendendo il codice più leggibile e manutenibile.
Rust 1.86 stabilizza anche l’uso dell’attributo #[target_feature] per funzioni sicure, un’opzione precedentemente riservata solo a contesti unsafe, che consente di ottimizzare il codice per specifiche caratteristiche delle CPU, come le istruzioni AVX2, migliorando le prestazioni su hardware compatibile. Inoltre, in modalità debug, il linguaggio ora include asserzioni a runtime per verificare che i puntatori non siano nulli prima di effettuare letture o scritture di dimensioni non nulle. Questi controlli, applicati anche ai riferimenti presi in prestito (reborrowed), si attivano solo in fase di debug e non influiscono sulle garanzie di sicurezza offerte a compile-time.
Un ulteriore aggiornamento riguarda la gestione dell’ABI (Application Binary Interface): il lint missing_abi è stato promosso a “warn by default”. Ciò significa che omettere la specifica di un ABI, come “C”, nei blocchi extern genererà un avviso, incoraggiando una maggiore attenzione alla compatibilità del codice. Sul fronte della compatibilità hardware, il target i586-pc-windows-msvc verrà rimosso nella versione 1.87. Poiché le istruzioni SSE2 sono obbligatorie su Windows 10 (il sistema operativo minimo supportato per i target Windows principali), gli utenti sono invitati a passare a i686-pc-windows-msvc prima che la deprecazione diventi effettiva.
Per quanto riguarda le librerie, Rust 1.86 stabilizza infine diverse API utili, tra cui Float::next_down, Float::next_up e nuove varianti di slice::get_disjoint_mut. Inoltre, funzioni come hint::black_box e vari metodi di suddivisione delle stringhe sono ora utilizzabili in contesti const, ampliandone l’applicabilità in scenari a compile-time. Per uno sguardo più dettagliato di tutte le novità è possibile consultare l’annuncio ufficiale. Rust 1.86 dimostra ancora una volta l’impegno del team nel fornire strumenti potenti e sicuri per gli sviluppatori moderni.