Programmiersprache Rust 1.59 integriert Assembler-Code
Die direkte Einbindung der Assemblersprache ermöglicht systemnahen Low-Level-Code in Rust-Programmen.

(Bild: Callum Bainbridge / Shutterstock.com)
Im planmäßigen Sechswochenrhythmus ist Rust 1.59 erschienen. Im Vergleich zu den vorigen beiden Punktreleases bringt die aktuelle Version mehr Neuerungen mit. Unter anderem lässt sich für einige Plattformen Assembler-Code in Rust-Programmen verwenden. Außerdem können Tupel nun auf der linken Seite von destrukturierenden Zuweisungen stehen, und generische Typen dürfen Standardvorgaben für die Const Generics enthalten.
Systemnah geschrieben
Rust 1.59 fĂĽhrt Inline-Assembler-Code und dafĂĽr die Makros asm!
und global_asm!
ein. Die Syntax zum Integrieren des Assembler-Codes ist dieselbe wie fĂĽr Formatstrings. Letztere hatte das Rust-Team in Version 1.58 erweitert. Da Rust fĂĽr die Befehle in der Assemblersprache keine Speichersicherheit garantieren kann, mĂĽssen die Makros innerhalb eines unsafe
-Blocks stehen. Folgendes Beispiel aus dem Rust-Blog zeigt die Integration mit zwei logischen Shift-Left-Anweisungen (shl
) und einer Addition:
use std::arch::asm;
// Multiply x by 6 using shifts and adds
let mut x: u64 = 4;
unsafe {
asm!(
"mov {tmp}, {x}",
"shl {tmp}, 1",
"shl {x}, 2",
"add {x}, {tmp}",
x = inout(reg) x,
tmp = out(reg) _,
);
}
assert_eq!(x, 4 * 6);
Die verfügbaren Anweisungen hängen von der zugrundeliegenden Architektur ab. Zum Start integriert Rust die Assemblersprache für x86 und x64, ARM, AArch64 sowie RISC-V. Einige Beispiele für unterschiedliche Anwendungszwecke finden sich in der Rust-Dokumentation.
Breiter extrahiert
Das aktuelle Release erweitert zudem die destrukturierenden Zuweisungen, um Inhalte aus Mengen wie Tupel, Arrays oder Enums zu extrahieren. Neuerdings dĂĽrfen Slices, Tupel und Structs nicht nur auf der rechten, sondern auch auf der linken Seite der Anweisungen stehen, um die Elemente direkt in die Sammlungen einzufĂĽgen.
Neben einer direkten Zuordnung für Mengenelemente mit gleicher Größe ist die Spread-Syntax erlaubt:
let (a, b, c, d, e);
(a, b) = (1, 2);
[c, .., d, _] = [1, 2, 3, 4, 5];
Struct { e, .. } = Struct { e: 5, f: 3 };
assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
Rust gestattet jedoch nur eine direkte Zuweisung ĂĽber =
und keine arithmetischen Operatoren wie die Additionszuweisung ĂĽber +=
.
Für die in Rust 1.51 eingeführten Const Generics gibt es im aktuellen Release zwei kleinere, aber nützliche Anpassungen: Zum einen entfällt die strikte Reihenfolgevorgabe, dass die Typparameter vor den konstanten Parametern stehen müssen und zum anderen dürfen generische Typen neuerdings Default-Werte für die Const Generics enthalten.
Strippen beim Bau
FĂĽr den Build-Prozess bringt Rust 1.59 ebenfalls einige Anpassungen. Unter anderem lassen sich neuerdings automatisch Stripped Binaries erstellen, die von ĂĽberflĂĽssigen Informationen wie Debug-Informationen befreit sind. Dazu dient die Einstellung strip
in der Manifestdatei Cargo.toml: strip = "symbols"
entfernt beim Linken des Binary alle Symbole und strip = "debuginfo"
lediglich die Debug-Informationen.
Ebenfalls neu ist, dass das Paketverwaltungswerkzeug Cargo vor Inkompatibilitäten mit zukünftigen Rust-Versionen in den Dependencies warnt. Wer beim Bauen oder Prüfen einer Crate, also einem Rust-Paket, über cargo build
beziehungsweise cargo check
den Hinweis "warning: the following packages contain code that will be rejected by a future version of Rust" erhält, kann sich über cargo report
eine detaillierte Beschreibung des Problems geben lassen.
Fahrplan fĂĽr den Compiler
Derweil ist das inkrementelle Kompilieren vorübergehend standardmäßig deaktiviert. Grund dafür ist ein Bug, der zu Deserialisierungsfehlern führen kann. Die Beta von Rust 1.60 enthält wohl bereits einen Bugfix. Das Team lädt zum Testen der Beta- respektive Nightly-Builds ein, damit das turnusmäßig in sechs Wochen geplante Release stabil inkrementell kompiliert.
Unabhängig vom aktuellen Release und dem Bug hat das Rust-Team die Pläne für die Weiterentwicklung des Compilers veröffentlicht. Konkret stehen für dieses Jahr unter anderem Erweiterungen für die asynchrone Programmierung an. So soll es künftig möglich sein, async fn
in Traits zu verwenden. Die Async-Crashdump-Initative soll zudem mehr Einblick in den Kontrollfluss beim Absturz asynchroner Programme geben.
(Bild:Â rust-lang.org)
Daneben gibt es Pläne, die Performance zu verbessern, und eine eigene Arbeitsgruppe kümmert sich um die Verbesserung der Debug-Informationen und die Integration in Trace-basierte Debugger wie rr.
Weitere Details zu Rust 1.59 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. Wie sich darüber die Nightly Builds zum Testen des Compiler-Fixes installieren lässt, steht in der Rust-Dokumentation.
- Rust: Download schnell und sicher von heise.de
(rme)