Programmiersprache Rust 1.60 zeigt Codeabdeckung und sieht Zeitspannen positiv
Der Compiler bietet eine Anbindung an die sourcebasierte Codeabdeckung von LLVM. Außerdem stolpert die Sprache nicht mehr über scheinbar negative Zeitspannen.
![](https://heise.cloudimg.io/width/610/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/3/4/4/9/6/8/1/Rust.jpg-7e8feee13c67deee.jpeg)
(Bild: Callum Bainbridge / Shutterstock.com)
Planmäßig im Sechswochentakt ist Rust 1.60 erschienen. Das aktuelle Release bringt vor allem Ergänzungen in der Toolchain und für den Paketmanager Cargo. Die Sprache selbst erhält keine nennenswerten Ergänzungen, aber das Berechnen von Zeiträumen über Instant
funktioniert nun ohne systembedingte Stolpersteine.
Der Compiler arbeitet auch wieder inkrementell, nachdem das inkrementelle Kompilieren in Rust 1.59 deaktiviert worden war aufgrund eines Bugs, der zu Deserialisierungsfehlern führen konnte. Der Fehler ist wohl weitgehend, wenngleich noch nicht vollständig, behoben.
Bericht über die Abdeckung
Die Anbindung an die sourcebasierte Codeabdeckung über die Compiler-Infrastruktur LLVM gilt ab sofort als stabil. Sie lässt sich über die Konfiguration -Cinstrument-coverage
aktivieren. Das anschließend erstellte Binary generiert beim Ausführen im aktuellen Verzeichnis die Datei default.profraw.
Zum Auswerten der Ergebnisse dient eine Komponente für das Zusammenspiel mit den LLVM-Tools, die sich über das Tool rustup
installieren lässt:
rustup component add llvm-tools-preview
Die Komponente enthält llvm-profdata
und llvm-cov
. Ersteres verarbeitete die Rohdaten der Ausgabe und führt sie zusammen, Letzteres erstellt den Bericht über die Codeabdeckung. Dazu verbindet llvm-cov
die Ausgabe von llvm-profdata
mit den Informationen im Binary zu den tatsächlichen Bereichen im Sourcecode.
Der Rust-Blog zeigt als Beispiel den Bericht zu einem einfachen Hello-World-Programm mit einer hundertprozentigen Codeabdeckung, in der jede Zeile einmal aktiv war:
1| 1|fn main() {
2| 1| println!("Hello, world!");
3| 1|}
Auch wenn die Komponente "preview" im Namen trägt, gilt die Integration in den Rust-Compiler rustc
als stabil. Der Namenszusatz zeigt jedoch an, dass sich das Tooling und das Ausgabeformat in den kommenden Releases noch ändern könnte.
Paketverwaltung mit Abhängigkeiten
Die Paketverwaltung Cargo ergänzt den Umgang mit optionalen Dependencies, die nicht standardmäßig, sondern nur bei Bedarf kompiliert werden. Das aktuelle Release bietet dafür Namespaces über das Präfix dep:
, um explizit eine optionale Abhängigkeit zu nutzen, ohne sie damit wie bisher automatisch als Feature zu definieren.
Über sogenannt Weak Dependencies mit der Syntax "paket?/feature"
lässt sich das in der Zeichenkette hinten stehende Feature nur für den Fall aktivieren, dass die Dependency zu dem vorne aufgeführten Paket bereits von einer anderen Codepassage genutzt wird. Folgendes Beispiel aus dem Blog zeigt beide Neuerungen:
[dependencies]
serde = { version = "1.0.133", optional = true }
rgb = { version = "0.8.25", optional = true }
[features]
serde = ["dep:serde", "rgb?/serde"]
Dabei aktiviert das für die Serialisierung vorgesehene Feature serde
die gleichnamige Depency. Zudem aktiviert es das ebenfalls gleichnamige Feature in der rgb
-Dependency – allerdings nur, wenn anderer Code die Abhängigkeit nutzt.
In Bezug auf den Paketmanager ist noch erwähnenswert, dass für das Tool cargo
das Flag --timings
zum Sammeln von Informationen beim Build-Prozess im aktuellen Release als stabil gilt.
Garantiert monoton
Eine Anpassung unter der Haube betrifft das Messen von Zeiträumen über das Struct Instant
in der Standard-Library von Rust. Es dient laut Definition zum Messen einer monoton nicht fallenden Zeitangabe (monotonically non decreasing clock). Dazu greift Rust auf die APIs des jeweiligen Betriebssystems zurück.
Allerdings kann es wohl aus unterschiedlichen Gründen wie Fehlern im Betriebssystem, Problemen mit der Hardware oder bei der Virtualisierung zu negativen Werten kommen, was wiederum einen Abbruch des Programms mit panic!
auslöst. Der Fehler war für Entwicklerinnen und Entwickler schwer nachvollziehbar, da er von der jeweiligen Konfiguration des Zielsystems abhängt.
Rust 1.60 setzt nach dem Prinzip der Sättigungsarithmetik den Mindestwert für Instant::duration_since
, Instant::elapsed
und Instant::sub
intern auf 0, um den Fehler zu unterbinden.
Weitere Details zu Rust 1.60 lassen sich dem Rust-Blog entnehmen. Wie üblich können Entwicklerinnen und Entwickler, die Rust bereits installiert haben, das aktuelle Release über rustup update stable
herunterladen. Für diejenigen, die noch kein Rust verwenden, ist das rustup
-Tool auf der Download-Seite separat verfügbar.
Kurz vor dem Release hatte das Rust-Language-Design-Team einen Ausblick auf die nächste Edition der Programmiersprache Rust 2024 veröffentlicht.
(rme)