Die Veröffentlichung der universellen Programmiersprache Rust 1.63, die vom Mozilla-Projekt gegründet wurde, jetzt aber unter der Schirmherrschaft der unabhängigen gemeinnützigen Organisation Rust Foundation entwickelt wird, wurde veröffentlicht. Die Sprache konzentriert sich auf die Speichersicherheit und bietet die Möglichkeit, eine hohe Jobparallelität zu erreichen und gleichzeitig die Verwendung eines Garbage Collectors und einer Laufzeit zu vermeiden (die Laufzeit beschränkt sich auf die grundlegende Initialisierung und Wartung der Standardbibliothek).
Die Speicherverarbeitungsmethoden von Rust bewahren den Entwickler vor Fehlern bei der Manipulation von Zeigern und schützen vor Problemen, die durch die Speicherverarbeitung auf niedriger Ebene entstehen, wie z. B. Zugriff auf einen Speicherbereich, nachdem dieser freigegeben wurde, Dereferenzierung von Nullzeigern, Pufferüberläufe usw. Um Bibliotheken zu verteilen, Builds bereitzustellen und Abhängigkeiten zu verwalten, entwickelt das Projekt den Cargo-Paketmanager. Das crates.io-Repository wird zum Hosten von Bibliotheken unterstützt.
Die Speichersicherheit wird in Rust zur Kompilierungszeit durch Referenzprüfung, Verfolgung des Objektbesitzes, Verfolgung der Objektlebensdauer (Umfänge) und Beurteilung der Korrektheit des Speicherzugriffs während der Codeausführung gewährleistet. Rust bietet außerdem Schutz vor Ganzzahlüberläufen, erfordert eine obligatorische Initialisierung von Variablenwerten vor der Verwendung, behandelt Fehler in der Standardbibliothek besser, wendet standardmäßig das Konzept unveränderlicher Referenzen und Variablen an und bietet starke statische Typisierung, um logische Fehler zu minimieren.
Wichtigste Neuerungen:
- Die std::thread::scope-API wurde hinzugefügt, mit der Sie bereichsbezogene Threads erstellen können. Im Gegensatz zu zuvor verfügbaren Threads ermöglicht die neue std::thread::scope-API die Übergabe nicht statischer Daten, während Threads, die mit der klassischen std::thread::spawn-API erstellt wurden, alle übergebenen Argumente besitzen mussten und nicht empfangen konnten geliehene Variablen. Die std::thread::scope-API stellt sicher, dass alle erzeugten Threads beendet werden, bevor Daten zurückgegeben werden, und bietet so angemessene Sicherheit für den Ausleihmechanismus.
- Es wurden neue Wrapper-Typen für Dateideskriptoren vorgeschlagen – BorrowedFd und OwnedFd, die Ausleihen und Besitz ermöglichen. Typen sind mit „#[repr(transparent)]“ gekennzeichnet, sodass sie direkt und eigentumsbewusst in externen C-Bindungen verwendet werden können.
- Bietet die Möglichkeit, Condvar::new, Mutex::new und RwLock::new im Kontext von Konstanten aufzurufen, um globale statische Mutex-, RwLock- und Condvar-Werte zu erstellen, ohne lazy_static-Pakete zu verwenden.
- Für Funktionen wie fn foo (Wert: T, f: impl Copy) Syntax wie „foo::“ ist zulässig (32, 3)“, mit expliziter Angabe der Art des Generikums.
- Der Übergang zur Verwendung der NLL-Technik (Non-Lexical Lifetimes) zur Identifizierung von Problemen mit entlehnten Variablen ist abgeschlossen. NLL berücksichtigt auf der Ebene eine Reihe von Zeigern im Ausführungsflussdiagramm, was es ermöglicht, die Qualität der Prüfung auf Leihvariablen (Borrow Checker) zu erhöhen und die Ausführung einiger Arten von korrektem Code zu ermöglichen, die Verwendung von was zuvor zu einem Fehler geführt hat. Die Unterstützung für den alten Mechanismus, der die lebenslange Bindung auf lexikalischer Ebene verwendete, wurde jetzt vollständig aus rustc entfernt und die Verwendung der neuen NLL wurde durchgehend implementiert.
- Ein neuer Teil der API wurde in die Kategorie „stabil“ verschoben, einschließlich der Stabilisierung der Methoden und Implementierungen von Merkmalen:
- 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
- Pfad::try_exists
- Ref::filter_map
- RefMut::filter_map
- NonNull::<[T]>::len
- ToOwned::clone_into
- Ipv6Addr::to_ipv4_mapped
- unix::io::AsFd
- unix::io::BorrowedFd<'fd>
- unix::io::OwnedFd
- windows::io::AsHandle
- windows::io::BorrowedHandle
Source: opennet.ru
