Veröffentlichung der Programmiersprache Rust 1.38

Veröffentlicht Release der Systemprogrammiersprache Rust 1.38, basierend auf dem Projekt von Mozilla. Die Sprache konzentriert sich auf sichere Speicherverwaltung, bietet automatisches Speichermanagement und stellt Werkzeuge zur Verfügung, um hohen Parallelismus bei der Ausführung von Aufgaben zu erreichen, ohne auf einen Garbage Collector und Runtime angewiesen zu sein.

Das automatische Speichermanagement in Rust befreit den Entwickler von der Manipulation von Zeigern und schützt vor Problemen, die aus der niederleveligen Speicherbearbeitung resultieren, wie das Zugreifen auf freigegebenen Speicher, Dereferenzierung von Nullzeigern und Buffer-Überläufen. Für die Verteilung von Bibliotheken, den Aufbau und das Management von Abhängigkeiten entwickelt sich der Paketmanager Cargo, der es ermöglicht, die benötigten Bibliotheken für das Programm mit einem Klick zu erhalten. Für die Bereitstellung von Bibliotheken wird das Repository crates.io.

Haupt Neuheiten:

  • Der neue Pipelines-Modus für die Kompilierung ermöglicht es, mit der Erstellung abhängiger Crate-Pakete zu beginnen, sobald die Metadaten der Abhängigkeiten verfügbar sind, ohne auf den Abschluss der Kompilierung zu warten. Für die Kompilierung eines Pakets ist es nicht erforderlich, dass alle Abhängigkeiten vollständig kompiliert sind; es genügt, dass die Metadaten, die Typlisten, Abhängigkeiten und exportierte Elemente enthalten, definiert sind. Die Metadaten sind zu Beginn des Kompilierungsprozesses verfügbar, sodass verwandte Pakete nun viel früher kompilierbar sind. Beim Kompilieren einzelner Pakete hat dieser neue Modus keinen Einfluss auf die Leistung, aber wenn die Kompilierung Pakete mit verzweigten Abhängigkeiten umfasst, kann die gesamte Kompilierungszeit um 10-20 % verkürzt werden.
  • Fehlerhafte Anwendung von Funktionen wurde identifiziert std::mem::uninitialized und std::mem::zeroed. Zum Beispiel ist std::mem::uninitialized nützlich, um schnell Arrays zu erstellen, führt jedoch den Compiler in die Irre, da es den Anschein erweckt, als ob eine Initialisierung erfolgt, während der Wert tatsächlich uninitialisiert bleibt. Die Funktion mem::uninitialized ist bereits als veraltet markiert, und es wird empfohlen, stattdessen einen Zwischenwert zu verwenden. MaybeUninit. Was mem::zeroed betrifft, so kann diese Funktion zu Problemen mit Typen führen, die keine Nullwerte akzeptieren können.

    Um aufgerufenes undefiniertes Verhalten in der neuen Version zu erkennen, wurde im Compiler eine lint-Prüfung hinzugefügt, die einige Probleme mit mem::uninitialized oder mem::zeroed aufdeckt. Zum Beispiel wird jetzt ein Fehler ausgegeben, wenn versucht wird, mem::uninitialized oder mem::zeroed mit den Typen &T und Box‹T› zu verwenden, die Pointer-Objekte darstellen, die keine Nullwerte akzeptieren können.

  • Die Verwendung des Attributs „#[deprecated]“ wurde erweitert, sodass crate-Pakete als veraltet und zur zukünftigen Entfernung gekennzeichnet werden können. Seit Rust-Version 1.38 kann dieses Attribut auch für Makros verwendet werden.
  • Es wurde die Möglichkeit hinzugefügt, das Attribut „#[global_allocator]“ in Submodulen anzuwenden.
  • Funktion hinzugefügt std::any::type_name, die es ermöglicht, den Typnamen zu erfahren, was in Debugging-Situationen nützlich sein kann. Beispielsweise kann man im Verlauf der Programmausführung herausfinden, für welchen Typ die Funktion aufgerufen wurde:

    fn gen_value‹T: Default›() -> T {
    println!(«Eine Instanz von {} wird initialisiert», std::any::type_name::‹T›());
    Default::default()
    }

    fn main() {
    let _: i32 = gen_value(); # gibt «i32» aus
    let _: String = gen_value(); # gibt «alloc::string::String» aus
    }

  • Die Funktionen der Standardbibliothek wurden erweitert:
    • slice::{concat, connect, join} kann nun Werte von & [T] neben &T annehmen;
    • «*const T» und «*mut T» implementieren jetzt marker::Unpin;
    • «Arc‹[T]›» und «Rc‹[T]›» implementieren nun FromIterator‹T›;
    • iter::{StepBy, Peekable, Take} implementieren jetzt DoubleEndedIterator.
    • ascii::EscapeDefault implementiert Clone und Display.
  • Eine neue Charge von APIs wurde als stabil eingestuft, darunter wurden die Methoden stabilisiert
    • ‹*const T›::cast, ‹*mut T›::cast,
    • Duration::as_secs_f{32|64},
    • Duration::div_duration_f{32|64},
    • Duration::div_f{32|64},
    • Duration::from_secs_f{32|64},
    • Duration::mul_f{32|64},
    • Restdivision
      div_euclid und rem_euclid für alle ganzzahligen Primitiven;
  • Der Paketmanager cargo hat die Unterstützung für die mehrfache Angabe der Option «—features» hinzugefügt, um verschiedene Möglichkeiten zu aktivieren;
  • Im Compiler wurde eine dritte Stufe gewährleistet 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, armv7-unknown-linux-gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl und riscv32i-unknown-none-elf. Die dritte Stufe umfasst eine grundlegende Unterstützung, jedoch ohne automatisierte Tests und die Veröffentlichung offizieller Builds.

Quelle: opennet.ru

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster