Veröffentlichung der Programmiersprache Rust 1.75 und Unikernel Hermit 0.6.7

Die Veröffentlichung der universellen Programmiersprache Rust 1.75, 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 wurde die Möglichkeit hinzugefügt, „async fn“ und die Notation „->impl Trait“ in privaten Merkmalen zu verwenden. Mit „->impl Trait“ können Sie beispielsweise eine Trait-Methode schreiben, die einen Iterator zurückgibt: trait Container { fn items(&self) -> impl Iterator; } impl Container für MyContainer { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }

    Sie können Merkmale auch mit „async fn“ erstellen: trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // wird erweitert zu: // fn fetch(&self, url: Url) -> impl Future; }

  • API zur Berechnung von Byte-Offsets relativ zu Zeigern hinzugefügt. Beim Arbeiten mit bloßen Zeigern („*const T“ und „*mut T“) sind möglicherweise Operationen erforderlich, um dem Zeiger einen Offset hinzuzufügen. Bisher war es möglich, hierfür eine Konstruktion wie „::add(1)“ zu verwenden und die Anzahl der Bytes entsprechend der Größe von „size_of::()“ hinzuzufügen. Die neue API vereinfacht diesen Vorgang und ermöglicht die Manipulation von Byte-Offsets, ohne die Typen zunächst in „*const u8“ oder „*mut u8“ umzuwandeln.
    • Zeiger::byte_add
    • Zeiger::byte_offset
    • Zeiger::byte_offset_from
    • Zeiger::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • Fortsetzung der Arbeit zur Steigerung der Leistung des Rustc-Compilers. Der BOLT-Optimierer wurde hinzugefügt, der in der Post-Link-Phase ausgeführt wird und Informationen aus einem vorgefertigten Ausführungsprofil verwendet. Durch die Verwendung von BOLT können Sie die Compilerausführung um etwa 2 % beschleunigen, indem Sie das Layout des Bibliothekscodes librustc_driver.so ändern, um den Prozessor-Cache effizienter zu nutzen.

    Enthalten ist die Erstellung des Rustc-Compilers mit der Option „-Ccodegen-units=1“, um die Qualität der Optimierung in LLVM zu verbessern. Die durchgeführten Tests zeigen eine Leistungssteigerung beim Build „-Ccodegen-units=1“ um ca. 1.5 %. Die hinzugefügten Optimierungen sind standardmäßig nur für die Plattform x86_64-unknown-linux-gnu aktiviert.

    Die zuvor genannten Optimierungen wurden von Google getestet, um die Erstellungszeit von in Rust geschriebenen Android-Plattformkomponenten zu verkürzen. Durch die Verwendung von „-C codegen-units=1“ beim Erstellen von Android konnten wir die Größe des Toolkits um 5.5 % reduzieren und seine Leistung um 1.8 % steigern, während sich die Erstellungszeit des Toolkits selbst fast verdoppelte.

    Durch die Aktivierung der Link-Time-Garbage-Collection („--gc-sections“) konnte eine Leistungssteigerung von bis zu 1.9 % erzielt werden, wodurch eine Link-Time-Optimierung (LTO) von bis zu 7.7 % und profilbasierte Optimierungen (PGO) von bis zu 19.8 % ermöglicht wurden. Im Finale wurden Optimierungen mithilfe des BOLT-Dienstprogramms vorgenommen, was eine Steigerung der Build-Geschwindigkeit auf 24.7 % ermöglichte, die Größe des Toolkits jedoch um 10.9 % zunahm.

    Veröffentlichung der Programmiersprache Rust 1.75 und Unikernel Hermit 0.6.7

  • Ein neuer Teil der API wurde in die Kategorie „stabil“ verschoben, einschließlich der Stabilisierung der Methoden und Implementierungen von Merkmalen:
    • Atomic*::from_ptr
    • FileTimes
    • FileTimesExt
    • Datei::set_modified
    • Datei::set_times
    • IpAddr::to_canonical
    • Ipv6Addr::to_canonical
    • Option::as_slice
    • Option::as_mut_slice
    • Zeiger::byte_add
    • Zeiger::byte_offset
    • Zeiger::byte_offset_from
    • Zeiger::byte_sub
    • pointer::wrapping_byte_add
    • pointer::wrapping_byte_offset
    • pointer::wrapping_byte_sub
  • Das Attribut „const“, das die Möglichkeit der Verwendung in jedem Kontext anstelle von Konstanten bestimmt, wird in Funktionen verwendet:
    • Ipv6Addr::to_ipv4_mapped
    • MaybeUninit::assume_init_read
    • MaybeUninit::zeroed
    • mem::Diskriminante
    • mem::nulliert
  • Die dritte Unterstützungsebene wurde für die Plattformen csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd und mipsel-unknown-netbsd implementiert. Die dritte Ebene umfasst grundlegende Unterstützung, jedoch ohne automatisierte Tests, Veröffentlichung offizieller Builds oder Prüfung, ob der Code erstellt werden kann.

Darüber hinaus können wir eine neue Version des Hermit-Projekts erwähnen, das einen spezialisierten Kernel (Unikernel) entwickelt, der in der Rust-Sprache geschrieben ist und Tools zum Erstellen eigenständiger Anwendungen bereitstellt, die auf einem Hypervisor oder nackter Hardware ohne zusätzliche Schichten ausgeführt werden können und ohne Betriebssystem. Beim Erstellen wird die Anwendung statisch mit einer Bibliothek verknüpft, die alle erforderlichen Funktionen unabhängig implementiert, ohne an den Betriebssystemkernel und die Systembibliotheken gebunden zu sein. Der Projektcode wird unter Apache 2.0- und MIT-Lizenzen vertrieben. Assembly wird für die eigenständige Ausführung von Anwendungen unterstützt, die in Rust, Go, Fortran, C und C++ geschrieben sind. Das Projekt entwickelt außerdem einen eigenen Bootloader, der es Ihnen ermöglicht, Hermit mit QEMU und KVM zu starten.

Source: opennet.ru

Kommentar hinzufügen