Rust: Installation und "Hello world!"

None

In diesem Artikel geht es um die ersten beiden Teile meiner Videoreihe zur Rust-Einführung: hier werden wir die Toolchain für die Programmiersprache installieren sowie ein "Hello world"-Programm schreiben.

In meinem Eingangsartikel zu Rust bekam ich im Feedback mit, dass kurze Ausflüge in die Welt dieser - doch in der Bedienung etwas unüblichen Programmiersprache - begrüßt werden. Ich werde dies allerdings anfangs noch ein wenig kompakter halten und multimedial fahren: den Kern gibt es innerhalb eines Videotutorials und hier werde ich ergänzende Anmerkungen geben. Den Einstieg machen zwei Videos zu jeweils der Installation und dem Hello world-Example samt Kurzeinführung in die Variablen.

Installation

Im Video habe ich die Variante über rustup gezeigt. Die Entwickler wollen wohl zwei Probleme angehen: die Einstiegshürde bei der Installation nehmen und die Fragmentierung (die Versionsstände in eingeschlägigen Distros hängen oft aus Stabilitäts- und Komptaiblitätsgründen durchaus hinterher) verhindern. Der Installer erstellt hierbei im Benutzerverzeichnis Verzeichnisse samt der entsprechenden Binaries und sorgt durch Ergänzung des PATHs für die Erreichbarkeit der Kommandos im Terminal.

Ich bin normalerweise kein Freund von "führ diesen x-beliebigen Code aus dem Internet direkt in deiner Shell aus". Klar, es wird hier nur im Userverzeichnis gearbeitet, aber trotzdem gibt es dabei genug Angriffsvektoren. Und leider wird  auch nicht auf ein Debian-Paketrepository zur Installation zurückgegriffen. Ich selber greife bei der Entwicklung übrigens dank Arch Linux dann doch auf ein Paketmanager-Binary zurück. Das heißt aber nicht, dass Debian Rust gar nicht im Repository hat: hier sind rustc und cargo in Version 1.24 resp. 0.25 verfügbar - so benötigt allerdings actix-web, eine Python Flask-ähnliches Webframework teilweise Version 1.26.

Hello world! / Variablen

fn main() {
    let x = 42;
    println!("Hello world! x is {}", x);
}

Den Kern habe ich in diesem Video bereits umrissen. Vielleicht sei zu ergänzen, dass natürlich die erwähnte Typinferenz auch auf die Funktionen angewandt wird und aus diesem Grund die Angabe eines Returntypes optional ist. Funktionen haben allerdings einige Besonderheiten bezüglich der Rückgabe, auf die ich zukünftig noch eingehen werde.

Leider machen wir den Einstieg mit einer Eigenheit von Rust, denn im Gegensatz zu C mit printf() aus der stdlib.h oder Python mit print() als built-in function läuft die Standardausgabe in Rust über ein Makro ab. Diese sehen aus wie Funktionen, nur endet hierbei der identifier mit einem Ausrufezeichen. Makros sind unter Rust ähnlich wie unter C, werden vor der Analyse im Präprozessor ausgewertet und sollen die durch die statische Typisierung entstehenden Nachteile als "Shortcuts" kompensieren. Sie ermöglichen somit eine "Sprache in der Sprache" und können wirklich je nach Einsatzzweck sinnvoll sein.

Variablen sind standardmäßig immutable und können per keyword mut mutable, also veränderlich, gemacht werden. Aushebeln lässt sich dies über eine Mehrfachdefinition, die nicht nur möglich, sondern auch als best practise in "The Book", dem Referenzhandbuch von Rust, beschrieben wird. Ziel hierbei soll sauberer Code sein, um im Verlauf des Parsens einer Eingabe einen eindeutigen Namen zu erhalten.

Ausblick

Im nächsten Video soll es insbesondere um Ownership und Lifetime, das Kernfeature und Knackpunkt von Rust, gehen. Auf weitere Videowünsche bezüglich dieser Serie kann ich, wenn umsetzbar, auch eingehen.

Keine Kommentare

Kommentar verfassen