Lesen Sie den Originalartikel auf packagemain.tech
Solltest du rosten oder solltest du gehen? Welche Sprache ist besser und macht diese Frage überhaupt Sinn? Lassen Sie uns mit unserem besonderen Gast John Arundel über Go vs. Rust im Jahr 2024 sprechen. John ist der Autor von „For the Love of Go“, „Cloud Native DevOps with Kubernetes“ und vielen anderen Büchern. Er unterrichtet auch sowohl Go als auch Rust, daher wird es interessant sein, seine Perspektive zu hören. Hier ist das Interview!
John, wir scheinen heutzutage immer mehr von Rust zu hören. Können Sie uns kurz vorstellen? Wozu dient Rust und warum existiert es?
Klar, das ist einfach. Rust ist eine Sprache zur Steuerung von Aufzügen.
Machst du Witze?
Überhaupt nicht. Graydon Hoare, der Gründer von Rust, war frustriert, als die Aufzüge in seinem Gebäude aufgrund von Softwareproblemen immer wieder ausfielen. Er dachte: „Sicherlich können wir es besser machen!“ Und der Rest ist Geschichte.
Wir können nicht alle Fehler verhindern, aber wir können zumindest eine Programmiersprache verwenden, die einige Hauptkategorien von Fehlern beseitigt, wie z. B. Pufferüberläufe, Datenrennen und „Use after Free“-Probleme. Daher lag der Fokus von Rust von Anfang an auf der Entwicklung zuverlässiger Software, der Automatisierung vieler Sicherheitsüberprüfungen, die gute Programmierer ohnehin durchführen, und der Unterstützung beim Erkennen von Fehlern, bevor sie in die Produktion gelangen.
Das klingt nach einer guten Idee, aber ich habe den Eindruck, dass Rust eine schwer zu erlernende Sprache ist – insbesondere im Vergleich zu Go. Ist das fair und wenn ja, warum?
Go und Rust versuchen beide auf unterschiedliche Weise, dasselbe Problem zu lösen: Es ist schwierig, Software in großem Maßstab in traditionellen Sprachen wie C und C++ zu schreiben, da die Programmierer sehr erfahren und sachkundig sein müssen, um Fehler zu vermeiden. Sogar Experten können von Zeit zu Zeit Fehler machen, und es dauert lange, Programmierer zu Experten auszubilden.
Go geht dieses Problem an, indem es die Sprache radikal vereinfacht: Im Vergleich zu etwas wie C++ muss viel weniger Syntax gelernt werden. So können Programmierer ihre Zeit damit verbringen, zu lernen, wie man Programme gut schreibt, anstatt eine große, komplexe Sprache zu beherrschen. Go ist schlank, aber effektiv.
Um eine Analogie zu verwenden: Es ist einfacher, das Fahren eines Traktors zu lernen, als das Fliegen eines Raumschiffs. Der Traktor mag eine bescheidene, pragmatische Maschine sein, aber er erfüllt seine Aufgabe perfekt und ist für viele Aufgaben tatsächlich die bessere Wahl als das Raumschiff: zum Beispiel beim Pflügen eines Feldes.
Ich mag deine Analogie. Ich schätze, Rust ist das Raumschiff?
Ja, Rust ist groß, kompliziert und leistungsstark und kombiniert viele der besten Ideen aus traditionellen imperativen Sprachen wie C mit funktionalen Programmierkonzepten, die von Sprachen wie Haskell und Lisp übernommen wurden.
In Rust gibt es mehr zu lernen als in Go, aber es leistet auch mehr! Wenn Sie zum Mars fliegen möchten, ist ein Raumschiff die bessere Wahl als ein Traktor. Natürlich dauert die Ausbildung eines Astronauten etwas länger als die Ausbildung eines Traktorfahrers.
Go verfügt über eine integrierte Speicherbereinigung, die der Einfachheit halber großartig ist. Wie funktioniert die Speicherverwaltung in Rust und ist das Erlernen eine große Herausforderung?
Ja, Garbage Collection bedeutet, dass Sie sich nicht wie in Sprachen wie C++ selbst um die Zuweisung und Freigabe von Speicher kümmern müssen. Das erleichtert die Programmierung und beseitigt alle möglichen speicherbezogenen Fehler. Andererseits benötigen Sie eine relativ komplexe Laufzeit und die Speicherbereinigung beeinträchtigt die Leistung.
Rust verfolgt einen anderen Ansatz. Der Speicher wird automatisch wiederhergestellt, ohne dass das Programm angehalten werden muss. Dies kann erreicht werden, indem alle vorhandenen Verweise auf ein bestimmtes Datenelement verfolgt werden. Wenn kein Teil des Programms mehr auf die Daten zugreifen kann, weiß Rust, dass ein Teil des Speichers sofort sicher recycelt werden kann.
Ja, ich habe gehört, dass Rust einen starken Fokus auf Eigentum und Kreditaufnahme legt. Wie lassen sich diese Konzepte mit der Arbeit mit Zeigern in Go vergleichen, und welche guten Möglichkeiten gibt es, sie zu verstehen?
Nun, ich habe gute Nachrichten: Wenn Sie bereits an Zeiger in Go gewöhnt sind, funktionieren Referenzen in Rust im Grunde genauso, nur sicherer. Wenn Sie einen veränderlichen Verweis auf eine Variable erstellen, funktioniert dieser genau wie ein Go-Zeiger: Sie können ihn an eine Funktion übergeben oder irgendwo speichern.
Aber anders als in Go hat es, solange diese veränderliche Referenz vorhanden ist, exklusiven Zugriff auf die Daten: Niemand sonst kann sie ändern oder gar lesen. In Go-Begriffen ist es so, als hätte man eine automatische Mutex-Sperre. Und wenn eine Funktion die Daten nicht ändern muss, kann sie stattdessen eine gemeinsame Referenz ausleihen, die schreibgeschützt ist und von der viele gleichzeitig existieren können.
Rust verfolgt auch die Originaldaten: Wenn sie den Gültigkeitsbereich verlassen, sind alle Verweise darauf nicht mehr gültig. Daher kann der Compiler viele Arten von Fehlern durch baumelnde Zeiger erkennen, wenn Sie versuchen, einen Verweis auf einen Wert zu verwenden, der nicht mehr existiert. Das führt zu undefiniertem Verhalten, was eine schöne Art zu sagen ist, dass etwas Schreckliches passieren wird, und Teil von Rusts Wertversprechen ist „kein undefiniertes Verhalten – niemals“.
In Rust müssen wir dann einen Weg finden, unsere Programme so zu schreiben, dass Verweise auf Daten immer gültig sind und immer nur ein veränderlicher Verweis gleichzeitig existiert. Das ist etwas gewöhnungsbedürftig (Rust-Programmierer nennen es „Kampf gegen den Kreditprüfer“), aber die resultierenden Programme sind zuverlässiger und wahrscheinlicher korrekt.
Zum Beispiel sind alle Go-Programmierer mit Datenrennen vertraut, bei denen zwei oder mehr Goroutinen gleichzeitig versuchen, auf einige gemeinsam genutzte Daten zuzugreifen, mit unvorhersehbaren Ergebnissen: Im besten Fall stürzt das Programm ab und im schlimmsten Fall läuft es weiter mit beschädigten oder ungültigen Daten.
In Rust lässt sich ein Programm wie dieses nicht kompilieren! Die Eigentums- und Referenzregeln bedeuten, dass zwei veränderliche Referenzen auf dieselbe Sache nicht gleichzeitig existieren können. Man muss das Problem einfach anders lösen.
Das bringt uns direkt zur Parallelität. Ich mag die Parallelitätsfunktionen von Go mit Kanälen und Goroutinen. Wie geht Rust mit Parallelität um und gibt es irgendwelche Ähnlichkeiten, die ich aus meiner Go-Erfahrung nutzen kann?
Ja, Goroutinen und Kanäle sind großartig: eine superleichte Aufgabenabstraktion, die im Vergleich zu herkömmlichem Multithreading sehr günstig ist. Andererseits stellt uns Go nur die grundlegenden Bausteine zur Verfügung: Es liegt an uns, dafür zu sorgen, dass wir sie sicher verwenden und Datenwettläufe oder Deadlocks vermeiden. Und das kann schwierig sein!
Rust hat keine Goroutinen, aber es gibt asynchrone Aufgaben, die Goroutinen sehr ähneln, nur mit den üblichen Rust-Sicherheitsgarantien. Es gibt auch einige hervorragende Frameworks von Drittanbietern wie Tokio und Rayon, die einfach eine Menge Daten aufnehmen und automatisch herausfinden können, wie sie diese am effizientesten parallel verarbeiten können.
Obwohl es immer schwierig sein wird, nebenläufige Programme gut zu schreiben, werden Sie feststellen, dass sich diese Fähigkeiten auch gut auf Rust übertragen lassen, wenn Sie es in Go schaffen.
Ich lerne gerne durch Handeln. Gibt es gute praktische Übungen oder Projekte, die Sie einem Go-Programmierer zum Einstieg in Rust empfehlen würden, wie zum Beispiel die Tour of Go?
Rustlings ist ein toller Ausgangspunkt: Es handelt sich um eine Reihe interaktiver, mundgerechter Übungen, die Sie durch alle Sprachgrundlagen führen. Wenn Sie Feedback von einem echten Menschen erhalten möchten, schauen Sie sich den Rust-Track „Exercism“ an. Es gibt auch Rust by example, eine großartige Ressource für funktionierende Beispielschnipsel.
Es hört sich an, als wären Sie ein Fan beider Sprachen. Was bevorzugen Sie und würden Sie jemandem, der Go bereits kennt, empfehlen, auch Rust zu lernen?
Ja, Go und Rust sprechen jeweils unterschiedliche Teile meines Gehirns an. Ich mag die radikale Einfachheit und den Pragmatismus von Go: Es macht viel mit sehr wenig und löst die meisten Probleme ziemlich gut.
Rust hingegen füllt genau die Lücken, in denen Go keine ideale Wahl ist: Kernel, Firmware, eingebettete Geräte und sicherheitskritische Anwendungen wie medizinische Geräte, Industrie, Luft- und Raumfahrt usw.
Und Aufzüge natürlich.
Natürlich! Ich mag diesen Aspekt von Rust und es ist auch einfach eine wirklich lustige und ausdrucksstarke Sprache. Ich denke, es lohnt sich auf jeden Fall, mit Rust herumzuspielen und lange genug dabei zu bleiben, um die anfängliche Ungewohntheit der Syntax und die Schwierigkeiten mit dem Borrow-Checker zu überwinden.
Selbst wenn Sie entscheiden, dass Rust nichts für Sie ist, lernen Sie einige interessante neue Denkweisen über Probleme kennen und es hilft Ihnen auch, mehr über die verschiedenen Kompromisse zu verstehen, die Go eingeht.
Aus beruflicher Sicht werden sowohl Go als auch Rust auf absehbare Zeit sehr wertvolle Fähigkeiten sein. Ich denke, dass wir bald statt „Go vs. Rust“ über „Go und Rust vs. alles andere“ sprechen werden.
John, vielen Dank, dass du unser Gast bist und uns deine Sicht auf Go und Rust teilst. Wo können Menschen mehr über Sie erfahren – zum Beispiel, wenn sie sich für Ihre Bücher oder Schulungen interessieren?
Es ist mir ein Vergnügen! Schauen Sie auf meiner Website unter bitfieldconsulting.com vorbei, wenn Sie mehr wissen möchten, oder nehmen Sie Kontakt mit mir auf – ich stehe Ihnen gerne für ein Gespräch zur Verfügung.
Das obige ist der detaillierte Inhalt vonRost für Gophers. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!