Was ist Rust?

21.03.2023

Bereits zum 7. Mal in Folge war Rust im Jahr 2022 laut StackOverflow die beliebteste Programmiersprache. Im ersten Artikel dieser Reihe gehe ich darauf ein, was Rust im Allgemeinen ausmacht. In den Folgebeiträgen möchte ich den Vergleich anstellen, wie Rust sich im Vergleich mit Java schlägt.

Beliebt

Im Jahr 2022 wurde Rust bereits das 7. Jahr in Folge von der Entwickler-Community zur beliebtesten Programmiersprache gekürt, und zwar im Rahmen einer Umfrage, die von der Plattform StackOverflow jedes Jahr durchgeführt wird. Dabei war Rust die Sprache, für welche die meisten Entwickler in der Kategorie „Loved vs. Dreaded“ mit „loved“ abstimmten[1].

Im Sommer 2022 kündigte Linus Torvalds an, dass er in naher Zukunft mit dem Merge von Rust-Code in den Linux-Kernel rechnet[2]. Zudem begann einer unserer Kunden kürzlich, Rust als Alternative für Java-Microservices zu verproben. Damit war meine Neugier geweckt, sowie die Motivation, mich einmal näher mit dieser Sprache zu beschäftigen.

Zuerst stellte ich mir die Frage, was es ist, das die Sprache so beliebt macht. Schaut man sich die Webseite rust-lang.org an, wirbt diese mit den drei Eigenschaften „Performance, Reliability und „Productivity“.

Performant

Was die Performance angeht war beim Entwurf der Sprache eines der Ziele, „die Kosten der Abstraktionen so gering wie möglich zu halten (zero-cost abstractions), um eine mit C++ vergleichbare Performanz zu erreichen“[3].

Da Rust keine Laufzeitumgebung benötigt, weil die Programme wie bei C/C++ direkt in nativen Maschinencode kompiliert werden, entfällt der entsprechende Overhead, der beispielsweise in Java mit der JVM verbunden ist. Auch gibt es in Rust keinen Garbage Collector, und somit keine GC-Pausen, was in zuverlässigeren Laufgeschwindigkeiten resultiert.

Verlässlich

Nach einer Aussage des Rust-Erfinders Graydon Hoare ist die Sprache nach einer sehr widerstandsfähigen Pilzart (Rostpilz, engl. Rust) benannt; außerdem ist „Rust“ eine Untermenge der Buchstaben des Wortes „Robust“[4]. Und tatsächlich war es eins der Designziele, eine Sprache zu erschaffen, die dem Entwickler dabei hilft, robuste Programme zu schreiben – indem sie ihn dabei unterstützt, viele Laufzeitfehler bereits zur Compilezeit zu vermeiden. Dazu gehören beispielsweise Zeiger auf ungültige Speicherbereiche, NullPointerExceptions oder Race Conditions in der parallelen Datenverarbeitung. Das Vorwort der Rust-Dokumentation[5] erklärt dies mit den Worten „Die Sprache ist so konzipiert, dass sie [den Entwickler] auf natürliche Weise zu zuverlässigem Code führt, der effizient in Bezug auf Geschwindigkeit und Speichernutzung ist.“

Produktiv

Umfangreiches Tooling sowie die sehr gute Dokumentation erlauben einen schnellen Einstieg in die Rust-Programmierung. Ein Paketmanager- und Buildtool namens Cargo bringt die Installation gleich mit. Für diverse IDEs wie Visual Studio Code oder IntelliJ stehen Plugins zur Verfügung. Sehr ausführliche Fehlermeldungen des Compilers unterstützen zudem bei der Entwicklung. Diese teilen dem Entwickler nicht nur mit, was nicht passt, sondern machen sogar Lösungsvorschläge. Das ist allerdings auch wichtig, denn gerade bzgl. Ownership und Borrowing benötigen Rust-Einsteiger jede Hilfe vom Compiler die sie bekommen können.

Zusammengefasst beschreiben die Rust-FAQ das Ziel von Rust als „Entwurf und Implementierung einer sicheren, nebenläufigen und praktischen Systemsprache […] die sowohl effizienten Code als auch ein komfortables Maß an Abstraktion bietet“.

Dabei wurden keine Sprachfeatures speziell für Rust neu erfunden. Stattdessen wurde auf bereits vorhandene und bewährte Konzepte gesetzt. Selbst das Speichermanagement mit Ownership und Borrowing ist nicht neu. Dies gab es bereits vorher, in überwiegend für die Forschung eingesetzten Sprachen. Rust ist lediglich die erste Mainstream-Sprache, in die diese Konzepte Einzu gehalten haben.

Speichermanagement in Rust

Rusts Speichermanagement ist das wohl außergewöhnlichste Merkmal der Sprache, und auch dasjenige, das die steilste Lernkurve aufweist. Mit den Konzepten Ownership und Borrowing sorgt Rust dafür, dass Referenzen immer auf gültige Speicherbereiche zeigen – und dies ohne dass ein Garbage Collector nötig ist.

Ownership bedeutet, dass eine Variable die Eigentümerschaft über den Speicherbereich der Datenstruktur hat, die ihr zugewiesen ist. Läuft das Programm aus dem Gültigkeitsbereich der Variablen heraus (z.B. dem Scope einer Funktion), wird der entsprechende Speicherbereich freigegeben. Der Compiler stellt dabei sicher, dass es immer nur einen Owner gibt. Die Ownership kann auch übertragen werden, z.B. durch Zuweisung zu einer anderen Variablen, oder wenn die Variable einer Funktion als Parameter übergeben wird. Einen Zugriff auf den ursprünglichen Owner erlaubt der Compiler im Anschluss nicht mehr.

Mittels Borrowing kann man verhindern, dass die Ownership einer Variable bei einem Funktionsaufruf auf den Funktionsscope übergeht. Dabei übergibt man eine Referenz, was zur Folge hat, dass der Speicherbereich „geborgt“ wird, und beim verlassen der Funktion nicht freigegeben wird.

Der Einstieg

Wer nur ein bisschen mit der Sprache herumspielen möchte, kann dafür den online verfügbaren Rust Playground verwenden. Zu einem schnellen Erfolgserlebnis in einer lokalen Entwicklungsumgebung kommt man mit Hilfe der „Get Started“-Seite, welche die Installation von Rust und das Erstellen eines fortgeschrittenen „Hello World“-Programms beschreibt.

Den besten Einstieg bietet wohl die das umfangreiche „Rust Book“ mit dem Titel „The Rust Programming Language“. Es ist online unter https://doc.rust-lang.org/book/ verfügbar. Wer Rust bereits installiert, kann es auch offline mit dem Befehl rustup docs –book öffnen.

Das Buch erläutert in aufeinander aufbauenden Kapiteln die Konzepte von Rust wie Variablen, Veränderbarkeit (mutability), Datentypen, Funktionen, Structs, Traits, Ownership und Borrowing etc.. Zwischendurch gibt es „Hands-On“-Kapitel, die anhand eines nach und nach zu entwickelnden Programms zeigen, wie die bisher beschriebenen Konzepte angewendet werden.

Meine persönliche „Rust-Journey“

Ich selbst habe mit dem „Rust Book“ begonnen. Zusätzlich habe ich ein paar Aufgaben aus dem Rust-Track der OpenSource-Lernplattform Exercism[6] bearbeitet. Zudem habe ich die Gelegenheit genutzt, und einige Tage vom Advent-of-Code 2022 in Rust gelöst.

Für solche kleineren Aufgaben benötigt man allerdings meist nicht viel mehr als die Standardfeatures der Sprache. Da ich wissen wollte, wie sich Rust bei der Entwicklung einer richtigen Anwendung schlägt, habe ich darüber hinaus eine kleine Webapp mit UI und REST-Service implementiert. Dazu mehr in den folgenden Beiträgen der Reihe.

Die größte Herausforderung war tatsächlich, mich an die mit dem Speichermanagement verbundene Art der Entwicklung zu gewöhnen. Vieles was in den meisten Programmiersprachen möglich ist, wie z.B. Weiterverwendung einer Variable, die zuvor als Parameter in eine Funktion gegeben wurde, resultiert in Rust in einem Kompilierfehler. Aber dank der hervorragenden Dokumentation sowie weiterer Ressourcen im Internet wie beispielsweise StackOverflow, waren dies keine unüberwindbaren Hindernisse.

Fazit

Wer an einer Programmiersprache interessiert ist, mit der systemnah programmiert werden kann und die ähnlich effizient ist wie C/C++, aber viele Fehlerquellen bereits während der Entwicklung durch Compilerprüfungen eliminiert, sollte sich Rust unbedingt genauer anschauen.

Inwiefern Rust sich gegen Java behaupten können wird, beleuchte ich in den folgenden Teilen der Blogserie.

[1] https://survey.stackoverflow.co/2022/#most-loved-dreaded-and-wanted-language-love-dread

[2] https://www.heise.de/news/Rust-Code-im-Linux-Kernel-Merge-steht-laut-Linus-Torvalds-ab-Linux-5-20-bevor-7154453.html

[3] https://prev.rust-lang.org/en-US/faq.html#how-fast-is-rust

[4] https://www.reddit.com/r/rust/comments/27jvdt/internet_archaeology_the_definitive_endall_source/?utm_source=share&utm_medium=web2x&context=3

[5] https://doc.rust-lang.org/book/

[6] https://exercism.org/tracks/rust

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*