image: rust-logo.png needs_contrast: light

Rust (2015)

Graydon Hoare

Rust, ent­wick­elt von Graydon Hoare und erst­mals 2015 ver­öffent­licht, ist eine kompilierte Pro­gram­mier­spra­che, die für die Ent­wick­lung von Sys­tem­soft­ware und Web­an­wen­dun­gen kon­zi­piert wur­de. Rust legt be­son­de­ren Wert auf Sicherheit, Geschwindigkeit und Pa­ral­le­li­tät, was sie ideal für die Ent­wick­lung von Be­triebs­sys­te­men, Browser-Engines und anderen leistungsintensiven An­wen­dun­gen macht.

Bekannte Beispiele für die Verwendung von Rust sind der Browser-Engine-Teil von Mozilla Fire­fox, genannt Servo, und das Betriebssystem Redox. Heutzutage ist Rust äußerst relevant, da sie von einer aktiven Community un­ter­stützt wird und eine wachsende Anzahl von Bib­lio­theken und Frame­works bietet, die die Ent­wick­lung sicherer und ef­fi­zien­ter Software ermöglichen.

1. Hello, world!

Rust-Pro­gramme werden in Textdateien mit der Endung .rs geschrieben. Diese Da­tei­en werden anschließend von einem Compiler in ausführbare Da­tei­en übersetzt, die auf deinem Com­puter direkt ausgeführt werden können.

Stelle zuerst sicher, dass du keinen Ordner geöffnet hast. Um sicherzugehen, drücke einfach den Shortcut für »Ordner schließen«: StrgK und dann F. Dein Work­space sollte jetzt ungefähr so aussehen:

Quelltext schreiben

Klicke auf »New File« und wähle als Dateityp »Text File«.

Schreibe nun den folgenden Code in die Datei:

1
2
3
fn main() {
    println!("Hello, world!");
}

Da Visual Studio Code noch nicht weiß, dass es sich um Rust-Quelltext handelt, ist dein Programm momentan noch einfarbig, aber das wird sich gleich ändern. An dem weißen Punkt erkennst du, dass deine Änderungen noch nicht gespeichert sind.

Drücke nun StrgS, um die Datei zu speichern. Gib hello.rs ein – der vollständige Pfad zu deiner Datei lautet dann /workspace/hello.rs.

Sobald du die Datei gespeichert hast, wird sie automatisch als Rust-Datei erkannt und die Syntax wird hervorgehoben.

Kompilieren und ausführen

Bevor wir das Programm ausführen können, müssen wir es kompilieren. Dadurch wird der Quelltext in Maschinencode übersetzt, den dein Com­puter ausführen kann.

Öffne dazu ein Ter­mi­nal, indem du entweder StrgJ drückst oder das Panel-Symbol rechts oben drückst. Dein Fenster sollte jetzt ungefähr so aussehen:

Um das Programm zu kompilieren, gib folgenden Befehl ein:

rustc hello.rs
Du musst nicht den vollständigen Da­tei­na­men schreiben. Schreib einfach rustc he und drücke Tab, um den Da­tei­na­men automatisch zu hello.rs vervollständigen zu lassen. Du kannst danach ganz normal weiterschreiben.

Wenn du keinen Fehler gemacht hast, wird das Programm erfolgreich kompiliert und die ausführbare Datei hello wird im selben Verzeichnis erstellt. Du kannst dies überprüfen, indem du dir die Da­tei­en im aktuellen Verzeichnis mit ls oder ls -l anzeigen lässt:

Die grüne Datei hello ist die ausführbare Datei – im Unterschied zu Win­dows, wo ausführbare Da­tei­en die Endung .exe haben, haben ausführbare Da­tei­en unter Linux keine Endung. Um das Programm auszuführen, gib folgenden Befehl ein:

./hello

Das Programm sollte die Nachricht Hello, World! im Ter­mi­nal ausgeben. Du kannst beide Schritte auch in einem Befehl kombinieren:

rustc hello.rs && ./hello
Die Zeichenkombination && sorgt dafür, dass der zweite Befehl nur ausgeführt wird, wenn der erste erfolgreich war.

Fehler finden und beheben

Wenn du einen Fehler im Code machst, wird der Compiler eine Fehlermeldung ausgeben. Versuche zum Beispiel, statt println das Wort printn zu schreiben:

printn!("Hello, world!");

Speichere die Datei und führe den Compiler erneut aus:

rustc hello.rs
Nutze die Pfeiltaste hoch , um den letzten Befehl erneut einzugeben. So kannst du schnell dein Programm testen, nachdem du es verändert hast.

Der Compiler sollte eine Fehlermeldung ausgeben, die dir hilft, den Fehler zu finden:

Es lohnt sich, die Fehlermeldungen genau zu lesen, um den Fehler zu finden und zu beheben. Achte auf die Zeilennummer (in diesem Beispiel 2) und den Text, der dir sagt, was falsch ist. Denke daran, den Fehler wieder zu beheben, bevor du das nächste Beispiel ausprobierst.

2. Primfaktorzerlegung

Im zweiten Beispiel wollen wir eine Zahl in ihre Primfaktoren zerlegen. An diesem Beispiel kannst du sehen, wie man in Rust Be­nut­zer­ein­ga­ben verar­bei­tet und Schleifen ver­wen­det. Erstelle eine neue Datei mit StrgAltN und schreibe den folgenden Code hinein:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use std::io;
use std::io::Write;

fn main() {
    print!("Enter a number: ");
    io::stdout().flush().unwrap();
    let mut input = String::new();
    io::stdin().read_line(&mut input).expect("Failed to read input");
    let number: u64 = input.trim().parse().expect("Invalid input");

    print!("Prime factors of {}: ", number);
    let mut n = number;
    let mut factor = 2;

    while n > 1 {
        if n % factor == 0 {
            print!("{} ", factor);
            n /= factor;
        } else {
            factor += 1;
        }
    }
    println!();
}

Speichere die Datei unter dem Namen factor.rs. Kompiliere das Programm:

rustc factor.rs

Falls du keine Fehlermeldung erhältst, kannst du das Programm ausführen und testen:

Das Programm hat die Zahl 123 in ihre Primfaktoren zerlegt und ausgegeben. Anders als andere Pro­gram­mier­spra­chen kann Rust auch die Zahl 3000000000 in Sekundenbruchteilen zerlegen. Auch mit einer sehr großen Zahl wie 123456789123456789 kommt das Programm problemlos zurecht. Falls du auf eine Zahl stoßen solltest, die so groß ist, dass das Programm sehr lange braucht, kannst du das Programm mit StrgC abbrechen.

3. Bubblesort

Im dritten Beispiel wollen wir eine Liste von 10 Zufallszahlen sortieren. Dafür verwenden wir den Bubblesort-Al­go­rith­mus, der zwar nicht besonders effizient ist, aber sehr einfach zu verstehen und zu implementieren. Der Bubblesort-Al­go­rith­mus funktioniert, indem er die Liste mehrmals durchläuft und benachbarte Elemente vertauscht, wenn sie in der falschen Reihenfolge sind.

An diesem Beispiel kannst du sehen, wie man in Rust Arrays ver­wen­det, Funk­tio­nen ver­wen­det und Schleifen verschachtelt.

Erstelle eine neue Datei und schreibe den folgenden Code hinein:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use std::fs::File;
use std::io::Read;

// To use real random numbers, we would have to create a Rust
// project with cargo that uses the `rand` crate. For simplicity,
// we will just use `/dev/urandom` as a source of random numbers.

fn rand(min: u32, max: u32) -> u32 {
    let mut file = File::open("/dev/urandom").expect("Failed to open /dev/urandom");
    let mut buffer = [0u8; 4];
    file.read_exact(&mut buffer).expect("Failed to read from /dev/urandom");
    let random_number = u32::from_le_bytes(buffer);
    min + (random_number % (max - min + 1))
}

fn bubble_sort(arr: &mut [i32]) {
    let n = arr.len();
    for i in 0..n {
        for j in 0..n - i - 1 {
            if arr[j] > arr[j + 1] {
                arr.swap(j, j + 1);
            }
        }
    }
}

fn main() {
    let mut arr = [0; 10];
    for i in 0..10 {
        arr[i] = rand(1, 100) as i32;
    }

    println!("Original array: {:?}", arr);
    bubble_sort(&mut arr);
    println!("Sorted array: {:?}", arr);
}

Speichere die Datei unter dem Namen bubblesort.rs. Kompiliere das Programm:

rustc bubblesort.rs

Falls du keine Fehlermeldung erhältst, kannst du das Programm ausführen und testen:

Das Programm hat eine Liste von 10 Zufallszahlen sortiert. Versuche, den Quelltext so zu verändern, dass statt 10 Zahlen 100 oder mehr Zahlen sortiert werden.

4. Zusammenfassung

In diesem Kapitel hast du an drei Beispielen gesehen, wie man ein einfaches Rust-Programm schreiben, kompilieren und ausführen kann. Das ist natürlich nur ein erster Eindruck. Um Rust wirklich zu beherrschen, musst du noch viel mehr lernen – am besten, indem du eigene Pro­gramme schreibst und ausprobierst. Die Buchhandlungen, Bib­lio­theken und Youtube sind voll von Material für dich. Viel Spaß beim Pro­gram­mier­en!