Veröffentlichung der Programmiersprache Rust 1.59 mit Unterstützung für Assembly-Einfügungen

Die Veröffentlichung der universellen Programmiersprache Rust 1.59, 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:

  • Es ist möglich, Assembler-Einfügungen zu verwenden, die in Anwendungen gefragt sind, die die Ausführung auf niedriger Ebene steuern oder spezielle Maschinenanweisungen verwenden müssen. Assembly-Einfügungen werden mit den Makros „asm!“ hinzugefügt. und „global_asm!“ Verwenden einer String-Formatierungssyntax für die Benennung von Registern, ähnlich der, die für String-Ersetzungen in Rust verwendet wird. Der Compiler unterstützt Assembleranweisungen für x86-, x86-64-, ARM-, AArch64- und RISC-V-Architekturen. Einfügebeispiel: use std::arch::asm; // Multipliziere x mit 6 unter Verwendung von Verschiebungen und Additionen let mut x: u64 = 4; unsafe { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "add {x}, {tmp}", x = inout(reg ) x, tmp = out(reg) _, ); } behaupten_eq!(x, 4 * 6);
  • Unterstützung für destrukturierte (parallele) Zuweisungen hinzugefügt, bei denen mehrere Merkmale, Slices oder Strukturen auf der linken Seite des Ausdrucks angegeben werden. Zum Beispiel: let (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struct { e, .. } = Struct { e: 5, f: 3 }; behaupten_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Die Möglichkeit, Standardwerte für const-Generika anzugeben, wurde bereitgestellt: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • Der Cargo-Paketmanager warnt vor der Verwendung ungültiger Strukturen in Abhängigkeiten, die aufgrund von Fehlern im Compiler verarbeitet werden (z. B. konnten aufgrund eines Fehlers Felder gepackter Strukturen in sichere Blöcke ausgeliehen werden). Solche Konstrukte werden in einer zukünftigen Version von Rust nicht mehr unterstützt.
  • Cargo und rustc verfügen über eine integrierte Fähigkeit, ausführbare Dateien ohne Debugging-Daten (strip = „debuginfo“) und Symbole (strip = „symbols“) zu generieren, ohne dass ein separates Dienstprogramm aufgerufen werden muss. Die Reinigungseinstellung wird über den Parameter „strip“ in Cargo.toml implementiert: [profile.release] strip = „debuginfo“, „symbols“
  • Die inkrementelle Kompilierung ist standardmäßig deaktiviert. Der Grund soll ein vorübergehender Workaround für einen Fehler im Compiler sein, der zu Abstürzen und Deserialisierungsfehlern führt. Ein Bugfix ist bereits vorbereitet und wird im nächsten Release enthalten sein. Um eine inkrementelle Kompilierung zurückzugeben, können Sie die Umgebungsvariable RUSTC_FORCE_INCREMENTAL=1 verwenden.
  • Ein neuer Teil der API wurde in die Kategorie „stabil“ verschoben, einschließlich der Stabilisierung der Methoden und Implementierungen von Merkmalen:
    • std::thread::available_parallelism
    • Ergebnis::kopiert
    • Ergebnis::geklont
    • arch::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • TryFrom für u8
    • char::TryFromCharError (Klonen, Debuggen, Anzeigen, PartialEq, Kopieren, Eq, Fehler)
    • iter::zip
    • NonZeroU8::is_power_of_two
    • NonZeroU16::is_power_of_two
    • NonZeroU32::is_power_of_two
    • NonZeroU64::is_power_of_two
    • NonZeroU128::is_power_of_two
    • DoubleEndedIterator für die ToLowercase-Struktur
    • DoubleEndedIterator für die ToUppercase-Struktur
    • TryFrom<&mut [T]> für [T; N]
    • UnwindSafe für die Once-Struktur
    • RefUnwindSafe for Once
    • Armv8 Neon-Unterstützungsfunktionen, die in den Compiler für Aarch64 integriert sind
  • Das Attribut „const“, das die Möglichkeit der Verwendung in jedem Kontext anstelle von Konstanten bestimmt, wird in Funktionen verwendet:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Source: opennet.ru

Kommentar hinzufügen