Rust (eBook)

Konzepte und Praxis für die sichere Anwendungsentwicklung
eBook Download: EPUB
2022 | 1. Auflage
456 Seiten
dpunkt (Verlag)
978-3-96910-615-0 (ISBN)

Lese- und Medienproben

Rust -  Marco Amann,  Joachim Baumann,  Marcel Koch
Systemvoraussetzungen
36,90 inkl. MwSt
  • Download sofort lieferbar
  • Zahlungsarten anzeigen
Sichere Programmierung für Profis - Kompakte Einführung und fortgeschrittene Themen - Praktische Beispiele wie Webanwendungen, Microservices, Mocking oder Language Bindings - Alle Codebeispiele online verfügbarDieses Buch vermittelt Anwendungsentwicklern Theorie und Praxis der Sprache Rust und zeigt, wo sie gewinnbringend in neuen Projekten verwendet und wie sie sich in bestehende Projekte gut integrieren lässt. Es illustriert alle Inhalte mit zahlreichen Beispielen. Nach einer Einführung in die Grundlagen, Nebenläufigkeit und das Testen mit Rust kommt der praktische Teil. Anhand einer Webapplikation und ihrer Aufteilung in Microservices werden die Vorteile und Eigenheiten der Sprache anschaulich vermittelt. Systemnahe Programmierung, die Kommunikation mit Sprachen wie Java, aber auch die Verwendung von WebAssembly werden ebenfalls betrachtet. Nach der Lektüre dieses Buchs kann man produktiv in Rust programmieren und hat neben den Grundlagen ein gutes Verständnis für typische Anwendungsbereiche der Sprache wie WebAssembly, Systemnahe Programmierung oder Einbindung in bestehende Umgebungen über Language Bindings.

Marco Amann hat Softwaretechnik studiert und arbeitet bei Digital Frontiers als Consultant. Er ist als einer der Experten der Digital Frontiers für das Thema Rust verantwortlich und hat Schwerpunkte in den Bereichen systemnaher Programmierung und robuster Systeme. Dr. Joachim Baumann ist Management Consultant und Geschäftsführer der Digital Frontiers GmbH & Co. KG. Er verfügt über mehr als 30 Jahre Erfahrung in der IT, als Entwickler, Architekt, Projektleiter, Scrum-Master und Berater und beschäftigt sich seit dem Jahr 2000 mit agilen Vorgehensweisen. Sein Wissen gibt er gerne in Form von Büchern, aber auch als Hochschuldozent und in Schulungen weiter, er ist aber auch immer noch Committer in Open-Source-Projekten. Marcel Koch vermittelt - ob zwischen Technologien oder Menschen. Er versteht es, in verschiedenste Technologien und Gebiete einzutauchen, die Vorteile zu nutzen und die Essenzen zu erklären. Als Kommunikationscoach setzt er auf gewaltfreie Kommunikation, Transaktionsanalyse und Radical Condor. Als Softwarearchitekt baut er auf konservative Technologien, wie zum Beispiel Kotlin oder Spring, und ergänzt diese bedarfsgerecht mit neueren wie WebAssembly oder Rust. www.marcelkoch.net

Marco Amann hat Softwaretechnik studiert und arbeitet bei Digital Frontiers als Consultant. Er ist als einer der Experten der Digital Frontiers für das Thema Rust verantwortlich und hat Schwerpunkte in den Bereichen systemnaher Programmierung und robuster Systeme. Dr. Joachim Baumann ist Management Consultant und Geschäftsführer der Digital Frontiers GmbH & Co. KG. Er verfügt über mehr als 30 Jahre Erfahrung in der IT, als Entwickler, Architekt, Projektleiter, Scrum-Master und Berater und beschäftigt sich seit dem Jahr 2000 mit agilen Vorgehensweisen. Sein Wissen gibt er gerne in Form von Büchern, aber auch als Hochschuldozent und in Schulungen weiter, er ist aber auch immer noch Committer in Open-Source-Projekten. Marcel Koch vermittelt - ob zwischen Technologien oder Menschen. Er versteht es, in verschiedenste Technologien und Gebiete einzutauchen, die Vorteile zu nutzen und die Essenzen zu erklären. Als Kommunikationscoach setzt er auf gewaltfreie Kommunikation, Transaktionsanalyse und Radical Condor. Als Softwarearchitekt baut er auf konservative Technologien, wie zum Beispiel Kotlin oder Spring, und ergänzt diese bedarfsgerecht mit neueren wie WebAssembly oder Rust. www.marcelkoch.net

1Rust – Einführung


In diesem Kapitel werfen wir einen ersten Blick auf Rust-Programme, betrachten die Installation von Rust und der Sprachunterstützung in verschiedenen Entwicklungsumgebungen, sodass wir möglichst schnell praktische Schritte mit der Sprache unternehmen, ein Beispielprogramm schreiben und mit dem Rust-eigenen Build-System übersetzen und starten können.

1.1Warum Rust?


Rust ist eine moderne Sprache, die sehr stark auf Geschwindigkeit und Parallelverarbeitung ausgelegt ist. Vielfach wird Rust als Systemprogrammiersprache und Ersatz für C dargestellt, der Anwendungsbereich ist aber sehr viel breiter. Betrachten wir ein paar der interessanten Eigenschaften von Rust.

1.1.1Rust und der Speicher

Das absolute Alleinstellungsmerkmal ist die Art, wie Rust mit Speicher umgeht. Rust kann garantieren, dass durch die Verwaltung des Speichers zur Übersetzungszeit keine Fehler zur Laufzeit auftreten können. Damit braucht Rust auch keinen Garbage Collector. Das verhindert unbeabsichtigte Unterbrechungen im Programmablauf, um den Speicher aufzuräumen. Wir haben also nicht nur korrektere Programme, die schneller laufen, sie verhalten sich auch deterministischer.

Um dies zu erreichen, wird für jeden Wert ein Eigentümer festgelegt. Dies kann ein primitiver Wert sein oder eine beliebig komplexe Struktur. Ein Wert lebt, solange der Eigentümer lebt.

Der Eigentümer kann wechseln, und für den Zugriff auf ein Objekt können Referenzen ausgeliehen werden (Borrowing). Ausgeliehene Referenzen sind im Normalfall Lesereferenzen, es kann aber alternativ auch maximal eine Schreib-/Lese-Referenz auf einen Wert definiert werden. Dies impliziert, dass wir keine aktive Lesereferenz haben. Die Beschränkung auf eine einzige schreibende Instanz sorgt bei Neulingen meist für Überraschungen, hat aber den großen Vorteil, dass es keine undefinierten Zustände durch gleichzeitiges Schreiben oder nicht synchronisiertes Lesen geben kann.

Dieses Ownership genannte Konzept ist extrem mächtig, braucht aber zum vollständigen Verinnerlichen etwas Zeit und Übung. Wir werden dies in Abschnitt 7.2 kennenlernen und in Kapitel 15 im Detail beleuchten.

1.1.2Rust und Objektorientierung

Rust ist eine Programmiersprache, die mit der Kapselung von Daten und Funktionen und Methoden auf diesen Daten objektorientierte Konzepte unterstützt.

Rust erreicht dies durch die Einführung von Modulen, die private und öffentliche Daten und Funktionen enthalten. Polymorphismus wird durch das Konzept der Traits erreicht, die inzwischen in vielen anderen Programmiersprachen wie Kotlin oder Scala auch verwendet werden. Eine vergleichbare Funktionalität gibt es in Java seit der Version 8 mit den Default-Methoden in Interface-Spezifikationen.

Rust bietet allerdings anders als die gewohnten objektorientierten Sprachen keine Vererbung. Dies mag im ersten Moment überraschen und ist eine Abkehr vom normalen objektorientierten Denken, hat aber gute Gründe.

Aus konzeptioneller Sicht ist es problematisch, dass wir bei der Vererbung nicht kontrollieren können, welche Teile unserer Elternklasse wir erben möchten. Dies kann dazu führen, dass wir in abgeleiteten Klassen Funktionalität haben, die dort nicht gewollt ist.

Das praktischere Argument ist aber, dass durch Verzicht auf Vererbung ein hoher Aufwand zur Identifikation der richtigen auszuführenden Methode/Funktion wegfällt. Dies macht Rust-Programme deutlich laufzeiteffizienter.

Wir werden uns mit objektorientierten Konzepten in Kapitel 9 auseinandersetzen.

1.1.3Rust und funktionale Programmierung

Zur Unterstützung funktionaler Programmierung bietet Rust Closures, anonyme Funktionen, die auf ihre Umgebung zur Zeit der Definition zugreifen können. Dieses vielseitige Konstrukt findet sich in mehr und mehr Sprachen und erlaubt eine sehr elegante Kapselung von Funktionalität und Daten.

Zusammen mit Iteratoren, die die Verarbeitung von Sammlungen von Daten kapseln, erlauben Closures sehr mächtige funktionale Abstraktionen. Iteratoren und Closures werden wir in Kapitel 11 kennenlernen.

1.1.4Rust und Parallelverarbeitung

Rust bietet eine direkte Abstraktion der Thread-Funktionalität des unterliegenden Betriebssystems. Dies sorgt für den geringstmöglichen Mehraufwand zur Laufzeit, beschränkt aber natürlich die Flexibilität in der Verwendung von Threads auf die Unterstützung durch das unterliegende System. Bei Bedarf können allerdings auch Thread-Module verwendet werden, die eine unabhängige und damit flexiblere Implementierung anbieten. Dies erlaubt uns, von Fall zu Fall zu entscheiden, ob wir die größere Flexibilität oder den geringeren Speicherbedarf bevorzugen. Während die Entscheidung in vielen Fällen in Richtung der Flexibilität getroffen werden wird, gibt es eingeschränkte Umgebungen (wie zum Beispiel Mikro-Controller), in denen die Möglichkeit der expliziten Wahl sehr vorteilhaft ist.

Viele der Probleme, die bei der normalen Programmierung von paralleler Verarbeitung zu sehr hoher Komplexität und damit zu schwer auffindbaren Fehlern führen, finden wir in Rust nicht. Dies entsteht durch das Ownership-Modell, das dafür sorgt, dass der Compiler problematische Stellen im Quelltext sehr früh identifizieren und damit entfernen kann. Das heißt nicht, dass Rust alle Probleme im Zusammenhang mit Parallelprogrammierung löst. Es erlaubt uns aber, uns auf die wirklich schwierigen Probleme zu konzentrieren.

Threads in Rust können kommunizieren, indem sie Nachrichten in verschiedene Kanälen senden oder aus diesen empfangen. Zusätzlich können sie Teile ihres Zustands geschützt durch eine Mutex-Abstraktion mit anderen Threads teilen.

Parallelprogrammierung in Rust ist sehr mächtig, und wir werden uns in Kapitel 16 eingehend damit beschäftigen.

1.2Ein Beispielprogramm


Als ein erstes Beispiel, um Ihren Appetit für Rust zu wecken, betrachten wir ein kleines Programm, das bereits viele Eigenschaften von Rust zeigt. Da dieses deutlich über das klassische »Hallo Welt«-Programm hinausgeht, sollten Sie sich keine Sorgen machen, wenn einzelne Funktionalitäten noch nicht vollständig klar sind. Die Erklärungen sind an dieser Stelle notwendigerweise etwas kurz, alle angesprochenen Eigenschaften werden wir später deutlich detaillierter betrachten.

Listing 1–1Zeilenweises Lesen und Ausgabe einer Datei

use std::fs::File as Datei;

use std::io::{BufReader, BufRead};

fn main() {

let file = Datei::open("hallo.txt")

.expect("Konnte Datei nicht öffnen");

let reader = BufReader::new(file);

for line in reader.lines() {

let line = line

.expect("Konnte Zeile nicht lesen");

println!("{}", line);

}

}

Wir beginnen mit dem Import benötigter Funktionalität (wie auch aus Java bekannt). Wir benennen den aus dem Namensraum beziehungsweise Modul std::fs (durch den Pfadtrenner :: getrennte Namen sind hierarchische Pfadangaben) importierten Typ File um in Datei und importieren im nächsten Schritt die beiden Typen BufReader und BufRead. Der Typ BufReader unterstützt gepuffertes Lesen aus einer Quelle und ist damit deutlich effizienter als ein direktes Lesen.

Dann folgt die Definition unserer ersten Funktion, gekennzeichnet durch das Schlüsselwort fn. In unserem Fall ist dies die Funktion main(), die keine Parameter und keinen Rückgabewert hat. Der Körper der Funktion findet sich im durch geschweifte Klammern definierten Block von Anweisungen, die durch Semikolon getrennt sind. Wie in vielen anderen Sprachen hat diese Funktion eine Sonderrolle: Sie ist der Einstiegspunkt in unser Programm und wird als Erstes aufgerufen, um den Programmabfluss zu starten.

Wir versuchen mit der Methode open() (eine Methode des Typs Datei, unserem umbenannten Typ File) eine Datei mit dem Namen hallo.txt zu öffnen. Dieser Aufruf liefert ein Objekt vom Typ Result zurück, das entweder das Ergebnis des erfolgreichen Aufrufs oder den durch den Aufruf ausgelösten Fehler enthält. Die Funktion expect() nimmt dieses Objekt und liefert im Erfolgsfall das Ergebnis zurück, im Fehlerfall wird die als Parameter übergebene Nachricht ausgegeben und das Programm mit einem...

Erscheint lt. Verlag 1.6.2022
Verlagsort Heidelberg
Sprache deutsch
Themenwelt Mathematik / Informatik Informatik Programmiersprachen / -werkzeuge
Schlagworte C • C# • C++ • Java • Microservices • Rust • security
ISBN-10 3-96910-615-X / 396910615X
ISBN-13 978-3-96910-615-0 / 9783969106150
Informationen gemäß Produktsicherheitsverordnung (GPSR)
Haben Sie eine Frage zum Produkt?
EPUBEPUB (Wasserzeichen)
Größe: 1,9 MB

DRM: Digitales Wasserzeichen
Dieses eBook enthält ein digitales Wasser­zeichen und ist damit für Sie persona­lisiert. Bei einer missbräuch­lichen Weiter­gabe des eBooks an Dritte ist eine Rück­ver­folgung an die Quelle möglich.

Dateiformat: EPUB (Electronic Publication)
EPUB ist ein offener Standard für eBooks und eignet sich besonders zur Darstellung von Belle­tristik und Sach­büchern. Der Fließ­text wird dynamisch an die Display- und Schrift­größe ange­passt. Auch für mobile Lese­geräte ist EPUB daher gut geeignet.

Systemvoraussetzungen:
PC/Mac: Mit einem PC oder Mac können Sie dieses eBook lesen. Sie benötigen dafür die kostenlose Software Adobe Digital Editions.
eReader: Dieses eBook kann mit (fast) allen eBook-Readern gelesen werden. Mit dem amazon-Kindle ist es aber nicht kompatibel.
Smartphone/Tablet: Egal ob Apple oder Android, dieses eBook können Sie lesen. Sie benötigen dafür eine kostenlose App.
Geräteliste und zusätzliche Hinweise

Buying eBooks from abroad
For tax law reasons we can sell eBooks just within Germany and Switzerland. Regrettably we cannot fulfill eBook-orders from other countries.

Mehr entdecken
aus dem Bereich
Das umfassende Handbuch

von Johannes Ernesti; Peter Kaiser

eBook Download (2023)
Rheinwerk Computing (Verlag)
44,90
Das Handbuch für Webentwickler

von Philip Ackermann

eBook Download (2023)
Rheinwerk Computing (Verlag)
49,90
Deterministische und randomisierte Algorithmen

von Volker Turau; Christoph Weyer

eBook Download (2024)
De Gruyter (Verlag)
64,95