Rust mit dem Raspberry Pi
In diesem Tutorial zeige ich wie man Rust mit dem Raspberry Pi verwendet. Mit der jungen Programmiersprache Rust lassen sich tolle Projekte umsetzen, Erfahrungen damit werden in den nächsten Jahren wichtiger. Am besten du legst gleich mit dem ersten Vorzeigeprojekt am Raspberry Pi los!
Rust mit dem Raspberry Pi
Rust ist eine neue Programmiersprache (erste stabile Version 2015) die schnell an Beliebtheit gewonnen hat. Sie eignet sich besonders um ähnlich wie C/C++ auf Low-Level zu Programmieren. Der entscheidende Vorteil gegenüber C: Referenzen zeigen immer auf einen validen Speicher und können nie NULL zurück liefern. Deshalb sind Speicherzugriffsverletzungen ausgeschlossen. Neben diesem entscheidenden Vorteil hat Rust folgende Eigenschaften:
- Type safe
Variablen haben bestimmte Typen und der Compiler prüft, ob die Zuweisungen alle korrekt sind. Man kann also beispielsweise keinen String in einen int speichern. - Memory safe
Pointer zeigen immer auf validen Speicher, es gibt keine Null-Pointer. - Data race free
Die Sprache Rust ist implizit Thread sicher. Man benötigt nicht wie in C++ einen Mutex um vor konkurrierenden Zugriff auf Ressourcen zu schützen. - minimal Runtime
Die Ausführungsumgebung ist ähnlich klein wie für C/C++. Rust kommt ohne komplexe Systeme wie einem Garbage Collector aus. - Performance
Rust kennt Konzepte höherer Sprachen wie Interfaces, Iteratoren usw. Diese können mit nahezu keinem Overhead verwendet werden. - low-level
Rust programmiert man wie C/C++ auf Systemebene. Deshalb eignet sich die Sprache ebenfalls um Betriebssysteme (Kernel) oder Systemtreiber zu entwickeln.
Installation
Der einfachste Weg zur Installation führt über die Webseite rustup.rs. Dort findet man ein Kommando, welches man in seinem Terminal ausführt:
Einmal ausgeführt wird alles nötige auf dem Raspberry Pi installiert. Was genau wird denn nun installiert? Die Standardinstallation kopiert folgende Dinge auf deinen Raspberry Pi:
- Rust Runtime
Die Runtime wird benötigt um das erzeugte Binärfile ausführen zu können. - rustc
Das ist der Rust Compiler. Damit wird die Quelldatei in eine ausführbare Datei umgewandelt. - cargo
Cargo ist ein Build Tool und Dependency Manager. Gerade für Projekte mit mehr als einer Code Datei reicht der Compiler alleine nicht aus. Tatsächlich werden wohl fast alle Projekte mit Cargo gemanaged. Dazu gleich mehr.
Nachdem die Installation fertig ist wird man noch aufgefordert das Terminal, bzw. die Shell neu zu starten. Erst durch einen Neustart werden die Umgebungsvariablen neu geladen und man kann rustc und cargo nutzen.
Hello World
Bei einem einfachen Hello World Programm mit nur einer Code Datei reicht der Rust Compiler rustc völlig aus. Ich erstelle für den ersten Test also ein eigenes Verzeichnis für das Projekt und eine Datei (mit Dateiendung *.rs) für das erste Programm. Der Code lautet dort wie folgt:
fn main() { println!("Hello, World"); }
mit dem Compiler wird die Quelldatei in eine ausführbare Datei verwandelt:
rustc main.rs
Auf meinem Raspberry Pi 2 dauert das Kompilieren ein paar Sekunden. Danach finde man im Ordner eine neue Datei main. Führt man diese aus:
./main
dann erhält man die erhoffte Ausgabe auf der Konsole:
Gratulation. Alle Voraussetzungen sind nun erfüllt und du kannst deine Karriere als Rust Entwickler auf dem Raspberry Pi starten.
Projekte
Wie bereits erwähnt reicht der Compiler für ein größeres Projekt kaum aus, weshalb bei der Installation von Rust auch Cargo als Build System dabei ist. Startet man nun ein neues Projekt, reicht folgendes Kommando:
cargo new PROJEKTNAME
wobei PROJEKTNAME durch den Namen des Projekts ersetzt werden muss. Cargo erzeugt neben dem mit dem Projektnamen benannten Ordner auch gleich folgende Struktur:
Im Projektverzeichnis findet sich eine Konfigurationsdatei cargo.toml im TOML Format. Dort werden Metadaten und Abhängigkeiten definiert. Im neu erstellten Projekt findet man im src Ordner bereits eine main.rs Datei mit einem Hello World Programm. Von diesem Template kann man weg arbeiten. führt man im Projektordner ein:
cargo run
aus, dann wird das Projekt gebaut und ausgeführt:
Der Projektordner ist so organisiert, dass alle durch den Buildvorgang erzeugten Artefakte im target Ordner abgelegt werden. Nach dem ersten Build findet man dort die ausführbare Datei im debug Unterordner wieder.
Mit Cargo lassen sich bereits umfangreiche Projekt auf der Kommandozeile bearbeiten und erzeugen. Als Entwickler sehnt man sich dann doch auch nach Syntax Highlighting und dynamischer Hilfe, weshalb eine IDE angebracht ist. Eine Option ist in diesem Fall Visual Studio Code, dort findet man alle nötigen Plugins auch für Rust.
Fazit
In diesem Tutorial habe ich gezeigt wie man Rust mit dem Raspberry Pi verwendet. Rust ist eine moderne Programmiersprache die sich zunehmend als direkte Konkurrenz zu C/C++ etabliert. Sie gilt als sicher und ist deshalb gerade für Low-Level und Core Funktionalitäten in Betriebssystemen eine Alternative. Auch für andere High-Performance Anwendungen scheint sich Rust gut zu eignen.
Was sind deine Erfahrungen mit Rust? Würdest du Rust statt C++ einem Programmieranfänger empfehlen?