Programmiersprache Rust 1.59 integriert Assembler-Code

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

In Pocket speichern vorlesen Druckansicht 19 Kommentare lesen

(Bild: Callum Bainbridge / Shutterstock.com)

Lesezeit: 4 Min.
Inhaltsverzeichnis

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.

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.

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.

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.

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.

Neben den konkreten Plänen für dieses Jahr existieren Bestrebungen zum Erweitern des Compilers, für die es derzeit noch an Ressourcen mangelt.

(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)