Die Programmier Sprache Rust 1.63, ursprünglich von Mozilla entwickelt und jetzt von der unabhängigen, gemeinnützigen Organisation Rust Foundation weitergeführt, wurde veröffentlicht. Die Sprache legt Wert auf speichersichere Ausführung und bietet Mittel für hohen parallelen Aufgabenbetrieb, ganz ohne die Verwendung eines Garbage Collectors und Runtime (die Runtime beschränkt sich auf die grundlegende Initialisierung und die Unterstützung der Standardbibliothek).
Die Speicherverwaltungsmethoden in Rust befreien Entwickler von Fehlern beim Umgang mit Zeigern und schützen vor Problemen, die durch die Programmierung auf niedriger Ebene entstehen, wie z.B. den Zugriff auf freigegebenen Speicher, Dereferenzierung von Nullzeigern, Pufferüberläufe usw. Zur Verteilung von Bibliotheken, zur Gewährleistung des Builds und zum Management von Abhängigkeiten wird der Paketmanager Cargo entwickelt. Für die Bereitstellung von Bibliotheken wird das Repository crates.io unterstützt.
Die sichere Handhabung von Speicher in Rust wird während der Kompilierung durch die Überprüfung von Referenzen, das Verfolgen des Besitztums von Objekten, das Management der Lebensdauer von Objekten (Sichtbarkeitsbereiche) und die Bewertung der Korrektheit des Zugriffs auf den Speicher zur Laufzeit sichergestellt. Rust bietet außerdem Mechanismen zum Schutz vor ganzzahligen Überläufen, erfordert die verpflichtende Initialisierung von Variablenwerten vor der Verwendung, behandelt Fehler in der Standardbibliothek effektiver, implementiert das Konzept der Unveränderlichkeit (immutable) von Referenzen und Variablen standardmäßig und bietet eine starke statische Typisierung zur Minimierung logischer Fehler.
Hauptneuheiten:
- Die API std::thread::scope wurde hinzugefügt, die es ermöglicht, Threads in Verbindung mit einem Sichtbarkeitsbereich (Scoped Threads) zu erstellen. Im Gegensatz zu den zuvor verfügbaren Threads erlaubt die neue API std::thread::scope die Übergabe von geliehenen (borrowing) nicht-statischen Daten. Dagegen mussten Threads, die mit dem klassischen API std::thread::spawn erstellt wurden, alle übergebenen Argumente besitzen und konnten keine geliehenen Variablen erhalten. Die API std::thread::scope stellt sicher, dass alle erzeugten Threads vor der Rückgabe der Daten beendet werden, was ein angemessenes Maß an Sicherheit für den Leihmechanismus gewährleistet.
- Neue Typen von Wrappern für Dateideskriptoren wurden eingeführt — BorrowedFd und OwnedFd, die das Ausleihen und den Besitz gewährleisten. Die Typen sind mit „#[repr(transparent)]“ markiert, was eine direkte Nutzung in externen C-Bindungen unter Berücksichtigung des Besitzes ermöglicht.
- Es besteht jetzt die Möglichkeit, Condvar::new, Mutex::new und RwLock::new im Kontext von Konstanten aufzurufen, um globale statische Werte von Mutex, RwLock und Condvar zu erstellen, ohne lazy_static-Bibliotheken verwenden zu müssen.
- Für Funktionen des Typs fn foo<T>(value: T, f: impl Copy) ist die Verwendung der Syntax „foo::<u32>(3, 3)“ gestattet, um den Generiktyp explizit anzugeben.
- Der Übergang zur Nutzung der Technik NLL (Non-Lexical Lifetimes) zur Identifizierung von Problemen mit dem Ausleihen von Variablen wurde abgeschlossen. NLL berücksichtigt die Pointersets in der Ausführungsflussgraph, was die Qualität der Überprüfung des Ausleihens von Variablen (borrow checker) verbessert und die Ausführung bestimmter korrekt codierter Varianten ermöglicht, die zuvor zu Fehlerausgaben führten. Die Unterstützung des alten Mechanismus, der die Bindung der Lebensdauer auf lexikalischer Ebene verwendete, wurde nun vollständig aus rustc entfernt, und die Nutzung des neuen NLL ist überall integriert.
- Eine neue Reihe von APIs wurde stabilisiert und in die stabile Version überführt, einschließlich stabilisierter Methoden und Implementierungen von Traits:
- array::from_fn
- Box::into_pin
- BinaryHeap::try_reserve
- BinaryHeap::try_reserve_exact
- OsString::try_reserve
- OsString::try_reserve_exact
- PathBuf::try_reserve
- PathBuf::try_reserve_exact
- Path::try_exists
- Ref::filter_map
- RefMut::filter_map
- NonNull::::len
- ToOwned::clone_into
- Ipv6Addr::to_ipv4_mapped
- unix::io::AsFd
- unix::io::BorrowedFd
- unix::io::OwnedFd
- windows::io::AsHandle
- windows::io::BorrowedHandle
Quelle: opennet.ru
