È stata rilasciata la versione 1.56 del linguaggio di programmazione di sistema Rust, originariamente sviluppato da Mozilla, ma attualmente gestito dalla Rust Foundation, un'organizzazione indipendente senza scopo di lucro. Oltre al numero di versione standard, il rilascio è indicato anche come Rust 2021 e segna la stabilizzazione delle modifiche proposte negli ultimi tre anni. Rust 2021 costituirà anche la base per l'espansione delle funzionalità nei prossimi tre anni, similmente a come la versione Rust 2018 è stata la base per lo sviluppo del linguaggio negli ultimi tre anni.
Per garantire la compatibilità, gli sviluppatori possono utilizzare nelle loro applicazioni le etichette "2015", "2018" e "2021", che consentono di legare i programmi a versioni specifiche dello stato del linguaggio Rust. Le edizioni sono state introdotte per separare le modifiche incompatibili e sono configurate nei metadati dei pacchetti cargo tramite il campo "edition" nella sezione "[package]". Ad esempio, l'edizione "2018" include funzionalità stabilizzate entro la fine del 2018 e copre anche tutte le modifiche successive che non violano la compatibilità. L'edizione "2021" include ulteriori novità che rompono la compatibilità, proposte nella versione attuale 1.56 e approvate per l'attuazione futura. Oltre al linguaggio, le edizioni tengono conto anche dello stato degli strumenti e della documentazione.
Principali incompatibilità registrate in Rust 2021:
- Cattura separata nei closure: i closure ora possono catturare nomi di campi specifici invece dell'intero identificatore. Ad esempio, "|| a.x + 1" catturerà solo "a.x" invece di "a".
- Caratteristica IntoIterator per gli array: array.into_iter() consente di iterare gli elementi dell'array per valore, anziché per riferimento.
- In macro_rules, the handling of the expression "|" (logical OR operation) in patterns has been changed — the specifier ":pat" in matches now takes into account patterns like "A | B".
- The Cargo package manager now includes, by default, the second version of the feature resolver, support for which was introduced in Rust 1.51.
- The traits TryFrom, TryInto, and FromIterator have been added to the standard library prelude module.
- The macros panic!(..) and assert!(expr, ..) now always use format_args!(..) for string formatting similarly to println!().
- In the language syntax, expressions ident#, ident"…" and ident'…' are reserved.
- The warnings bare_trait_objects and ellipsis_inclusive_range_patterns have been elevated to errors.
New features in Rust 1.56:
- In Cargo.toml, the field rust-version has been added to the "[package]" section, which allows specifying the minimum supported version of Rust for the crate package. If the current version does not match the specified parameter, Cargo will stop executing and output an error.
- Pattern matching using "binding @ pattern" has been implemented to support specifying additional bindings (for example, "let matrix @ Matrix { row_len, .. } = get_matrix();").
- Una nuova serie di API è stata traslata nella categoria stabile, stabilizzando i metodi e le implementazioni dei tipi:
- std::os::unix::fs::chroot
- UnsafeCell::raw_get
- BufWriter::into_parts
- core::panic::{UnwindSafe, RefUnwindSafe, AssertUnwindSafe}
- Vec::shrink_to
- String::shrink_to
- OsString::shrink_to
- PathBuf::shrink_to
- BinaryHeap::shrink_to
- VecDeque::shrink_to
- HashMap::shrink_to
- HashSet::shrink_to
- Il modificatore «const», che determina la possibilità di utilizzarlo in qualsiasi contesto al posto delle costanti, è applicato nelle funzioni.
- std::mem::transmute
- [T]::first
- [T]::split_first
- [T]::last
- [T]::split_last
- Il compilatore è stato aggiornato per utilizzare la versione LLVM 13.
- È stato implementato il secondo livello di supporto per la piattaforma aarch64-apple-ios-sim e il terzo livello per le piattaforme powerpc-unknown-freebsd e riscv32imc-esp-espidf. Il terzo livello prevede un supporto di base, ma senza test automatizzati, pubblicazione di build ufficiali e verifica della possibilità di costruire il codice.
Ricordiamo che il linguaggio Rust è focalizzato sulla gestione sicura della memoria, offre gestione automatica della memoria e fornisce strumenti per raggiungere elevati livelli di parallelismo nell'esecuzione delle operazioni, pur evitando l'uso di garbage collector e runtime (il runtime è ridotto alla semplice inizializzazione e gestione della libreria standard).
La gestione automatica della memoria in Rust solleva gli sviluppatori dagli errori nella manipolazione dei puntatori e protegge da problemi derivanti dal lavoro a basso livello con la memoria, come l'accesso a aree di memoria già liberate, la dereferenziazione di puntatori nulli, il superamento dei limiti di un buffer, ecc. Per la distribuzione delle librerie, la costruzione e la gestione delle dipendenze, è in fase di sviluppo il gestore di pacchetti Cargo. Per l'hosting delle librerie, è supportato il repository crates.io.
Fonte: opennet.ru
