Veröffentlichung der Programmiersprache Rust 1.38

Veröffentlicht Veröffentlichung der Systemprogrammiersprache Rost 1.38, gegründet vom Mozilla-Projekt. Die Sprache konzentriert sich auf die Speichersicherheit, bietet eine automatische Speicherverwaltung und bietet eine Möglichkeit, eine hohe Aufgabenparallelität zu erreichen, ohne einen Garbage Collector oder eine Laufzeit zu verwenden.

Die automatische Speicherverwaltung von Rust befreit den Entwickler von Zeigermanipulationen und schützt vor Problemen, die durch Speichermanipulation auf niedriger Ebene entstehen, wie z. B. After-Free-Speicherzugriffe, Nullzeiger-Dereferenzierungen, Pufferüberläufe und dergleichen. Es wird ein Paketmanager entwickelt, um Bibliotheken zu verteilen, die Assemblierung sicherzustellen und Abhängigkeiten durch das Projekt zu verwalten. Kastenwagen, wodurch Sie mit einem Klick auf die Bibliotheken zugreifen können, die Sie für das Programm benötigen. Ein Repository wird zum Hosten von Bibliotheken unterstützt Kisten.io.

Haupt- Innovationen:

  • Es wurde ein Pipeline-Kompilierungsmodus (pipelined) hinzugefügt, bei dem die Erstellung eines abhängigen Crate-Pakets beginnt, sobald die Abhängigkeitsmetadaten verfügbar werden, ohne auf den Abschluss der Kompilierung zu warten. Beim Kompilieren eines Pakets müssen die Abhängigkeiten nicht vollständig zusammengestellt werden. Es müssen lediglich die Metadaten definiert werden, zu denen Listen mit Typen, Abhängigkeiten und exportierten Elementen gehören. Metadaten werden frühzeitig im Kompilierungsprozess zur Verfügung gestellt, sodass verknüpfte Pakete jetzt viel früher kompiliert werden können. Beim Erstellen einzelner Pakete hat der vorgeschlagene Modus keinen Einfluss auf die Leistung. Wenn der Build jedoch Pakete mit verzweigten Abhängigkeiten umfasst, kann die Gesamtbuildzeit um 10–20 % reduziert werden.
  • Gewährleistet die Erkennung fehlerhafter Funktionsnutzung std::mem::uninitialized и std::mem::zeroed. Beispielsweise eignet sich std::mem::uninitialized zum schnellen Erstellen von Arrays, führt den Compiler jedoch in die Irre, da es scheinbar initialisiert ist, der Wert jedoch in Wirklichkeit nicht initialisiert bleibt. Die Funktion mem::uninitialized ist bereits als veraltet markiert und es wird empfohlen, stattdessen einen Zwischentyp zu verwenden MaybeUnit. Was mem::zeroed betrifft, kann diese Funktion Probleme mit Typen verursachen, die keine Nullwerte akzeptieren können.

    Um undefiniertes Verhalten zu identifizieren, fügt die neue Version dem Compiler eine Lint-Prüfung hinzu, die einige Probleme mit mem::uninitialized oder mem::zeroed erkennt. Beispielsweise erhalten Sie jetzt eine Fehlermeldung, wenn Sie versuchen, mem::uninitialized oder mem::zeroed mit den Typen &T und Box‹T› zu verwenden, die Zeigerobjekte darstellen, die keine Nullwerte akzeptieren können;

  • Das Attribut „#[deprecated]“ wurde erweitert, um es zu ermöglichen, Crate-Pakete als veraltet zu markieren und für die zukünftige Löschung einzuplanen. Ab Rust 1.38 kann dieses Attribut auch für Makros verwendet werden;
  • Möglichkeit hinzugefügt, das Attribut „#[global_allocator]“ in Submodulen zu verwenden;
  • Funktion hinzugefügt std::any::type_name, wodurch Sie den Namen des Typs herausfinden können, was für Debugging-Zwecke nützlich sein kann. Während der Programmausführung können Sie beispielsweise herausfinden, für welchen Typ die Funktion aufgerufen wurde:

    fn gen_value‹T: Default>() -› T {
    println!("Initialisierung einer Instanz von {}", std::any::type_name::‹T›());
    Default::default()
    }

    fn main() {
    let _: i32 = gen_value(); # „i32“ wird gedruckt
    let _: String = gen_value(); # gibt „alloc::string::String“ aus
    }

  • Erweiterte Funktionen der Standardbibliothek:
    • Slice::{concat, connect, join} kann jetzt zusätzlich zu &T den Wert &[T] annehmen;
    • „*const T“ und „*mut T“ implementieren jetzt marker::Unpin;
    • „Arc‹[T]›“ und „Rc‹[T]›“ implementieren jetzt FromIterator‹T›;
    • iter::{StepBy, Peekable, Take} implementiert jetzt DoubleEndedIterator.
    • ascii::EscapeDefault implementiert Klonen und Anzeigen.
  • Ein neuer Teil der APIs wurde in die stabile Kategorie überführt, darunter auch stabilisierte Methoden
    • ‹*const T›::cast, ‹*mut T›::cast,
    • Dauer::as_secs_f{32|64},
    • Dauer::div_duration_f{32|64},
    • Dauer::div_f{32|64},
    • Dauer::from_secs_f{32|64},
    • Dauer::mul_f{32|64},
    • Divisionsoperationen mit Rest
      div_euclid und rem_euclid für alle ganzzahligen Grundelemente;

  • Unterstützung für die mehrfache Angabe der Option „--features“ hinzugefügt, um verschiedene Funktionen im Frachtpaket-Manager zu aktivieren;
  • Der Compiler stellt einen dritten bereit Ebene Unterstützung für die Zielplattformen aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-msvc-Ziele, armv7-unknown-linux -gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl und riscv32i-unknown-none-elf. Die dritte Ebene umfasst Basisunterstützung, jedoch ohne automatisierte Tests und Veröffentlichung offizieller Builds.

Source: opennet.ru

Kommentar hinzufügen