Veröffentlichung der Programmiersprache Rust 1.64

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

  • Die Anforderungen an die Linux-Umgebung im Compiler, im Cargo-Paketmanager und in der Standardbibliothek libstd wurden erhöht – die Mindestanforderungen für Glibc wurden von Version 2.11 auf 2.17 und für den Linux-Kernel von Version 2.6.32 auf 3.2 angehoben. Die Einschränkungen gelten auch für Rust-Binärdateien, die mit libstd erstellt wurden. Die Distributionen RHEL 7, SLES 12-SP5, Debian 8 und Ubuntu 14.04 erfüllen die neuen Anforderungen. Die Unterstützung für RHEL 6, SLES 11-SP4, Debian 7 und Ubuntu 12.04 wird eingestellt. Benutzern, die von Rust erstellte ausführbare Dateien in Umgebungen mit älteren Linux-Kerneln verwenden, wird empfohlen, ihre Systeme zu aktualisieren, auf älteren Compiler-Versionen zu bleiben oder ihren eigenen libstd-Zweig mit Ebenen zu verwalten, um die Kompatibilität aufrechtzuerhalten.

    Einer der Gründe für die Einstellung der Unterstützung für ältere Linux-Systeme sind begrenzte Ressourcen, um die Kompatibilität mit älteren Umgebungen weiterhin aufrechtzuerhalten. Die Unterstützung älterer Glibcs ​​erfordert die Verwendung älterer CI-Prüfungen, erhöhte Versionierungsanforderungen in LLVM und Dienstprogramme zur Cross-Compilation. Der Anstieg der Kernel-Versionsanforderungen ist auf die Fähigkeit von libstd zurückzuführen, neue Systemaufrufe zu verwenden, ohne dass Schichten verwaltet werden müssen, um die Kompatibilität mit älteren Kerneln sicherzustellen.

  • Das IntoFuture-Merkmal wurde stabilisiert, das dem IntoIterator ähnelt, sich jedoch von diesem durch die Verwendung von „.await“-Schleifen anstelle von „for … in …“-Schleifen unterscheidet. In Kombination mit IntoFuture kann das Schlüsselwort „.await“ nicht nur das Future-Merkmal erwarten, sondern auch alle anderen Typen, die in Future konvertiert werden können.
  • Das Dienstprogramm „rust-analyzer“ ist in der Sammlung von Dienstprogrammen enthalten, die mit Rust-Versionen geliefert werden. Das Dienstprogramm ist auch für die Installation mit Rustup verfügbar (Rustup-Komponente fügt Rust-Analyzer hinzu).
  • Der Cargo-Paketmanager implementiert die Arbeitsbereichsvererbung, um Duplikate zwischen Paketen typischer Feldwerte, wie Rust-Versionen und Repository-URLs, zu vermeiden. Außerdem wurde Unterstützung für das gleichzeitige Erstellen mehrerer Zielplattformen hinzugefügt (mehr als ein Parameter kann jetzt in der Option „--target“ angegeben werden).
  • Ein neuer Teil der API wurde in die Kategorie „stabil“ verschoben, einschließlich der Stabilisierung der Methoden und Implementierungen von Merkmalen:
    • Zukunft::IntoFuture
    • num::NonZero*::checked_mul
    • num::NonZero*::checked_pow
    • num::NonZero*::saturating_mul
    • num::NonZero*::saturating_pow
    • num::NonZeroI*::abs
    • num::NonZeroI*::checked_abs
    • num::NonZeroI*::overflowing_abs
    • num::NonZeroI*::saturating_abs
    • num::NonZeroI*::unsigned_abs
    • num::NonZeroI*::wrapping_abs
    • num::NonZeroU*::checked_add
    • num::NonZeroU*::checked_next_power_of_two
    • num::NonZeroU*::saturating_add
    • os::unix::process::CommandExt::process_group
    • os::windows::fs::FileTypeExt::is_symlink_dir
    • os::windows::fs::FileTypeExt::is_symlink_file
  • C-kompatible Typen, die zuvor im Modul std::ffi stabilisiert wurden, wurden dem Kern und der Alloc-Bibliothek hinzugefügt:
    • core::ffi::CStr
    • core::ffi::FromBytesWithNulError
    • alloc::ffi::CString
    • alloc::ffi::FromVecWithNulError
    • alloc::ffi::IntoStringError
    • alloc::ffi::NulError
  • Die zuvor im Modul std::os::raw stabilisierten C-Typen wurden zu den Modulen core::ffi und std::ffi hinzugefügt (für die C-Typen uint und ulong wurden beispielsweise die Typen c_uint und c_ulong vorgeschlagen). ):
    • ffi::c_char
    • ffi::c_double
    • ffi::c_float
    • ffi::c_int
    • ffi::c_long
    • ffi::c_longlong
    • ffi::c_schar
    • ffi::c_short
    • ffi::c_uchar
    • ffi::c_uint
    • ffi::c_ulong
    • ffi::c_ulonglong
    • ffi::c_ushort
  • Low-Level-Handler wurden für die Verwendung mit dem Poll-Mechanismus stabilisiert (in Zukunft ist geplant, eine vereinfachte API bereitzustellen, die nicht die Verwendung von Pull- und Pin-Strukturen auf niedriger Ebene erfordert):

    • Future::poll_fn
    • Aufgabe::bereit!
  • Das Attribut „const“, das die Möglichkeit seiner Verwendung anstelle von Konstanten in jedem Kontext bestimmt, wird in der Funktion „slice::from_raw_parts“ verwendet.
  • Um Daten kompakter zu speichern, wurde das Speicherlayout der Strukturen Ipv4Addr, Ipv6Addr, SocketAddrV4 und SocketAddrV6 geändert. Kann die Kompatibilität mit Single-Crate-Paketen beeinträchtigen, die std::mem::transmute für die Strukturmanipulation auf niedriger Ebene verwenden.
  • Die Assemblierung des Rust-Compilers für die Windows-Plattform nutzt PGO-Optimierungen (Profil-Guided Optimization), wodurch die Code-Kompilierungsleistung um 10-20 % gesteigert werden konnte.
  • Der Compiler hat eine neue Warnung vor nicht verwendeten Feldern in bestimmten Strukturen implementiert.

Darüber hinaus können wir den Statusbericht zur Entwicklung einer alternativen Implementierung des Rust-Sprachcompilers zur Kenntnis nehmen, der vom gccrs-Projekt (GCC Rust) erstellt und zur Aufnahme in GCC genehmigt wurde. Nach der Integration des Frontends kann das Standard-GCC-Toolkit zum Kompilieren von Rust-Programmen verwendet werden, ohne dass der mit LLVM-Entwicklungen erstellte Rustc-Compiler installiert werden muss. Solange die Entwicklung nach Plan verläuft und keine unvorhergesehenen Probleme auftreten, wird das Rust-Sprach-Frontend in die für Mai nächsten Jahres geplante Veröffentlichung von GCC 13 integriert. Die Rust-Implementierung in GCC 13 befindet sich im Beta-Status und ist noch nicht standardmäßig aktiviert.

Source: opennet.ru

Kommentar hinzufügen