Die Veröffentlichung der Programmiersprache Rust 1.86 wurde bekanntgegeben. Rust, ursprünglich von Mozilla entwickelt, wird nun von der unabhängig arbeitenden gemeinnützigen Organisation Rust Foundation weiterentwickelt. Die Sprache konzentriert sich auf sicheres Arbeiten mit Speicher und bietet Mittel, um eine hohe Parallelität bei der Ausführung von Aufgaben zu erreichen, ohne einen Garbage Collector oder eine vollständige Laufzeitumgebung (runtime, die sich auf die grundlegende Initialisierung und die Begleitung der Standardbibliothek beschränkt) zu benötigen.
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 das Upcasting von Traits zu übergeordneten Supertraits wurde hinzugefügt. Dies bedeutet, dass es nun möglich ist, einen Verweis auf ein Trait-Objekt direkt in einen Verweis auf ein Supertrait-Objekt umzuwandeln, ohne dass eine spezielle Methode im Trait erforderlich ist, die einen Verweis auf das Supertrait zurückgibt. Eine ähnliche Operation kann auch mit anderen Arten von Smart Pointern durchgeführt werden, wie zum Beispiel "Arc<dyn Trait> -> Arc<dyn Supertrait>" und "*const dyn Trait -> *const dyn Supertrait". trait Trait: Supertrait {} trait Supertrait {} fn upcast(x: &dyn Trait) -> &dyn Supertrait { x }
- In HashMap und Slices (Slice) wurde die Methode get_disjoint_mut() hinzugefügt, um gleichzeitig mehrere mutable Referenzen auf Elemente zu erhalten. Zuvor erlaubte der Borrow Checker keine gleichzeitige Nutzung von Referenzen, die mit der Methode get_mut() erhalten wurden. let v = &mut [1, 2, 3]; if let Ok([a, b]) = v.get_disjoint_mut([0, 2]) { *a = 413; *b = 612; } assert_eq!(v, &[413, 2, 612]); if let Ok([a, b]) = v.get_disjoint_mut([0..1, 1..3]) { a[0] = 8; b[0] = 88; b[1] = 888; } assert_eq!(v, &[8, 88, 888]);
- Es ist erlaubt, safe-Funktionen mit dem Attribut „#[target_feature]“ zu kennzeichnen, das angibt, dass die Funktion bestimmte CPU-Funktionen nutzt. Eine safe-Funktion, die mit dem Attribut „#[target_feature]“ gekennzeichnet ist, kann von einer anderen safe-Funktion nur sicher aufgerufen werden, wenn auch diese mit „#[target_feature]“ gekennzeichnet ist (ansonsten müssen solche Funktionen in einem unsafe-Block aufgerufen werden). Außerdem dürfen sie nicht an Funktionen übergeben werden, die generische (generic) Parameter mit den Trait-Beschränkungen Fn* akzeptieren. Zuvor konnte das Attribut „#[target_feature]“ nur für als „unsafe“ gekennzeichnete Funktionen verwendet werden. #[target_feature(enable = "avx2")] fn requires_avx2() { \/\/ … } #[target_feature(enable = "avx2")] fn safe_callsite() { requires_avx2(); } fn unsafe_callsite() { if is_x86_feature_detected!("avx2") { unsafe { requires_avx2() }; } }
- Im Rust-Compiler sind Debug-Prüfungen (debug-assert) aktiviert, die sicherstellen, dass ein Zeiger beim Lesen und Schreiben nicht NULL ist, sowie beim erneuten Ausleihen (reborrow) des Zeigers in eine Referenz. Wenn Debug-Prüfungen aktiviert sind, führt der folgende Code jetzt zu einem Zustand "panic": let _x = *std::ptr::null::(); let _x = &*std::ptr::null::();
- Standardmäßig ist die Lint-Prüfung "missing_abi" aktiviert, die eine Warnung ausgibt, wenn nach dem Schlüsselwort extern kein ABI angegeben ist. Zuvor wurde angenommen, dass ABI "C" verwendet wird, wenn kein ABI nach extern angegeben ist. Es wird jetzt empfohlen, das ABI "C" explizit anzugeben, zum Beispiel ‘extern "C" {}’ und ‘extern "C" fn’
- Eine neue Reihe von APIs wurde stabilisiert und in die stabile Version überführt, einschließlich stabilisierter Methoden und Implementierungen von Traits:
- {float}::next_down
- {float}::next_up
- ::get_disjoint_mut
- ::get_disjoint_unchecked_mut
- slice::GetDisjointMutError
- HashMap::get_disjoint_mut
- HashMap::get_disjoint_unchecked_mut
- NonZero::count_ones
- Vec::pop_if
- sync::Once::wait
- sync::Once::wait_force
- sync::OnceLock::wait
- Das Kennzeichen „const“ wird in Funktionen angewendet:
- hint::black_box
- io::Cursor::get_mut
- io::Cursor::set_position
- str::is_char_boundary
- str::split_at
- str::split_at_checked
- str::split_at_mut
- str::split_at_mut_checked
- Die dritte Support-Stufe wurde für die Plattformen {aarch64-unknown,x86_64-pc}-nto-qnx710_iosock, {aarch64-unknown,x86_64-pc}-nto-qnx800, {x86_64,i686}-win7-windows-gnu, amdgcn-amd-amdhsa, x86_64-pc-cygwin, {mips,mipsel}-mti-none-elf, m68k-unknown-none-elf, armv7a-nuttx-{eabi,eabihf}, aarch64-unknown-nuttx und thumbv7a-nuttx-{eabi,eabihf} realisiert. Die dritte Stufe umfasst grundlegenden Support, jedoch ohne automatisierte Tests, Veröffentlichung offizieller Builds und Überprüfung der Code-Baufähigkeit.
- Eine Warnung über das Ende der Unterstützung der zweiten Stufe für die Zielplattform i586-pc-windows-msvc wird in der nächsten Version (1.87) hinzugefügt. Es wird empfohlen, die Plattform i686-pc-windows-msvc zu verwenden, die durch die Unterstützung von SSE2-Instruktionen gekennzeichnet ist. Die Plattform i586-pc-windows-msvc ist nicht mehr sinnvoll, da für Windows 10 eine Unterstützung von SSE2 erforderlich ist und ältere Windows-Versionen in Rust nicht mehr unterstützt werden.
Zusätzlich ist zu erwähnen, dass das Unternehmen Ferrocene der Community die Spezifikation für die Programmiersprache Rust (FLS – Ferrocene Language Specification) übergeben hat, die im Rahmen der Entwicklung seines Rust-Compilers für kritische Systeme erstellt und regelmäßig mit dem aktuellen Stand des Haupt-Rust-Compilers synchronisiert wird. Die FLS-Spezifikation umfasst eine strukturierte und detaillierte Anleitung zu Syntax, Semantik und Verhalten von Rust, die für die Verifikation, Kompatibilitätsbewertung und Standardisierung geeignet ist.
Die übergebenen Materialien werden zur Erstellung einer Referenzspezifikation für die Programmiersprache Rust verwendet, die bei der Entwicklung alternativer Compiler und zur Überprüfung des Compilers in sicherheitskritischen Bereichen eingesetzt werden kann.
Quelle: opennet.ru
