rilascio del linguaggio di programmazione di sistema , sviluppato dal progetto Mozilla. Il linguaggio è focalizzato su un uso sicuro della memoria, fornisce gestione automatica della memoria e offre strumenti per raggiungere un elevato parallelismo nell'esecuzione delle attività, evitando l'uso di garbage collector e runtime.
La gestione automatica della memoria in Rust libera gli sviluppatori dalla manipolazione dei puntatori e protegge da problemi derivanti da operazioni a basso livello con la memoria, come l'accesso a memoria già liberata, dereferenziazione di puntatori nulli, overflow del buffer e simili. Per la distribuzione delle librerie, la gestione della compilazione e delle dipendenze, è in fase di sviluppo un gestore di pacchetti , che consente di ottenere le librerie necessarie per il programma con un clic. Per l'hosting delle librerie è supportato il repository .
Principali :
- È stata aggiunta la modalità di compilazione a pipeline in cui la compilazione di un pacchetto crate dipendente inizia non appena i metadati delle dipendenze diventano disponibili, senza attendere il completamento della sua compilazione. Durante la compilazione del pacchetto, non è necessario che le dipendenze siano completamente compilate, è sufficiente che i metadati siano definiti e includano elenchi di tipi, dipendenze e elementi esportati. I metadati diventano disponibili nella fase iniziale della compilazione, quindi i pacchetti correlati possono ora iniziare a essere compilati molto prima. Nella compilazione di pacchetti singoli, la modalità proposta non influisce sulle prestazioni, ma se la compilazione riguarda pacchetti con dipendenze ramificate, il tempo totale di compilazione può ridursi del 10-20%;
- È stata garantita l'identificazione di un uso improprio delle funzioni e . Ad esempio, std::mem::uninitialized è utile per creare rapidamente array, ma inganna il compilatore, creando l'illusione di una inizializzazione, mentre in realtà il valore rimane non inizializzato. La funzione mem::uninitialized è già contrassegnata come obsoleta e si consiglia di utilizzare un tipo intermedio al suo posto. . Per quanto riguarda mem::zeroed, questa funzione può causare problemi con i tipi che non possono accettare valori nulli.
Per identificare il comportamento indefinito causato in questa nuova release, è stato aggiunto un controllo lint al compilatore che rileva alcuni problemi con mem::uninitialized o mem::zeroed. Ad esempio, ora viene visualizzato un errore quando si tenta di utilizzare mem::uninitialized o mem::zeroed con i tipi &T e Box‹T›, che rappresentano oggetti puntatori che non possono accettare valori nulli;
- Espandendo l'applicazione dell'attributo «#[deprecated]», ora è possibile contrassegnare i pacchetti crate come obsoleti e previsti per la rimozione futura. A partire dalla versione Rust 1.38, questo attributo può essere applicato anche ai macro;
- È stata aggiunta la possibilità di applicare l'attributo «#[global_allocator]» nei sotto-moduli;
- È stata aggiunta una funzione , che consente di conoscere il nome del tipo, utile per scopi di debug. Ad esempio, durante l'esecuzione del programma è possibile scoprire per quale tipo è stata chiamata la funzione:
fn gen_value‹T: Default›() -› T {
println!(«Inizializzando un'istanza di {}», std::any::type_name::‹T›());
Default::default()
}fn main() {
let _: i32 = gen_value(); # verrà visualizzato «i32»
let _: String = gen_value(); # verrà visualizzato «alloc::string::String»
} - Sono state ampliate le funzioni della libreria standard:
- slice::{concat, connect, join} può ora accettare un valore &[T] oltre a &T;
- «*const T» e «*mut T» ora implementano marker::Unpin;
- «Arc‹[T]›» e «Rc‹[T]›» ora implementano FromIterator‹T›;
- iter::{StepBy, Peekable, Take} ora implementano DoubleEndedIterator.
- ascii::EscapeDefault implementa Clone e Display.
- È stata tradotta una nuova serie di API in categoria stabile, compresi i metodi stabilizzati
- ‹*const T›::cast, ‹*mut T›::cast,
- Duration::as_secs_f{32|64},
- Duration::div_duration_f{32|64},
- Duration::div_f{32|64},
- Duration::from_secs_f{32|64},
- Duration::mul_f{32|64},
- operazioni di divisione con resto
div_euclid e rem_euclid per tutti i tipi primitivi interi;
- Il gestore pacchetti cargo ha aggiunto il supporto per specificare l'opzione «—features» più volte per abilitare diverse funzionalità;
- Il compilatore ha garantito un terzo supporto per le piattaforme target aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-msvc, armv7-unknown-linux-gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl e riscv32i-unknown-none-elf. Il terzo livello implica un supporto di base, ma senza test automatizzati e pubblicazione di build ufficiali.
Fonte: opennet.ru
