Die Version 1.75 der allgemeinen Programmiersprache Rust wurde veröffentlicht, die ursprünglich von Mozilla entwickelt wurde, jetzt jedoch von der unabhängigen gemeinnützigen Organisation Rust Foundation weiterentwickelt wird. Die Sprache konzentriert sich auf sichere Speicherverwaltung und bietet Mittel für hohen Parallelismus bei der Ausführung von Aufgaben, ohne dabei einen Garbage Collector und Runtime zu benötigen (die Runtime beschränkt sich auf die grundlegende Initialisierung und den Support der Standardbibliothek).
Die Speicherverwaltungsmethoden in Rust befreien Entwickler von Fehlern beim Umgang mit Zeigern und schützen vor Problemen, die durch die Programmierung auf niedriger Ebene entstehen, wie z.B. den Zugriff auf freigegebenen Speicher, Dereferenzierung von Nullzeigern, Pufferüberläufe usw. Zur Verteilung von Bibliotheken, zur Gewährleistung des Builds und zum Management von Abhängigkeiten wird der Paketmanager Cargo entwickelt. Für die Bereitstellung von Bibliotheken wird das Repository crates.io unterstützt.
Die sichere Handhabung von Speicher in Rust wird während der Kompilierung durch die Überprüfung von Referenzen, das Verfolgen des Besitztums von Objekten, das Management der Lebensdauer von Objekten (Sichtbarkeitsbereiche) und die Bewertung der Korrektheit des Zugriffs auf den Speicher zur Laufzeit sichergestellt. Rust bietet außerdem Mechanismen zum Schutz vor ganzzahligen Überläufen, erfordert die verpflichtende Initialisierung von Variablenwerten vor der Verwendung, behandelt Fehler in der Standardbibliothek effektiver, implementiert das Konzept der Unveränderlichkeit (immutable) von Referenzen und Variablen standardmäßig und bietet eine starke statische Typisierung zur Minimierung logischer Fehler.
Hauptneuheiten:
- Die Möglichkeit zur Verwendung von „async fn“ und der Notation „-> impl Trait“ in privaten Traits wurde hinzugefügt. Zum Beispiel, indem man „-> impl Trait“ verwendet, kann man 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() } }
Es können auch Traits erstellt werden, die „async fn“ verwenden: trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // wird umgesetzt in: // fn fetch(&self, url: Url) -> impl Future; }
- Eine API zur Berechnung von Byte-Offsets relativ zu Zeigern wurde hinzugefügt. Beim Arbeiten mit rohen Zeigern («*const T» und «*mut T») können Offset-Operationen erforderlich sein. Zuvor konnte dafür eine Konstruktion wie «<*const T>::add(1)» verwendet werden, die die Anzahl der Bytes entsprechend der Größe von «size_of::()» hinzufügt. Die neue API vereinfacht diese Operation und ermöglicht es, Byte-Offsets zu manipulieren, ohne vorherige Typumwandlung in «*const u8» oder «*mut u8».
- pointer::byte_add
- pointer::byte_offset
- pointer::byte_offset_from
- pointer::byte_sub
- pointer::wrapping_byte_add
- pointer::wrapping_byte_offset
- pointer::wrapping_byte_sub
- Die Arbeiten zur Steigerung der Compiler-Leistung von rustc wurden fortgesetzt. Der Optimierer BOLT wurde hinzugefügt, der nach dem Linken arbeitet und Informationen aus einem zuvor vorbereiteten Ausführungsprofil nutzt. Der Einsatz von BOLT ermöglicht eine Verkürzung der Kompilierzeit um etwa 2 % durch eine Änderung der Anordnung des Codes in der Bibliothek librustc_driver.so für eine effizientere Nutzung des ProzessorkeCaches.
Der Compiler rustc wurde mit der Option „-Ccodegen-units=1“ konfiguriert, um die Optimierungsqualität in LLVM zu verbessern. Tests zeigen, dass die Leistung bei Verwendung der Option „-Ccodegen-units=1“ etwa um 1,5 % gesteigert wurde. Die hinzugefügten Optimierungen sind standardmäßig nur für die Plattform x86_64-unknown-linux-gnu aktiviert.
Die oben genannten Optimierungen wurden von Google getestet, um die Build-Zeit der Android-Plattformkomponenten, die in Rust geschrieben sind, zu verkürzen. Der Einsatz von „-C codegen-units=1“ beim Build für Android reduzierte die Größe der Toolchain um 5,5 % und steigerte gleichzeitig deren Leistung um 1,8 %, wobei sich die Build-Zeit der Toolchain fast verdoppelte.
Die Aktivierung der Müllsammlung während der Verlinkung („—gc-sections“) ermöglichte eine Leistungssteigerung von 1,9 %, die Aktivierung der Link-Time-Optimierung (LTO) von 7,7 % und die optimierte Profilerstellung (PGO) von 19,8 %. Schließlich wurden Optimierungen mit dem Tool BOLT angewendet, die die Buildgeschwindigkeit um 24,7 % steigerten, während die Größe der Toolchain um 10,9 % zunahm.

- Eine neue Reihe von APIs wurde stabilisiert und in die stabile Version überführt, einschließlich stabilisierter Methoden und Implementierungen von Traits:
- Atomic*::from_ptr
- FileTimes
- FileTimesExt
- File::set_modified
- File::set_times
- IpAddr::to_canonical
- Ipv6Addr::to_canonical
- Option::as_slice
- Option::as_mut_slice
- pointer::byte_add
- pointer::byte_offset
- pointer::byte_offset_from
- pointer::byte_sub
- pointer::wrapping_byte_add
- pointer::wrapping_byte_offset
- pointer::wrapping_byte_sub
- Das „const“-Merkmal, das die Verwendung in jedem Kontext anstelle von Konstanten ermöglicht, wurde in den Funktionen angewendet:
- Ipv6Addr::to_ipv4_mapped
- MaybeUninit::assume_init_read
- MaybeUninit::zeroed
- mem::discriminant
- mem::zeroed
- Die dritte Unterstützungsebene wurde für die Plattform csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd und mipsel-unknown-netbsd implementiert. Die dritte Ebene bedeutet grundlegende Unterstützung, jedoch ohne automatisierte Tests, Veröffentlichung offizieller Builds und Überprüfung der Möglichkeit zur Codekompilierung.
Zusätzlich ist die neue Version des Hermit-Projekts erwähnenswert, das einen spezialisierten Unikernel entwickelt, der in Rust geschrieben ist und Werkzeuge zur Erstellung autonomer Anwendungen bereitstellt, die direkt auf einem Hypervisor oder nacktem Material ohne zusätzliche Schichten und ohne Betriebssystem laufen können. Bei der Erstellung wird die Anwendung statisch mit einer Bibliothek verbunden, die alle notwendigen Funktionalitäten eigenständig implementiert, ohne an den Betriebssystem-Kernel und an Systembibliotheken gebunden zu sein. Der Code des Projekts wird unter den Lizenzen Apache 2.0 und MIT distribuiert. Es wird die Erstellung von isolierten Anwendungen unterstützt, die in Rust, Go, Fortran, C und C++ geschrieben sind. Außerdem entwickelt das Projekt einen eigenen Bootloader, der das Starten von Hermit mit QEMU ermöglicht und... KVM.
Quelle: opennet.ru

