Die offizielle Veröffentlichung der Programmiersprache Rust 1.56, die ursprünglich von Mozilla entwickelt wurde und nun von der unabhängigen, gemeinnützigen Rust Foundation weitergeführt wird, ist nun verfügbar. Neben der Versionsnummer wird dieses Release auch als Rust 2021 bezeichnet und markiert die Stabilisierung der Änderungen, die in den letzten drei Jahren vorgeschlagen wurden. Rust 2021 wird auch die Grundlage für die Erweiterung der Funktionalitäten in den kommenden drei Jahren bilden, ähnlich wie die Veröffentlichung von Rust 2018 die Basis für die Entwicklungen der letzten drei Jahre war.
Um die Kompatibilität zu gewährleisten, können Entwickler in ihren Programmen die Ausgaben "2015", "2018" und "2021" verwenden, die es ermöglichen, Programme an die Sprachversionen anzupassen, die den gewählten Rust-Editionen entsprechen. Die Editionen wurden eingeführt, um inkompatible Änderungen zu trennen und werden in den Metadaten der Cargo-Pakete über das Feld "edition" im Abschnitt "[package]" konfiguriert. Beispielsweise umfasst die Edition "2018" alle zum Ende des Jahres 2018 stabilisierten Funktionen und schließt auch alle weiteren Änderungen ein, die die Kompatibilität nicht brechen. Die Edition "2021" beinhaltet zusätzlich inkompatible Neuerungen, die in der aktuellen Version 1.56 vorgeschlagen und für zukünftige Implementierung genehmigt wurden. Neben der Sprache berücksichtigen die Editionen auch den Zustand der Werkzeuge und Dokumentation.
Die Hauptinkompatibilitäten, die in Rust 2021 vermerkt sind:
- Separater Zugriff in Closures – Closures können jetzt bestimmte Feldnamen anstelle des gesamten Identifikators erfassen. Zum Beispiel erfasst "|| a.x + 1" nur "a.x" statt "a".
- Trait IntoIterator für Arrays: array.into_iter() ermöglicht es, die Elemente eines Arrays nach Werten statt nach Referenzen zu iterieren.
- In den macro_rules wurde die Verarbeitung des Ausdrucks „|“ (logische ODER-Operation) in Mustern geändert – der Spezifizierer „:pat“ bei den Übereinstimmungen berücksichtigt jetzt die Muster „A | B“.
- Im Paketmanager Cargo wurde standardmäßig die zweite Version des Feature-Resolvers aktiviert, deren Unterstützung in Rust 1.51 eingeführt wurde.
- Die Traits TryFrom, TryInto und FromIterator wurden in das Modul der Standardbibliothek Prelude aufgenommen.
- Die Makros panic!(..) und assert!(expr, ..) verwenden jetzt immer format_args!(..) zum Formatieren von Zeichenfolgen, ähnlich wie println!().
- Im Syntax des Sprachens sind die Ausdrücke ident#, ident»…» und ident’…’ reserviert.
- Die Warnungen bare_trait_objects und ellipsis_inclusive_range_patterns wurden in die Kategorie Fehler verschoben.
Neuigkeiten in Rust 1.56:
- In Cargo.toml wurde im Abschnitt „[package]“ das Feld rust-version hinzugefügt, mit dem die minimal unterstützte Rust-Version für das Crate-Paket angegeben werden kann. Wenn die aktuelle Version nicht mit dem angegebenen Wert übereinstimmt, wird Cargo mit einer Fehlermeldung beendet.
- Bei der Musterübereinstimmung mit den Ausdrücken „binding @ pattern“ wurde die Unterstützung für weitere Bindungen implementiert (zum Beispiel „let matrix @ Matrix { row_len, .. } = get_matrix();“).
- Eine neue Reihe von APIs wurde stabilisiert und in die stabile Version überführt, einschließlich stabilisierter Methoden und Implementierungen von Traits:
- 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
- Das Merkmal „const“, das die Verwendung in jedem Kontext anstelle von Konstanten definiert, wird in Funktionen verwendet
- std::mem::transmute
- [T]::first
- [T]::split_first
- [T]::last
- [T]::split_last
- Der Compiler wurde auf die Verwendung von LLVM Version 13 umgestellt.
- Die zweite Unterstützungsebene für die Plattform aarch64-apple-ios-sim und die dritte Ebene für die Plattform powerpc-unknown-freebsd sowie riscv32imc-esp-espidf wurden implementiert. Die dritte Ebene bedeutet grundlegende Unterstützung, jedoch ohne automatisierte Tests, Veröffentlichung offizieller Builds und Überprüfung der Möglichkeit, Code zu erstellen.
Es sei daran erinnert, dass die Sprache Rust auf die sichere Handhabung von Speicher fokussiert ist, automatisches Speichermanagement bietet und Mittel zur Erreichung hoher Parallelität bei der Ausführung von Aufgaben bereitstellt, während sie ohne Verwendung eines Garbage Collectors und Runtime auskommt (Runtime beschränkt sich auf grundlegende Initialisierung und Wartung der Standardbibliothek).
Das automatische Speichermanagement in Rust befreit Entwickler von Fehlern beim Umgang mit Zeigern und schützt vor Problemen, die aus der niederen Speicherverwaltung entstehen, wie etwa dem Zugreifen auf Speicherbereiche nach deren Freigabe, dem Dereferenzieren von Nullzeigern, Pufferüberläufen usw. Zur Verbreitung von Bibliotheken, zur Gewährleistung des Builds und zur Verwaltung der Abhängigkeiten wird der Paketmanager Cargo entwickelt. Für die Bereitstellung von Bibliotheken wird das Repository crates.io unterstützt.
Quelle: opennet.ru
