Rust 1.38.0 Release: Pipeline-Kompilierung, # [veraltet] für Makros und std :: any :: type_name

Das Rust-Entwicklungsteam freut sich, die Veröffentlichung einer neuen Version 1.38.0 bekannt zu geben. Rust ist eine Programmiersprache, mit der jeder zuverlässige und effiziente Software erstellen kann.


Wenn Sie die vorherige Version von Rust mit rustup installiert haben, müssen Sie zum Aktualisieren auf Version 1.38.0 nur den folgenden Befehl ausführen:


rustup update stable 

Wenn Sie rustup noch nicht installiert haben, können Sie es von der entsprechenden Seite unserer Website installieren .


Was ist in der stabilen Version enthalten?


Das Highlight dieser Version ist die Pipeline-Kompilierung.


Pipeline-Kompilierung


Der Compiler benötigt keine vollständig zusammengestellten Abhängigkeiten, um das Paket zu erstellen, sondern nur deren "Metadaten" (Liste der Typen, Abhängigkeiten, Exporte usw.), die in einem frühen Stadium der Kompilierung generiert wurden. Ab Rust 1.38.0 beginnt Cargo sofort mit der Erstellung abhängiger Pakete, sobald deren Metadaten verfügbar sind.


Die Erstellungszeit eines Pakets hat sich nicht verringert, aber unsere Tests haben gezeigt, dass die Kompilierungsgeschwindigkeit bei optimierten Erstellungen (bei denen einige Abhängigkeiten bereits kompiliert wurden) um 10% bis 20% zunimmt. Bei anderen Paketen ist eine starke Erhöhung der Kompilierungsgeschwindigkeit nicht aufgetreten. Die zum Erstellen des Pakets erforderliche Zeit hängt vom Computer ab, sodass die Leistung variieren kann. Die Pipeline-Kompilierung wird ab Version 1.38.0 automatisch aktiviert.


Überprüfung auf Missbrauch von mem::{uninitialized, zeroed}


Wie bereits angekündigt , wird std::mem::uninitialized nicht empfohlen. Stattdessen sollte MaybeUninit<T> verwendet werden.


Die Funktion mem::uninitialized ist noch nicht veraltet, wird jedoch in zukünftigen Versionen durchgeführt. Trotzdem sucht rustc ab 1.38.0 mit mem::uninitialized oder mem::zeroed rustc nach einer engen Klasse falscher Initialisierungen.


Bei einigen Typen wie &T und Box<T> wird ein Nullwert als undefiniertes Verhalten betrachtet, da es sich um zeigerähnliche Objekte handelt, die nicht null . Es ist ein Fehler, mem::uninitialized oder mem::zeroed zum Initialisieren dieser Typen zu verwenden. Der Compiler versucht daher, Sie zu warnen, wenn eine dieser Funktionen zum Initialisieren der oben genannten Objekte verwendet wird, und es spielt keine Rolle, ob sie direkt oder als initialisiert werden Felder mit großer Struktur. Diese Prüfung ist rekursiv, daher enthält der folgende Code eine Warnung:


 struct Wrap<T>(T); struct Outer(Wrap<Wrap<Wrap<Box<i32>>>>); struct CannotBeZero { outer: Outer, foo: i32, bar: f32 } ... let bad_value: CannotBeZero = unsafe { std::mem::uninitialized() }; 

Aufmerksame Leser werden möglicherweise feststellen, dass die Standardbibliothek mehr Typen enthält, die nicht mit Nullen gefüllt werden sollten, insbesondere NonNull<T> und NonZero<T> . Bisher wurde die Initialisierung dieser Strukturen mit mem::uninitialized oder mem::zeroed nicht verifiziert.


Diese Überprüfungen decken nicht alle Fälle von unsachgemäßer Verwendung von mem::uninitialized oder mem::zeroed , sondern ermöglichen es Ihnen, einen garantierten falschen Code zu erkennen, der zu MaybeUninit wechseln MaybeUninit .


#[deprecated] für Makros


Mit dem Attribut #[deprecated] , das erstmals in Rust 1.9.0 eingeführt wurde, können Paketautoren Benutzer über veraltete Funktionen informieren, die sie in zukünftigen Versionen entfernen möchten. Mit Rust 1.38.0 können Sie dieses Attribut auf Makros anwenden.


std::any::type_name


Beim Debuggen von Code ist möglicherweise eine Zeichenfolgendarstellung des verwendeten Typs erforderlich. Beispielsweise möchten Sie im Hauptteil einer generischen Funktion möglicherweise den Typ des übergebenen Arguments drucken. Dies ist nun mit std::any::type_name :


 fn gen_value<T: Default>() -> T { println!("Initializing an instance of {}", std::any::type_name::<T>()); Default::default() } fn main() { let _: i32 = gen_value(); let _: String = gen_value(); } 

Ergebnis:


 Initializing an instance of i32 Initializing an instance of alloc::string::String 

Wie alle Funktionen der Standardbibliothek, die nur zum Debuggen vorgesehen sind, garantiert diese Funktion nicht den genauen Inhalt und das Format der Zeichenfolge. Der Rückgabewert ist die beste Beschreibung des Typs. type_name Typen können durch denselben type_name , sie können sich jedoch in zukünftigen Versionen des Compilers ändern.


Änderungen an der Standardbibliothek



Darüber hinaus wurden einige Funktionen stabilisiert:



Andere Änderungen


Die Syntax , der Frachtpaket-Manager und der Clippy-Analysator wurden ebenfalls geändert.


Mitglieder 1.38.0


Viele Leute kamen zusammen, um Rust 1.38.0 zu erstellen. Ohne euch alle hätten wir das nicht geschafft, danke !


Von Übersetzern


Bei Fragen zur Rust-Sprache können sie Ihnen im russischsprachigen Telegramm-Chat oder in einem ähnlichen Chat für Neulinge helfen.


Dieser Artikel wurde gemeinsam von andreevlex , nlinker , funkill und Gymmasssorla übersetzt .

Source: https://habr.com/ru/post/de469061/


All Articles