Rust-Tutorial: Beginnen Sie mit der Rust-Sprache

In den letzten Jahren hat sich Rust von einer im Labor eines Mozilla-Mitarbeiters aufgebauten Neugierde zu einem starken Konkurrenten für das Schreiben der nächsten Generation nativer Apps und Bare-Metal-Lösungen entwickelt. Diese Fortschritte sind jedoch darauf zurückzuführen, dass Rust eine eigene Werkzeugkette und ein eigenes Komponentenmanagementsystem bereitstellt - zusammen mit seinen eigenen Funktionen und Eigenheiten.

In diesem Artikel werden die Grundlagen zum Einrichten einer Arbeitsumgebung in Rust, zum Konfigurieren einer IDE und zur optimalen Nutzung des von Rust für die App-Entwicklung bereitgestellten Tool-Sets erläutert.

Zugehöriges Video: Entwicklung sicherer Software mit Rust

Machen Sie sich schnell mit dem Newcomer Rust vertraut, der für die Erstellung schneller Software auf Systemebene entwickelt wurde. Dieser zweiminütige animierte Erklärer zeigt, wie Rust die lästigen Programmierprobleme von Speicher und Verwaltung umgeht.

Verstehen Sie Rust Nightly, Beta und stabile Releases

Die Toolkette von Rust besteht hauptsächlich aus dem Rust-Compiler sowie rustcTools zum Verwalten einer Rust-Installation. Da Rust ständig weiterentwickelt wird, ist die Rust-Werkzeugkette so konzipiert, dass sie leicht auf dem neuesten Stand zu halten ist.

Softwareprojekte werden häufig über mehrere Kanäle bereitgestellt, um die stabile und die Beta-Version des Codes zu trennen. Die Werkzeugkette von Rust funktioniert genauso und bietet drei Kanäle für die Werkzeugkette:

  • Stabil: Wichtige Punktveröffentlichungen, die etwa alle sechs Wochen erscheinen.
  • Beta: Kandidaten für die nächste wichtige Punktveröffentlichung, die häufiger auftauchen.
  • Nächtlich: Der unmittelbarste Build mit Zugriff auf modernste Funktionen, jedoch ohne Garantie für deren Stabilität.

Wie Entwickler Karol Kuczmarski betont hat, ist es am besten, sich den nächtlichen Rust-Kanal als seine eigene Sprache vorzustellen. Einige Rust-Funktionen, z. B. das Kompilieren in WebAssembly, sind nur im nächtlichen Kanal verfügbar und können nur durch spezielle Compiler-Anweisungen aktiviert werden. Mit anderen Worten, sie werden nicht einmal in der Beta oder in stabilen Kanälen kompiliert. 

Das ist beabsichtigt, da es keine Garantie gibt, dass die nächtlichen Funktionen irgendwo anders unterstützt werden. Viele dieser Funktionen verlassen jedoch den nächtlichen Kanal und gehen in Beta- und stabile Versionen über. (Das Kompilieren in WebAssembly funktioniert beispielsweise ab Rust 1.30 stabil.)

Zusamenfassend:

  1. Verwenden Sie Stable für die eigentliche Produktionsarbeit.
  2. Verwenden Sie die Beta- Version, um die aktuelle Software mit den kommenden Versionen zu testen und festzustellen, ob beim Upgrade möglicherweise Probleme auftreten.
  3. Nur jede Nacht für Sandbox-Experimente mit den neuesten Funktionen von Rust verwenden.

Wählen Sie ein Betriebssystem für die Rust-Entwicklung

Rust unterstützt alle drei Hauptplattformen - Windows, Linux und MacOS - in 32- und 64-Bit-Versionen mit offiziellen Binärdateien. Eine Reihe anderer Plattformen verfügen ebenfalls über offizielle Binärdateien, jedoch nicht über die gleiche Abdeckung für automatisierte Tests. Diese zweitklassigen Plattformen umfassen ARMv6 und ARMv7 für iOS, Android und Linux. MIPS Linux und MIPS64 Linux; 32-Bit-Editionen von x86 iOS, Windows und Linux; und WebAssembly. Andere Plattformen wie Windows XP oder das experimentelle HaikuOS werden durch inoffizielle Builds unterstützt.

Das Entwicklungsteam von Rust hat erklärt, dass es nicht zu Rusts Aufgaben gehört, so umfassend wie möglich zu sein. Obwohl Rust auf vielen ARM-Architekturen verfügbar ist, kann nicht garantiert werden, dass Rust auf Low-End-Hardwareplattformen offiziell unterstützt wird.

Allerdings sollte ein unterstützter Rust-Build für die überwiegende Mehrheit der gängigen Mainstream-Anwendungsfälle verfügbar sein, nämlich 32- und 64-Bit-Windows, Linux und MacOS.

Wenn Sie in Rust unter Windows entwickeln möchten, sollten Sie Ihre Toolketten berücksichtigen. Rust unterstützt zwei Toolketten unter Windows:

  • Das native Microsoft Visual C (MSVC) ABI
  • Das vom GCC-Linker verwendete Gnu-ABI.

Da fast alle in Windows erstellten C / C ++ - Software ohnehin MSVC verwendet, sollten Sie die MSVC-Toolkette die meiste Zeit verwenden. Wenn Sie jemals GCC benötigen, können Sie höchstwahrscheinlich mit Bibliotheken von Drittanbietern zusammenarbeiten, die in Windows mit GCC erstellt wurden.

Die gute Nachricht ist, dass Sie mit dem Tool Chain Management-System von Rust sowohl MSVC- als auch GCC- Toolketten installiert lassen und projektweise zwischen ihnen wechseln können.

Eines der Kompilierungsziele von Rust ist WebAssembly. Dies bedeutet, dass Sie in Rust schreiben und in einem Webbrowser bereitstellen können. WebAssembly selbst ist an den Rändern immer noch rau, ebenso wie Rusts Unterstützung dafür. Wenn Sie jedoch ehrgeizig sind und Ihre Hände durcheinander bringen möchten, lesen Sie das von Rust- und WebAssembly-Entwicklern zusammengestellte Buch, in dem der Prozess zum Kompilieren von WebAssembly zu Rust beschrieben wird. Das Buch enthält ein Tutorial für ein einfaches Projekt, eine Implementierung von Conways Game of Life, das in Rust geschrieben und als WebAssembly bereitgestellt wurde.

Starten Sie Ihr Rust-Setup mit rustup

Rust bietet ein All-in-One-Installations- und Werkzeugketten-Wartungssystem namens rustup. Laden Sie rustupes herunter und führen Sie es aus. Es werden die neuesten Versionen der Rust-Toolkette abgerufen und für Sie installiert.

Die wichtigsten Tools, die von gewartet werden, rustupsind:

  • rustupselbst. Immer wenn neue Versionen rustupoder andere Tools veröffentlicht werden, können Sie einfach rustup updatealles automatisch ausführen und aktualisieren lassen.
  • rustc, der Rust-Compiler.
  • Cargo, Rusts Paket- und Arbeitsbereichsmanager.

Standardmäßig wird rustupRust vom stabilen Kanal installiert. Wenn Sie Beta- oder Nachtversionen verwenden möchten, müssen Sie diese Kanäle installieren (z. B.  rustup install nightly) und Rust so einstellen, dass sie standardmäßig verwendet werden ( rustup default nightly). Sie können auch manuell angeben, welcher Kanal beim Kompilieren einer Rust-Anwendung verwendet werden soll, damit Sie die Standardeinstellung nicht jedes Mal festlegen und zurücksetzen müssen, wenn Sie zwischen Projekten wechseln.

Sie können auch  rustup benutzerdefinierte Werkzeugketten installieren und warten. Diese werden normalerweise von inoffiziellen Builds von Rust von Drittanbietern für nicht unterstützte Plattformen verwendet, da für diese normalerweise eigene Linker oder andere plattformspezifische Tools erforderlich sind.

Konfigurieren Sie Ihre IDE für Rust

Obwohl Rust eine relativ neue Sprache ist, wurde sie bereits von vielen gängigen IDEs stark unterstützt. Entwickler Manuel Hoffman unterhält ein Projekt, um den Stand dieser Unterstützung auf der Website areweideyet.com zu verfolgen.

Die gute Zusammenarbeit von Rust mit IDEs ist ein ausdrückliches Ziel des Entwicklungsteams über eine Funktion namens Rust Language Server (RLS). RLS bietet Live-Feedback zu dem fraglichen Code von Rusts eigenem Compiler und nicht von einem Parser eines Drittanbieters.

Hier sind die IDEs, die Rust unterstützen:

  • Microsoft Visual Studio Code verfügt über eine Rust-Sprachunterstützungserweiterung, die vom Rust-eigenen Entwicklertools-Team erstellt wurde. Diese Integrationsstufe macht es zu einer der am besten unterstützten IDEs für Rust. 
  • Eclipse-Benutzer können eine vorgefertigte Edition der Eclipse for Rust-Entwicklung herunterladen oder das eigenständige Korrosions-Plugin für Eclipse Photon verwenden. (Ein früheres Paket, RustDT, wird nicht mehr verwaltet.)
  • Wenn Sie ein Fan von Emacs oder Vim sind, haben andere Entwickler wie Sie Rust-spezifische Add-Ons für beide Editoren geschrieben. Emacs verfügt über einen Rust-spezifischen Modus und Vim über ein Plugin zur Hervorhebung und Formatierung der Syntax. Die RLS-Unterstützung ist sowohl für Emacs als auch für Vim verfügbar, muss jedoch manuell hinzugefügt und konfiguriert werden.
  • Benutzer von IntelliJ Idea und Atom können Plugins hinzufügen, um die Rust-Unterstützung abzurunden.
  • Sublime Text bietet standardmäßig Unterstützung für die Rust-Syntax, und Plugins bieten eine umfassendere Unterstützung für andere Funktionen.
  • Ein Projekt zur Erstellung einer einfachen IDE speziell für Rust, SolidOak, war eine Zeit lang in der Entwicklung, ist aber seitdem ins Stocken geraten. Am besten entscheiden Sie sich für eine der vorhandenen IDEs, die bereits Unterstützung bietet.

Erstellen Sie Ihr erstes Rust-Projekt

Rust-Projekte sollen eine konsistente Verzeichnisstruktur haben, in der Code- und Projektmetadaten auf bestimmte Weise gespeichert sind. Code wird in einem srcUnterverzeichnis gespeichert , und Details zum Projekt werden in zwei Dateien im Stammverzeichnis des Projekts gespeichert  Cargo.toml(Basisinformationen des Projekts) und Cargo.lock(eine automatisch generierte Liste von Abhängigkeiten). Sie können diese Verzeichnisstruktur und Metadaten von Hand erstellen, aber es ist einfacher, nur Rusts eigene Tools zu verwenden, um die Aufgabe zu erledigen.

Tipp:  Der Online-Leitfaden Rust By Example zum Erlernen von Rust enthält interaktive Codebeispiele, die direkt im Browser bearbeitet und ausgeführt werden können. Es berührt fast jedes wichtige Rust-Konzept, obwohl einige der wichtigsten Konzepte wie Ausleihen und Lebensdauern relativ spät in der Diskussion vorgestellt werden.

Das Cargo-Tool von Rust verwaltet sowohl Rust-Projekte als auch die von ihnen verwendeten Bibliotheken oder „Kisten“. Geben Sie Folgendes ein, um ein neues Rust-Projekt mit einem Namen my_projectin einem eigenen Verzeichnis zu starten cargo new my_project. (Denken Sie bei C # -Entwicklern, die mit .Net Core arbeiten, an den dotnet newBefehl.) Das neue Projekt wird in einem Unterverzeichnis mit diesem Namen zusammen mit einem grundlegenden Projektmanifest - der Cargo.tomlDatei - und einem Stub für den Quellcode des Projekts in einem srcUnterverzeichnis angezeigt.

Wenn Sie ein neues Projekt erstellen, main.rswird automatisch eine  Datei im srcVerzeichnis des Projekts erstellt. Diese Datei enthält eine grundlegende App „Hallo Welt“, mit der Sie Ihre Rust-Toolchain sofort testen können, indem Sie sie kompilieren und ausführen.

Der Quellcode für die App „Hallo Welt“:

fn main() {

    println!(“Hello World!”);

}

Geben Sie zum Erstellen und Ausführen das Stammverzeichnis des Projektverzeichnisses ein und geben Sie ein cargo run. Beachten Sie, dass Cargo standardmäßig Projekte im Debug-Modus erstellt. Verwenden Sie zum Ausführen im Freigabemodus cargo run --release. Binärdateien werden im Unterverzeichnis target/debugoder eines target/releaseUnterverzeichnisses eines Projekts erstellt, je nachdem, welches Kompilierungsprofil Sie verwenden.

Arbeiten Sie mit Rostkisten

Die Paketverwaltung ist ein wesentlicher Bestandteil jeder modernen Programmierumgebung. Zu diesem Zweck stellt Rust „Kisten“ zur Verfügung, bei denen es sich um Bibliotheken von Drittanbietern handelt, die zur Verteilung mit den Tools von Rust verpackt sind. Sie finden Kisten in der offiziellen Rust-Paketregistrierung Crates.io.

Wenn Ihr Projekt von einer bestimmten Kiste abhängig ist, müssen Sie diese Kiste angeben, indem Sie die Projektdatei bearbeiten Cargo.toml. Die Standardmethode hierfür ist manuell, dh einfach Cargo.tomldirekt mit einem Texteditor bearbeiten . Bei der nächsten Neuerstellung des Projekts erhält Rust automatisch alle erforderlichen Abhängigkeiten.

Tipp: Zwei Tools cargo-editund cargo-edit-locallykönnen Abhängigkeiten über die Befehlszeile aktualisieren, obwohl es sich um inoffizielle Projekte von Drittanbietern handelt.

Wenn Sie ein Rust-Projekt erstellen, das von externen Kisten abhängt, sucht Cargo standardmäßig auf Crates.io nach diesen Kisten. Sie müssen sie nicht manuell beziehen. Sie können auf Kisten in Ihrem Projekt auch nach URL und nicht nach Kisten-Namen verweisen, falls Sie eine Kiste benötigen, die nicht in der Registrierung gehostet wird, z. B. etwas aus einem privaten Repository.

Beachten Sie, dass einige Kisten nur auf Rusts nächtlichem Kanal installiert und gebaut werden, da sie experimentelle Funktionen verwenden, die in anderen Kanälen nicht verfügbar sind. Wenn Sie sich im Release-Kanal befinden und versuchen, eine solche Kiste zu installieren, erhalten Sie keine Warnung, bis die Kompilierung selbst fehlschlägt. In der Kistendokumentation wird normalerweise erwähnt, ob der nächtliche Kanal erforderlich ist oder nicht. Lesen Sie also nach, bevor Sie ihn einfügen, geschweige denn kompilieren.

Kisten können mit Binärdateien geliefert werden. Einige sind Befehlszeilentools, die in der Rust-Entwicklung verwendet werden. andere sind Allzweckwerkzeuge (wie  ripgrep). Um eine dieser Kisten zu installieren, geben Sie einfach ein cargo install . Dies ist nicht die einzige Möglichkeit, eine mit Rust erstellte Binärdatei zu verteilen, aber es ist eine bequeme Möglichkeit für Rust-Entwickler, sie als Teil eines Workflows mit Rust-Tools abzurufen.

Kompilieren Sie Rust auf eine andere Plattform

Da Rust auch in derselben Installation von Rust mehrere Toolketten unterstützt, können Sie Rust-Anwendungen auf einem Zielbetriebssystem und einer Zielumgebung kompilieren, die sich von der unterscheidet, auf der Sie kompilieren.

Für eine solche Cross-Kompilierung ist eine Toolkette auf der Plattform erforderlich, an der Sie arbeiten, die der Zielplattform entspricht. Manchmal, wie beim Cross-Compilieren unter Linux unter Windows oder umgekehrt, ist dies nur mit dem GCC-Linker verbunden. Aber manchmal ist es komplexer. Zum Cross-Kompilieren mit MacOS benötigen Sie beispielsweise die Xcode-IDE-Bibliotheken, um den Job abzuschließen - cctools (Apples Äquivalent zu binutils) und das MacOS SDK.

Tools von Drittanbietern bieten einige Möglichkeiten, um diese Schwierigkeiten zu umgehen:

  • Ein solches Tool ist Trust, eine Travis CI- und AppVeyor-Vorlage, mit der Binärversionen eines Rust-Projekts automatisch veröffentlicht werden können. Es kann für Linux, Windows und MacOS erstellt werden, erfordert jedoch die Verwendung der Travis CI- und AppVeyor-Dienste und erfordert, dass Ihr Projekt auf GitHub gehostet wird.
  • Ein anderes Projekt, Cross, läuft direkt auf einem 64-Bit-x86-Linux-Host, bietet jedoch das, was sein Ersteller als Cross-Compilieren mit „Null-Setup“ bezeichnet, für eine Vielzahl von Zielen, einschließlich 64-Bit-Windows und MIPS.
  • Das Crossbuild-Projekt bietet ein Docker-Image mit mehreren Architekturen, das zum Crossbuilding zwischen allen drei Hauptplattformen verwendet werden kann.