Die Veröffentlichung der universellen Programmiersprache Rust 1.86, die ursprünglich von Mozilla entwickelt wurde, aber inzwischen von der unabhängigen Non-Profit-Organisation Rust Foundation weiterentwickelt wird, wurde angekündigt. Die Sprache konzentriert sich auf einen sicheren Umgang mit dem Speicher und bietet Mittel zur Erreichung einer hohen Parallelität der Ausführung, ohne dabei einen Garbage Collector und Runtime (die Runtime beschränkt sich auf die grundlegende Initialisierung und Pflege der Standardbibliothek) verwenden zu müssen.
Die Methoden zur Speicherverwaltung in Rust befreien den Entwickler von Fehlern beim Umgang mit Zeigern und schützen vor Problemen, die durch niedrige Speicherverwaltung entstehen, wie z. B. den Zugriff auf Speicherbereiche nach deren Freigabe, Dereferenzierung von Nullzeigern, Pufferüberläufen usw. Zur Verbreitung von Bibliotheken, zur Gewährleistung des Builds und zur Verwaltung von Abhängigkeiten wird der Paketmanager Cargo entwickelt. Für das Hosting von Bibliotheken wird das Repository crates.io unterstützt.
Sichere Speicherverwaltung wird in Rust während der Kompilierung durch Überprüfung von Referenzen, Nachverfolgung des Eigentums an Objekten, Berücksichtigung der Lebensdauer von Objekten (Sichtbarkeitsbereiche) und Bewertung der Korrektheit des Zugriffs auf den Speicher während der Ausführung des Codes gewährleistet. Rust bietet ebenfalls Mittel zum Schutz vor Überläufen bei Ganzzahlen, fordert die zwingende Initialisierung von Variablenwerten vor deren Verwendung und behandelt Fehler in der Standardbibliothek besser. Außerdem wird das Konzept der Unveränderlichkeit (immutable) von Referenzen und Variablen standardmäßig angewendet, und es bietet eine starke statische Typisierung zur Minimierung logischer Fehler.
Hauptneuheiten:
- Die Unterstützung für das Upcasting von Traits zum grundlegenden Supertrait wurde hinzugefügt, d. h. es besteht nun die Möglichkeit, eine Referenz auf ein Objekt eines Traits direkt in eine Referenz auf ein Objekt des Supertraits umzuwandeln, ohne dass ein spezielles method hergestellt werden muss, das eine Referenz 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 wurde die Methode get_disjoint_mut() hinzugefügt, um gleichzeitig mehrere veränderbare Referenzen auf Elemente zu erhalten. Zuvor erlaubte der Borrow Checker nicht die gleichzeitige Verwendung 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, sichere Funktionen mit dem Attribut „#[target_feature]“ zu kennzeichnen, das angibt, dass die Funktion bestimmte CPU-Funktionen verwendet. Eine sichere Funktion, die mit dem Attribut „#[target_feature]“ gekennzeichnet ist, kann von einer anderen sicheren Funktion nur dann sicher aufgerufen werden, wenn auch diese mit „#[target_feature]“ gekennzeichnet ist (ansonsten müssen solche Funktionen in einem unsafe-Block aufgerufen werden). Sie dürfen nicht an Funktionen übergeben werden, die generische Parameter akzeptieren, die auf Traits Fn* eingeschränkt sind. Zuvor konnte das Attribut „#[target_feature]“ nur für Funktionen verwendet werden, die als „unsafe“ gekennzeichnet waren. #[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 einen Referenz. Zum Beispiel wird der folgende Code bei aktivierten Debug-Prüfungen nun zu einem Zustand "panic" führen: 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. Früher wurde davon ausgegangen, dass das ABI „C“ verwendet wird, wenn kein ABI nach extern angegeben wurde. Jetzt wird empfohlen, das ABI „C“ ausdrücklich anzugeben, zum Beispiel 'extern "C" {}' und 'extern "C" fn'.
- Eine neue Charge von APIs wurde in den stabilen Bereich überführt, darunter wurden Methoden und Implementierungen von Traits stabilisiert:
- {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 Merkmal «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
- Eine dritte Unterstützungsstufe 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} implementiert. Die dritte Stufe umfasst grundlegende Unterstützung, jedoch ohne automatisierte Tests, keine Veröffentlichung offizieller Builds und keine Überprüfung der Build-Fähigkeit des Codes.
- Eine Warnung über das Ende der zweiten Unterstützungsstufe für die Zielplattform i586-pc-windows-msvc im nächsten Release (1.87) wurde hinzugefügt. Es wird empfohlen, die Plattform i686-pc-windows-msvc zu verwenden, die Unterstützung für SSE2-Instruktionen bietet. Die Plattform i586-pc-windows-msvc ist nicht mehr sinnvoll, da für Windows 10 eine SSE2-Unterstützung erforderlich ist und frühere Windows-Versionen in Rust nicht unterstützt werden.
Darüber hinaus kann erwähnt werden, dass das Unternehmen Ferrocene die Spezifikation für die Programmiersprache Rust (FLS — Ferrocene Language Specification), die im Zuge der Entwicklung seines Rust-Compilers für kritische Systeme entstanden ist und regelmäßig mit dem aktuellen Stand des Haupt-Rust-Compilers synchronisiert wird, der Community übergeben hat. Die FLS-Spezifikation enthält ein strukturiertes und detailliertes Handbuch zu Syntax, Semantik und Verhalten von Rust, das sich zur Verifikation, Kompatibilitätsbewertung und Standardisierung eignet.
Die übermittelten 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
