Die Version 1.77 der universellen Programmiersprache Rust, ursprünglich von Mozilla entwickelt und jetzt unter dem Dach der unabhängigen gemeinnützigen Organisation Rust Foundation weiterentwickelt, wurde veröffentlicht. Die Sprache fokussiert sich auf sicheren Umgang mit Speicher und bietet Möglichkeiten für hohe Parallelität bei der Aufgabenausführung, ohne dabei einen Garbage Collector und ein umfangreiches Runtime zu benötigen (die Runtime beschränkt sich auf grundlegende Initialisierungen und die Pflege 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 Unterstützung für Textliterale in C-Strings (c»Text») wurde hinzugefügt, die im Speicher mit einem abschließenden Nullzeichen gespeichert werden und dem Typ «CStr» zugeordnet sind. Diese Unterstützung für C-Strings soll das Schreiben von Code erleichtern, der mit Schichten in Programmiersprachen interagiert, in denen nullterminierte Strings verwendet werden, und es ermöglichen, notwendige Überprüfungen zur Kompilierzeit durchzuführen. const HELLO: &core::ffi::CStr = c»Hello, world!»;
- In asynchronen Funktionen, die mit dem Ausdruck „async fn“ deklariert sind, ist die Rekursion erlaubt, d.h. solche Funktionen können sich jetzt selbst aufrufen. async fn fib(n: u32) -> u32 { match n { 0 | 1 => 1, _ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await } }
- Das Makro offset_of! wurde stabilisiert, welches es ermöglicht, das Byte-Offset von Feldern in Strukturen, Aufzählungen, Vereinigungen und Tupeln relativ zum Beginn des Typs zu bestimmen. In der Praxis kann das Makro nützlich sein in Situationen, in denen Arbeiten auf der Ebene von Feld-Offsets erforderlich ist, ohne ein Typ-Exemplar zu besitzen. Insbesondere ist die Funktionalität von offset_of notwendig bei der Entwicklung von niedrig-leveligen Komponenten wie Treibern. use std::mem; #[repr(C)] struct FieldStruct { first: u8, second: u16, third: u8 } assert_eq!(mem::offset_of!(FieldStruct, first), 0); assert_eq!(mem::offset_of!(FieldStruct, second), 2); assert_eq!(mem::offset_of!(FieldStruct, third), 4);
- Im Paketmanager Cargo ist in den Release-Profilen standardmäßig die Bereinigung von Dateien von Debug-Daten (strip = „debuginfo“) aktiviert, es sei denn, der Debug-Modus ist im Cargo-Profil explizit aktiviert, d.h. wenn der Parameter debug = 0 ist.
- Standardmäßig ist die Option «-Zthir-unsafeck=on» aktiviert, die eine Unsicherheitsprüfung für die Typed High-Level Intermediate Representation (THIR) bereitstellt.
- Die Lint-Prüfung static_mut_refs wurde hinzugefügt, um Warnungen bei der Verwendung von Referenzen auf veränderbare statische Werte auszugeben.
- Die Möglichkeit zur Anwendung des Typs «From» für den Typ «Cow» wurde implementiert. fn foo(data: impl Into<Cow) { /* … */ } fn main() { foo(&['hello', 'world']); }
- Der Compiler stellt die Ausrichtung von 16-Byte-Typen i128 und u128 für x86-Systeme sicher.
- Eine neue Reihe von APIs wurde stabilisiert und in die stabile Version überführt, einschließlich stabilisierter Methoden und Implementierungen von Traits:
- array::each_ref
- array::each_mut
- core::net
- f32::round_ties_even
- f64::round_ties_even
- mem::offset_of!
- slice::first_chunk
- slice::first_chunk_mut
- slice::split_first_chunk
- slice::split_first_chunk_mut
- slice::last_chunk
- slice::last_chunk_mut
- slice::split_last_chunk
- slice::split_last_chunk_mut
- slice::chunk_by
- slice::chunk_by_mut
- Bound::map
- File::create_new
- Mutex::clear_poison
- RwLock::clear_poison
- Die dritte Unterstützungsebene wurde für die Plattformen aarch64-unknown-illumos, hexagon-unknown-none-elf, riscv32imafc-esp-espidf und riscv32im-risc0-zkvm-elf implementiert. Die dritte Unterstützungsebene umfasst grundlegende Unterstützung, jedoch ohne automatisierte Tests, Veröffentlichung offizieller Builds und Überprüfung der Build-Fähigkeit des Codes.
Quelle: opennet.ru
