Beginnen Sie mit Rust in der Windows-Programmierung

Könnte Microsoft von C, C ++ und C # auf andere Sprachen umsteigen? In einem kürzlich veröffentlichten Blogbeitrag des Microsoft Security Response Center (MSRC) wurde vorgeschlagen, nach Alternativen zu suchen, um die Risiken für den Code zu verringern. Wie Gavin Thomas, der Hauptmanager für Sicherheitstechnik bei MSRC, feststellte, ist eine der Hauptursachen für die Fehler im Microsoft-Code, die dem MSRC gemeldet wurden, Speicherbeschädigung, Fehler, die das Überschreiben des Speichers oder den Zugriff auf den zu schützenden Speicher ermöglichen.

Speicher sicher aufbewahren

Die Speichersicherheit ist seit langem ein wichtiges Problem, aber die statistische Arbeit von MSRC zeigt, dass das Problem nicht behoben wird. Sie haben viele Tools, mit denen Sie sicheren Code schreiben können, vom Microsoft-eigenen Secure Development Lifecycle bis hin zur Verwendung neuerer speichersicherer Sprachen wie C #. Diese Ansätze haben jedoch ihre Nachteile: Der von ihnen erzeugte Code ist langsamer und arbeitet auf einer höheren Ebene als C ++.

Dies ist kein Problem für kundenorientierten Code. Es gibt keinen Wahrnehmungsunterschied zwischen einer C ++ - develoepd-Benutzererfahrung und einer in C # integrierten. Auf Systemebene, dem Code zum Erstellen von Betriebssystemen und Gerätetreibern, gibt es jedoch einen großen Unterschied. Prozessorzyklen sind wichtig, wenn Sie auf Systemebene arbeiten, und wie Thomas in seinem Blogbeitrag betont, sind ungeschützte Sprachen wie C ++ und C wirklich die einzigen Tools, die historisch auf dieser Ebene funktionieren.

Es ist klar, dass die speichersicheren Ansätze, die von höheren Sprachen verwendet werden, auf Systemebene nicht funktionieren. Viele der Probleme, die das fehlgeschlagene Longhorn-Projekt von Microsoft plagten, wurden durch den Versuch verursacht, ein gesamtes Betriebssystem auf der .NET-Plattform zu erstellen. Wie können wir also die Speichersicherheit auf die Grundlagen der Systementwicklung bringen?

Wir stellen Rust vor

Die Antwort kommt mit einer neuen Generation von Systemprogrammiersprachen wie Go und Rust, Sprachen, die das speichersichere Design von .Net mit der Geschwindigkeit von C und C ++ haben. Microsoft verwendet Go in Azure bereits in großem Umfang, da es sich um die Sprache handelt, in der Kubernetes geschrieben ist. Diese Ansätze haben jedoch noch nicht den Weg zu Windows gefunden, wo C ++ immer noch der König der Systemprogrammierung ist.

In seinem Blogbeitrag argumentiert Thomas, Mozillas Rust als sichere Systemsprache für Windows zu verwenden. Es ist ein interessanter Vorschlag, der bereits einen großen Beweis für sich erbringt: Der Sprachdesigner Mozilla verwendet ihn bereits in seinen neuesten Webbrowser-Versionen, in denen er die aktuellen Rendering-Engines von Mozilla und der nächsten Generation unterstützt. Andere große Rust-Benutzer sind das JavaScript-Modul-Repository NPM, Dropbox und Oracle. Sogar Microsoft verwendet es bereits mit Rust-Code in einigen seiner Azure IoT Edge-Tools.

Einrichten einer Windows Rust-Entwicklungsumgebung

Der naheliegende Ausgangspunkt für die Rust-Entwicklung ist Visual Studio Code. Auf dem Marktplatz für Erweiterungen finden Sie mehrere Erweiterungen, mit denen der Rust Language Server installiert wird und die vollständige Sprachunterstützung sowie Tools zum Erstellen Ihrer Rust-Apps aus Visual Studio Code bieten. Ich habe die offizielle Rust-Erweiterung des Rust-Sprachteams verwendet. Andere Tools unterstützen Code-Snippets für den Kickstart der Entwicklung sowie zusätzliche Debugging- und Test-Tools. Es gibt sogar Tools zum Erstellen von Dokumentationen für Ihren Code. Es lohnt sich, das Rust-Erweiterungspaket als Teil Ihrer Visual Studio Code Ruse-Umgebung zu installieren, da hierdurch zusätzliche Tools für die Arbeit mit Rusts eigenen Entwicklungstools hinzugefügt werden.

Sie müssen zuerst den Rust-Compiler und den Cargo-Paketmanager installieren. Die offizielle Rust-Installationsseite erkennt die von Ihnen verwendete Windows-Version und stellt den entsprechenden Download bereit. Es gibt sogar Anweisungen zum Installieren von Rust unter Windows Subsystem für Linux (WSL), wenn Sie WSL als Teil einer Unix-Entwicklungstoolkette verwenden. Durch Ausführen des Rustup-Installationsprogramms werden die Sprachkomponenten heruntergeladen und der Windows- Pfad festgelegt . Sie haben zwar die Möglichkeit, die Installation anzupassen, in der Praxis ist es jedoch am besten, die Standardeinstellungen zu akzeptieren.

Rost- und Gedächtnissicherheit verstehen

Wenn Sie C oder C ++ programmiert haben, ist der Übergang zu Rust relativ einfach. Es gibt eine große Ähnlichkeit zwischen den Sprachen, obwohl es Rusts Konzept des Eigentums ist, das es speichersicher macht. Mit Ownership kann Rust den Gültigkeitsbereich von Variablen verwalten, sodass diese nur im Gültigkeitsbereich gültig sind. Wenn sie nicht verwendet werden, sind sie nicht im Speicher. Einige Variablen sind Literale, unveränderliche Werte, die fest in Ihrem Code codiert sind. Komplexere Variablentypen können jedoch Speicher anfordern, wenn sie festgelegt sind. In anderen Sprachen müssen Sie den Speicher explizit zuweisen und dann freigeben, wenn die Variable oder das Objekt nicht mehr benötigt wird. Rust automatisiert dies und behandelt die Speichernutzung als Teil seiner Bereichsverwaltung.

Das Team von Mozilla, das Rust erstellt hat, hat sich intensiv mit der Speichersicherheit und den Kompromissen befasst, die in einer sicheren Umgebung auftreten können. Das Ergebnis ist eine sichere und schnelle Sprache mit Tools, die sowohl Speicherstapel als auch Heaps verwalten. Wenn Sie einer Funktion einen Wert zuweisen, ändert sich ihr Besitz und sie wird von einem Bereich in einen anderen verschoben. Ein ähnlicher Prozess verwaltet Werte, die von einem Funktionsaufruf zurückgegeben werden.

Eigentum ist ein komplexes Konzept, aber es ist ein wichtiges. Es schützt den Speicher und lässt nur die Funktionen, die einen Wert besitzen, ändern, selbst wenn Sie einen Verweis auf eine Variable verwenden. Da Rust eine Referenz als Ausleihe der Variablen behandelt, führt der Versuch, sie zu ändern, nur zu einem Fehler, es sei denn, Sie erklären sie für veränderlich.

Die Zukunft von Rust in Windows

Es ist wichtig, sich daran zu erinnern, dass Rust noch eine junge Sprache ist und vieles, was Sie in der Windows-Entwicklung für selbstverständlich halten, nicht vorhanden ist. Es gibt keine direkte Integration mit Win32 oder anderen Windows-SDKs, und Sie werden keine Unterstützung für Windows-GUI-Tools finden, ohne zusätzliche Bibliotheken zu installieren. Dies ist jedoch kein so großes Problem, wie Sie vielleicht denken: Rust ist wie Go eine Systemprogrammiersprache. Es ist ein Low-Level-Tool, schnell und sicher. Dies macht es ideal zum Erstellen von Code, der Ihre Daten manipuliert, Zahlen verarbeitet und Arrays verarbeitet. Verwenden Sie statt C ++ - Routinen, bei denen Sie mit großen Speichermengen arbeiten, stattdessen Rust, um das mit Speicherbeschädigungen verbundene Risiko zu verringern.

Wenn Sie GUI-Anwendungen in Rust entwickeln möchten, haben Sie die Möglichkeit, eine von mehreren UI-Bibliotheken zu verwenden. Am einfachsten zu bedienen ist möglicherweise Kiss-ui, das sowohl die Windows- als auch die Linux-GUI-Entwicklung unterstützt, mit Win32-API-Zugriff sowie Unterstützung für die plattformübergreifende GTK. Andere Bibliotheken bieten eine umfassendere Unterstützung der Win32-API.

Auch wenn Microsoft Rust nicht direkt unterstützt, gibt es reichlich Community-Unterstützung. Während das Zusammenstellen einer vollständigen Toolkette möglicherweise immer noch eine Frage der Auswahl der verschiedenen benötigten Elemente und der Verwendung von Tools wie Rustup ist, um sie zu installieren, scheint die Einführung von Visual Studio Code-Erweiterungen und Erweiterungspaketen den Prozess zu vereinfachen. Regelmäßige Updates zeigen, dass dies ein Live-Projekt ist, an dem das Rust-Team und eine Vielzahl von Drittanbietern arbeiten.

Das zugrunde liegende Prinzip der Verwendung speichersicherer Sprachen ist wichtig, und es ist sicherlich gut zu sehen, wie sich die Mitarbeiter des MSRC mit dem Problem befassen. Bis es eine offizielle Veröffentlichung einer speichersicheren Programmiersprache für Low-Level-Systeme gibt, lohnt es sich auf jeden Fall, Rust noch einmal zu testen. Wenn Microsoft es wählt, sind Sie dem Spiel weit voraus.

Außerhalb von Windows ist Rust eine Schlüsselsprache für die Entwicklung von WebAssembly und sollte dazu beitragen, in der kommenden Chromium-basierten Version von Edge wesentlich leistungsfähigere Webanwendungen bereitzustellen - ein weiterer Grund, dies sorgfältig zu prüfen.