Rust und Go sind beide großartig
Erstens ist es wirklich wichtig zu sagen, dass sowohl Go als auch Rust absolut ausgezeichnete Programmiersprachen sind. Sie sind modern, leistungsstark, weit verbreitet und bieten hervorragende Leistung. Möglicherweise haben Sie Artikel und Blogbeiträge gelesen, um Sie davon zu überzeugen, dass Go besser ist als Rust oder umgekehrt. Aber das macht wirklich keinen Sinn; Jede Programmiersprache stellt eine Reihe von Kompromissen dar. Jede Sprache ist für verschiedene Dinge optimiert, daher sollte Ihre Sprachwahl davon abhängen, was zu Ihnen passt und welche Probleme Sie damit lösen möchten.
In diesem Artikel werde ich versuchen, einen kurzen Überblick darüber zu geben, wo ich denke, dass Go die ideale Wahl ist und wo ich denke, dass Rust eine bessere Alternative ist. Idealerweise sollten Sie jedoch mit beiden Sprachen vertraut sein. Obwohl sie sich in Syntax und Stil sehr unterscheiden, sind sowohl Rust als auch Go erstklassige Tools zum Erstellen von Software. Schauen wir uns die beiden Sprachen genauer an.
Die Ähnlichkeiten
Rust und Go haben viel gemeinsam, was ein Grund ist, warum man sie oft zusammen erwähnt. Was sind einige der gemeinsamen Ziele beider Sprachen?
Rust ist eine statisch typisierte Multi-Paradigmen-Programmiersprache auf niedriger Ebene, die sich auf Sicherheit und Leistung konzentriert.
-Gints Dreimanis
Go ist eine Open-Source-Programmiersprache, die es einfach macht, einfache, zuverlässige und effiziente Software zu erstellen.
—Golang.org
Speichersicherheit
Sowohl Go als auch Rust gehören zur Gruppe der modernen Programmiersprachen, deren Priorität die Speichersicherheit ist. Über viele Jahrzehnte der Verwendung älterer Sprachen wie C und C ++ wurde deutlich, dass eine der Hauptursachen für Fehler und Sicherheitslücken darin besteht, dass der Speicher nicht sicher oder falsch zugegriffen wird. Rust und Go befassen sich auf unterschiedliche Weise mit diesem Problem, aber beide zielen darauf ab, intelligenter und sicherer als andere Sprachen beim Verwalten des Speichers zu sein und Ihnen beim Schreiben korrekter und leistungsfähiger Programme zu helfen.
Schnelle, kompakte ausführbare Dateien
Sie sind beide kompilierte Sprachen, was bedeutet, dass Ihre Programme direkt in ausführbaren Maschinencode übersetzt werden, so dass Sie Ihr Programm als einzelne Binärdatei bereitstellen können; Im Gegensatz zu interpretierten Sprachen wie Python und Ruby müssen Sie keinen Interpreter und viele Bibliotheken und Abhängigkeiten zusammen mit Ihrem Programm verteilen, was ein großes Plus ist. Dies macht sowohl Rust- als auch Go-Programme im Vergleich zu interpretierten Sprachen extrem schnell.
Allzwecksprachen
Rust und Go sind ebenfalls leistungsstarke, skalierbare Allzweckprogrammiersprachen, mit denen Sie alle Arten moderner Software entwickeln können, von Webanwendungen bis hin zu verteilten Microservices oder von eingebetteten Mikrocontrollern bis hin zu mobilen Apps. Beide haben ausgezeichnete Standardbibliotheken und ein blühendes Ökosystem von Drittanbietern, sowie große kommerzielle Unterstützung und eine große Nutzerbasis. Sie sind beide schon seit vielen Jahren und werden auch in den kommenden Jahren weit verbreitet sein. Wenn Sie heute entweder Go oder Rust lernen, ist dies eine solide Investition Ihrer Zeit und Mühe.
Pragmatischer Programmierstil
Weder sind in erster Linie funktionale Sprachen (wie Scala oder Elixir, zum Beispiel), und weder sind ausschließlich objektorientiert (wie Java und C #). Während Go und Rust Funktionen haben, die mit funktionaler und objektorientierter Programmierung verbunden sind, sind sie pragmatische Sprachen, die darauf abzielen, Probleme auf die am besten geeignete Weise zu lösen, anstatt Sie zu einer bestimmten Vorgehensweise zu zwingen. (Wenn Sie den funktionalen Stil der Programmierung mögen, werden Sie in Rust viel mehr Möglichkeiten dafür finden, weil Rust viel mehr Möglichkeiten hat als Go im Allgemeinen.)
Wir können darüber diskutieren, was eine “objektorientierte” Sprache ist, aber es ist fair zu sagen, dass der Stil der objektorientierten Programmierung, den C ++ -, Java- oder C # -Benutzer erwarten würden, weder in Go noch in Rust vorhanden ist.
-Jack Mott
Entwicklung in großem Maßstab
Sowohl Rust als auch Go haben einige nützliche Funktionen, die sie für die Programmierung im Großen geeignet machen, egal ob dies große Teams oder große Codebasen oder beides bedeutet.Zum Beispiel, während C-Programmierer seit Jahren darüber streiten, wo sie ihre Klammern setzen sollen und ob Code mit Tabulatoren oder Leerzeichen eingerückt werden soll, beseitigen sowohl Rust als auch Go solche Probleme vollständig, indem sie ein Standardformatierungswerkzeug verwenden (gofmt
für Go, rustfmt
für Rust), das Ihren Code automatisch im kanonischen Stil umschreibt. Es ist nicht so, dass dieser besondere Stil an sich so wunderbar ist: Es ist die Standardisierung, die Rust- und Go-Programmierer schätzen.
> gofmt
‘s style is no one’s favourite, yet gofmt
is everyone’s favourite.
—Rob Pike
Ein weiterer Bereich, in dem beide Sprachen punkten, ist in der Build-Pipeline. Beide haben ausgezeichnete, eingebaute, leistungsstarke Standard-Build- und Abhängigkeitsmanagement-Tools; kein Ringen mehr mit komplexen Build-Systemen von Drittanbietern und alle paar Jahre ein neues lernen zu müssen.
Das Erstellen von Go- und Rust-Code, der in meiner frühen Karriere aus Java und Ruby stammte, fühlte sich wie ein unmögliches Gewicht von meinen Schultern an. Als ich bei Google war, war es eine Erleichterung, auf einen Dienst zu stoßen, der in Go geschrieben war, weil ich wusste, dass er einfach zu erstellen und auszuführen sein würde. Dies gilt auch für Rust , obwohl ich nur in viel kleinerem Maßstab daran gearbeitet habe. Ich hoffe, dass die Tage der unendlich konfigurierbaren Build-Systeme tot sind und alle Sprachen mit ihren eigenen speziell entwickelten Build-Tools ausgeliefert werden, die sofort einsatzbereit sind.
-Sam Rose
Also, worum geht es?
Vor diesem Hintergrund und angesichts der Tatsache, dass beide Sprachen so gut gestaltet und mächtig sind, fragen Sie sich vielleicht, worum es in all den heiligen Kriegen geht (auch bei mir). Warum machen die Leute so viel Aufhebens um ‘Go versus Rust’, geraten in wütende Social-Media-Spats und schreiben lange Blogbeiträge darüber, wie nur ein Idiot Rust benutzen würde, oder dass Go keine echte Programmiersprache ist oder was auch immer. Es könnte ihnen helfen, sich besser zu fühlen, aber es hilft Ihnen nicht gerade, als jemand, der versucht zu entscheiden, welche Sprache Sie für Ihr Projekt verwenden oder welche Sie lernen sollten, um Ihre Programmierkarriere voranzutreiben. Ein weiser Mensch trifft keine wichtigen Entscheidungen basierend darauf, wer am lautesten schreit.
Lassen Sie uns unsere erwachsene Diskussion jetzt fortsetzen, indem wir uns einige Bereiche ansehen, in denen eine vernünftige Person eine Sprache der anderen vorziehen könnte.
Performance
Wir haben gesagt, dass sowohl Go als auch Rust extrem schnelle Programme produzieren, weil sie zu nativem Maschinencode kompiliert werden, ohne einen Interpreter oder eine virtuelle Maschine durchlaufen zu müssen. Die Leistung von Rust ist jedoch besonders herausragend. Es ist vergleichbar mit C und C ++, die oft als die leistungsstärksten kompilierten Sprachen angesehen werden, aber im Gegensatz zu diesen älteren Sprachen bietet es auch Speichersicherheit und Parallelitätssicherheit bei im Wesentlichen keinen Kosten in der Ausführungsgeschwindigkeit. Mit Rust können Sie auch komplexe Abstraktionen erstellen, ohne zur Laufzeit eine Leistungseinbuße zu zahlen.Im Vergleich dazu, obwohl Go-Programme auch sehr gut funktionieren, ist Go in erster Linie für die Geschwindigkeit der Entwicklung (einschließlich der Kompilierung) und nicht für die Geschwindigkeit der Ausführung ausgelegt. Der Go-Compiler verbringt nicht viel Zeit damit, den effizientesten möglichen Maschinencode zu generieren. es kümmert sich mehr darum, viel Code schnell zu kompilieren. So wird Rust normalerweise Go in Laufzeit-Benchmarks schlagen.
Die Laufzeitleistung von Rust ist ebenfalls konsistent und vorhersehbar, da keine Garbage Collection verwendet wird. Der Garbage Collector von Go ist sehr effizient und optimiert, um die Stop-the-World-Pausen so kurz wie möglich zu gestalten (und mit jeder neuen Go-Version kürzer zu werden). Die Garbage Collection führt jedoch zwangsläufig zu einer gewissen Unvorhersehbarkeit des Verhaltens von Programmen, was in einigen Anwendungen, z. B. eingebetteten Systemen, ein ernstes Problem darstellen kann.Da Rust darauf abzielt, dem Programmierer die vollständige Kontrolle über die zugrunde liegende Hardware zu geben, ist es möglich, Rust-Programme so zu optimieren, dass sie der maximalen theoretischen Leistung der Maschine ziemlich nahe kommen. Dies macht Rust zu einer ausgezeichneten Wahl für Bereiche, in denen die Ausführungsgeschwindigkeit alle anderen Überlegungen übertrifft, wie Spieleprogrammierung, Betriebssystemkernel, Webbrowserkomponenten und Echtzeitsteuerungssysteme.
Einfachheit
Es spielt keine Rolle, wie schnell eine Programmiersprache ist, wenn niemand herausfinden kann, wie man sie benutzt. Go wurde bewusst als Reaktion auf die ständig wachsende Komplexität von Sprachen wie C ++ konzipiert; Es hat sehr wenig Syntax, sehr wenige Schlüsselwörter und in der Tat wenige Funktionen. Dies bedeutet, dass es nicht lange dauert, die Go-Sprache so weit zu lernen, dass Sie nützliche Programme darin schreiben können.
Go ist unglaublich einfach zu erlernen. Ich weiß, dass dies ein oft angepriesener Vorteil ist, aber ich war wirklich überrascht, wie schnell ich produktiv sein konnte. Dank der Sprache, der Dokumente und der Tools schrieb ich nach buchstäblich zwei Tagen interessanten, verbindlichen Code.
— Frühe Eindrücke von Go Von einem Rust-Programmierer
Das Schlüsselwort hier ist Einfachheit. Einfach ist sicher nicht dasselbe wie einfach, aber eine kleine, einfache Sprache ist leichter zu lernen als eine große, komplexe. Es gibt einfach nicht so viele verschiedene Möglichkeiten, Dinge zu tun, so dass alle gut geschriebenen Go-Code tendenziell gleich aussehen. Es ist einfach, einfach in einen unbekannten Dienst einzutauchen und zu verstehen, was er tut.
fmt.Println("Gopher's Diner Breakfast Menu")for dish, price := range menu { fmt.Println(dish, price)}
(In der Code Club-Serie mache ich genau das: Wähle Go-Projekte halb zufällig aus GitHub und erforsche sie mit einer Gruppe von Go-Anfängern, um zu sehen, wie viel von dem Code wir verstehen können. Es stellt sich immer mehr heraus, als wir erwartet hatten!)
Obwohl die Kernsprache klein ist, ist die Standardbibliothek von Go sehr leistungsfähig. Das bedeutet, dass Ihre Lernkurve auch die Teile der Standardbibliothek enthalten muss, die Sie benötigen, nicht nur die Syntax. Auf der anderen Seite bedeutet das Verschieben der Funktionalität aus der Sprache in die Standardbibliothek, dass Sie sich darauf konzentrieren können, nur die Bibliotheken zu lernen, die für Sie gerade relevant sind.
Go ist auch für die Softwareentwicklung in großem Maßstab mit großen Codebasen und großen Teams konzipiert. In diesen Situationen ist es wichtig, dass neue Entwickler so schnell wie möglich auf den neuesten Stand kommen.
Mit Go erledigen Sie alles — schnell. Go ist eine der produktivsten Sprachen, mit denen ich je gearbeitet habe. Das Mantra lautet: > löse heute echte Probleme> .
-Matthias Endler
Eigenschaften
Rust unterstützt mehr Komplexität als mehrere andere Programmiersprachen, daher können Sie damit mehr erreichen. Zum Beispiel unterstützt es Generika.
—Devathon
Rust wurde speziell entwickelt, um viele leistungsstarke und nützliche Funktionen zu enthalten, die Programmierern helfen, mit dem geringsten Code das Beste zu erreichen. Mit der match
-Funktion von Rust können Sie beispielsweise flexible, ausdrucksstarke Logik ganz prägnant schreiben:
fn is_prime(n: u64) -> bool { match n { 0...1 => false, _ => !(2..n).any(|d| n % d == 0), }}
Da Rust viel kann, gibt es vor allem am Anfang viel zu lernen. Aber das ist in Ordnung: In C ++ oder Java gibt es auch viel zu lernen, und Sie erhalten nicht die erweiterten Funktionen, die mit Rust geliefert werden, wie z. B. die Speichersicherheit. Rust als komplexe Sprache zu kritisieren, verfehlt den Punkt: Es ist so konzipiert, dass es ausdrucksstark ist, was bedeutet, dass es viele Funktionen hat, und in vielen Situationen ist es das, was Sie von einer Programmiersprache erwarten. Es gibt sicher eine Lernkurve, aber sobald Sie damit fertig sind, wird es Ihnen gut gehen.
Rust konkurriert um Mindshare mit C ++ und D für Programmierer, die bereit sind, komplexere Syntax und Semantik (und vermutlich höhere Lesbarkeitskosten) als Gegenleistung für die maximal mögliche Leistung zu akzeptieren.
—Dave Cheney
Concurrency
Die meisten Sprachen haben eine Form der Unterstützung für die gleichzeitige Programmierung (mehrere Dinge auf einmal), aber Go wurde von Grund auf für diesen Job entwickelt. Anstatt Betriebssystem-Threads zu verwenden, bietet Go eine leichte Alternative: Goroutinen. Jede Goroutine ist eine unabhängig ausgeführte Go-Funktion, die der Go-Scheduler einem der von ihm kontrollierten OS-Threads zuordnet. Dies bedeutet, dass der Scheduler eine große Anzahl gleichzeitiger Goroutinen sehr effizient verwalten kann, wobei nur eine begrenzte Anzahl von Betriebssystemthreads verwendet wird.
Folglich können Sie Millionen von gleichzeitigen Goroutinen in einem einzigen Programm ausführen, ohne ernsthafte Leistungsprobleme zu verursachen. Das macht Go zur perfekten Wahl für hochskalierte gleichzeitige Anwendungen wie Webserver und Microservices.
Go bietet auch schnelle, sichere und effiziente Möglichkeiten für Goroutinen, über Kanäle zu kommunizieren und Daten auszutauschen. Die Parallelitätsunterstützung von Go fühlt sich gut gestaltet und angenehm zu bedienen an. Das Denken über gleichzeitige Programme ist im Allgemeinen schwierig, und das Erstellen zuverlässiger, korrekter gleichzeitiger Programme ist in jeder Sprache eine Herausforderung. Da es jedoch von Anfang an in die Sprache integriert wurde, ist die gleichzeitige Programmierung in Go nicht nur nachträglich, sondern auch so einfach und gut integriert, wie es vernünftigerweise möglich wäre.
Go macht es sehr einfach, eine schön faktorisierte Anwendung zu erstellen, die alle Vorteile der Parallelität nutzt, während sie als eine Reihe von Microservices bereitgestellt wird. Rust kann diese Dinge auch tun, aber es ist wohl ein bisschen härter. In gewisser Hinsicht bedeutet Rusts Besessenheit, speicherbezogene Sicherheitslücken zu verhindern, dass Programmierer alles tun müssen, um Aufgaben auszuführen, die in anderen Sprachen, einschließlich Go, einfacher wären.
-Sonya Koptyev
Die Parallelitätsgeschichte in Rust ist im Vergleich dazu sehr neu und stabilisiert sich immer noch, aber sie befindet sich in einer sehr aktiven Entwicklung. Zum Beispiel bietet die Rayon-Bibliothek von Rust eine sehr elegante und leichte Möglichkeit, sequentielle Berechnungen in parallele umzuwandeln.
Eine leichte Syntax für das Laichen von Go-Routinen und die Verwendung von Kanälen zu haben, ist wirklich nett. Es zeigt wirklich die Macht der Syntax, dass solche kleinen Details die gleichzeitige Programmierung so viel schöner machen als in anderen Sprachen.
—Frühe Eindrücke von Go Von einem Rust-Programmierer
Es mag zwar etwas weniger einfach sein, gleichzeitige Programme in Rust zu implementieren, aber es ist immer noch möglich, und diese Programme können die Sicherheitsgarantien von Rust nutzen. Ein gutes Beispiel ist die Mutex
Klasse der Standardbibliothek: In Go können Sie vergessen, eine Mutex-Sperre zu erhalten, bevor Sie auf etwas zugreifen, aber Rust lässt Sie das nicht zu.
Go konzentriert sich auf Parallelität als erstklassiges Konzept. Das heißt nicht, dass Sie in Rust keine Aspekte der akteursorientierten Parallelität von Go finden können, aber es bleibt dem Programmierer als Übung überlassen.
—Dave Cheney
Sicherheit
Wir haben bereits gesehen, dass sowohl Go als auch Rust auf unterschiedliche Weise darauf abzielen, eine große Klasse häufiger Programmierfehler zu verhindern, die mit der Speicherverwaltung zu tun haben. Aber insbesondere Rust unternimmt große Anstrengungen, um sicherzustellen, dass Sie nichts Unsicheres tun können, was Sie nicht tun wollten.
Der sehr strenge und pedantische Compiler von Rust überprüft jede Variable, die Sie verwenden, und jede Speicheradresse, auf die Sie verweisen. Es vermeidet mögliche Daten-Race-Bedingungen und informiert Sie über undefiniertes Verhalten. Parallelitäts- und Speichersicherheitsprobleme sind grundsätzlich nicht in der sicheren Teilmenge von Rust zu finden.
-Warum Rost?
Dies wird die Programmierung in Rust zu einer anderen Erfahrung machen als fast alle anderen Sprachen, und es kann zunächst eine Herausforderung sein. Aber für viele Menschen lohnt sich die harte Arbeit.
Für mich ist der Hauptvorteil von Rust das Gefühl, dass der Compiler meinen Rücken hat und keinen Fehler durchlässt, den er möglicherweise erkennen könnte (im Ernst, es fühlt sich manchmal wie Magie an).
-Grzegorz Nosek
Viele Sprachen, einschließlich Go, haben Möglichkeiten, Programmierern zu helfen, Fehler zu vermeiden, aber Rust bringt dies auf eine neue Ebene, so dass potenziell falsche Programme nicht einmal kompiliert werden.
Mit Rust hat der Bibliotheksprogrammierer viele Werkzeuge, um zu verhindern, dass seine Benutzer Fehler machen. Rust gibt uns die Möglichkeit zu sagen, dass wir > besitzen> ein bestimmtes Stück Daten; Es ist nicht möglich, dass irgendetwas anderes das Eigentum beansprucht, also wissen wir, dass nichts anderes es ändern kann. Ich kann mir keine Zeit vorstellen, in der ich jemals so viele Tools erhalten habe, um versehentlichen Missbrauch zu verhindern. Es ist ein wunderbares Gefühl.
—Sam Rose
“Kämpfen mit dem Borrow Checker” ist ein häufiges Syndrom für neue Rust-Programmierer, aber in den meisten Fällen sind die Probleme, die es findet, echte Fehler (oder zumindest potenzielle Fehler) in Ihrem Code. Es kann Sie zwingen, Ihr Programm grundlegend neu zu gestalten, um diese Probleme zu vermeiden. und das ist eine gute Sache, wenn Korrektheit und Zuverlässigkeit oberste Priorität haben. Was ist der Sinn einer Sprache, die die Art und Weise, wie Sie programmieren, nicht ändert? Die Lektionen, die Rust über Sicherheit lehrt, können auch nützlich sein, wenn Sie in anderen Sprachen arbeiten.
Wenn Sie sich für Rust entscheiden, benötigen Sie normalerweise die Garantien, die die Sprache bietet: Sicherheit gegen Nullzeiger und Datenrennen, vorhersehbares Laufzeitverhalten und vollständige Kontrolle über die Hardware. Wenn Sie keine dieser Funktionen benötigen, ist Rust möglicherweise eine schlechte Wahl für Ihr nächstes Projekt. Das liegt daran, dass diese Garantien mit Kosten verbunden sind: Anlaufzeit. Sie müssen schlechte Gewohnheiten verlernen und neue Konzepte lernen. Die Chancen stehen gut, dass Sie zu Beginn viel mit dem Kreditprüfer kämpfen werden.
-Matthias Endler
Wie herausfordernd Sie das Programmiermodell von Rust finden, hängt wahrscheinlich davon ab, welche Vorkenntnisse Sie in anderen Sprachen haben. Python- oder Ruby-Programmierer mögen es restriktiv finden; andere werden begeistert sein.
Wenn Sie ein C- oder C ++ – Programmierer sind, der wochenlang Speichersicherheitsfehler in diesen Sprachen gejagt hat, werden Sie Rust wirklich zu schätzen wissen. Aus “Fighting the borrow Checker” wird “Der Compiler kann das erkennen? Cool!”
—Grzegorz Nosek
Scale
Die heutigen Serverprogramme umfassen zig Millionen Codezeilen, werden von Hunderten oder sogar Tausenden von Programmierern bearbeitet und buchstäblich jeden Tag aktualisiert. Go wurde entworfen und entwickelt, um das Arbeiten in dieser Umgebung produktiver zu gestalten. Zu den Designüberlegungen von Go gehören ein strenges Abhängigkeitsmanagement, die Anpassungsfähigkeit der Softwarearchitektur an wachsende Systeme und die Robustheit über die Grenzen zwischen Komponenten hinweg.
-Rob Pike
Wenn Sie alleine oder in kleinen Teams an einem Problem arbeiten, ist die Wahl einer einfachen oder einer umfangreichen Sprache eine Frage der Präferenz. Aber wenn die Software größer und komplexer wird und die Teams größer werden, zeigen sich die Unterschiede. Für große Anwendungen und verteilte Systeme ist die Ausführungsgeschwindigkeit weniger wichtig als die Entwicklungsgeschwindigkeit: Eine bewusst minimale Sprache wie Go verkürzt die Anlaufzeit für neue Entwickler und erleichtert ihnen die Arbeit mit einer großen Codebasis.
Mit Go ist es als Junior-Entwickler einfacher, produktiver zu sein, und als Mid-Level-Entwickler schwieriger, spröde Abstraktionen einzuführen, die später Probleme verursachen. Aus diesen Gründen ist Rust weniger überzeugend als Go für die Entwicklung von Unternehmenssoftware.
-Loris Cro
Wenn es um Software-Entwicklung in der großen kommt, klar ist besser als klug. Die Einschränkungen von Go machen es für Unternehmen und große Organisationen besser geeignet als komplexere und leistungsfähigere Sprachen wie Rust.
Die Unterschiede
Obwohl Rust und Go beide beliebte, moderne und weit verbreitete Sprachen sind, sind sie keine wirklichen Konkurrenten in dem Sinne, dass sie absichtlich auf ganz andere Anwendungsfälle abzielen. Der gesamte Programmieransatz von Go unterscheidet sich radikal von dem von Rust, und jede Sprache passt zu einigen Leuten, während sie andere irritiert. Das ist absolut in Ordnung, und wenn sowohl Rust als auch Go mehr oder weniger die gleichen Dinge auf mehr oder weniger die gleiche Weise tun würden, würden wir nicht wirklich zwei verschiedene Sprachen brauchen.
Können wir also ein Gefühl für die jeweilige Natur von Rust bekommen und Probleme finden, bei denen sie drastisch unterschiedliche Ansätze verfolgen? Lass es uns herausfinden.
Garbage Collection
“Müll sammeln oder nicht Müll sammeln” ist eine dieser Fragen, die keine richtige Antwort hat. Die Speicherbereinigung und die automatische Speicherverwaltung im Allgemeinen machen es schnell und einfach, zuverlässige, effiziente Programme zu entwickeln, und für manche Menschen ist dies unerlässlich. Andere sagen jedoch, dass die Garbage Collection mit ihrem Leistungsaufwand und ihren Stop-the-World-Pausen dazu führt, dass sich Programme zur Laufzeit unvorhersehbar verhalten und inakzeptable Latenzzeiten verursachen. Die Debatte rumpelt weiter.
Go ist eine ganz andere Sprache als Rust. Obwohl beide vage als Systemsprachen oder Ersatz für C beschrieben werden können, haben sie unterschiedliche Ziele und Anwendungen, Stile des Sprachdesigns und Prioritäten. Garbage Collection ist ein wirklich großes Unterscheidungsmerkmal. GC in Go zu haben, macht die Sprache viel einfacher und kleiner und lässt sich leicht begründen.
GC in Rust nicht zu haben, macht es wirklich schnell (besonders wenn Sie eine garantierte Latenz benötigen, nicht nur einen hohen Durchsatz) und ermöglicht Funktionen und Programmiermuster, die in Go nicht möglich sind (oder zumindest nicht ohne Leistungseinbußen).
-PingCAP
Nah am Metall
Die Geschichte der Computerprogrammierung war eine Geschichte immer ausgefeilterer Abstraktionen, mit denen der Programmierer Probleme lösen konnte, ohne sich zu viele Gedanken darüber zu machen, wie die zugrunde liegende Maschine tatsächlich funktioniert. Das macht Programme einfacher zu schreiben und vielleicht portabler. Für viele Programme sind jedoch der Zugriff auf die Hardware und die genaue Steuerung der Programmausführung wichtiger. Rust zielt darauf ab, Programmierer “näher an das Metall” zu bringen, mit mehr Kontrolle, aber Go abstrahiert die architektonischen Details, um Programmierer dem Problem näher zu bringen.
Beide Sprachen haben einen unterschiedlichen Gültigkeitsbereich. Golang glänzt zum Schreiben von Microservices und für typische “DevOps” -Aufgaben, ist aber keine Systemprogrammiersprache. Rust ist stärker für Aufgaben, bei denen Parallelität, Sicherheit und / oder Leistung wichtig sind. aber es hat eine steilere Lernkurve als Go.
—Matthias Endler
Muss schneller gehen
Ich habe an anderer Stelle geschrieben, dass Leistung für die meisten Programme weniger wichtig ist als Lesbarkeit. Aber wenn Leistung wichtig ist, ist es wirklich wichtig. Rust führt eine Reihe von Design-Kompromissen durch, um die bestmögliche Ausführungsgeschwindigkeit zu erreichen. Im Gegensatz dazu geht es Go mehr um Einfachheit und es ist bereit, etwas (Laufzeit-) Leistung dafür zu opfern. Aber die Build-Geschwindigkeit von Go ist unschlagbar, und das ist wichtig für große Codebasen.
Rust ist schneller als Go. In den obigen Benchmarks war Rost schneller und in einigen Fällen um eine Größenordnung schneller. Aber bevor Sie sich entscheiden, alles in Rust zu schreiben, bedenken Sie, dass Go in vielen dieser Benchmarks nicht so weit dahinter war und immer noch viel schneller ist als Java, C #, JavaScript, Python und so weiter.
Wenn Sie eine erstklassige Leistung benötigen, sind Sie bei der Auswahl einer dieser beiden Sprachen der Konkurrenz voraus. Wenn Sie einen Webdienst erstellen, der eine hohe Last bewältigt und sowohl vertikal als auch horizontal skaliert werden soll, ist jede Sprache perfekt für Sie geeignet.
-Andrew Lader
Korrektheit
Andererseits kann ein Programm beliebig schnell sein, wenn es nicht richtig funktionieren muss. Der meiste Code wird nicht langfristig geschrieben, aber es ist oft überraschend, wie lange einige Programme in der Produktion laufen können: in einigen Fällen viele Jahrzehnte. In diesen Situationen lohnt es sich, ein wenig mehr Zeit in die Entwicklung zu investieren, um sicherzustellen, dass das Programm korrekt und zuverlässig ist und in Zukunft nicht mehr viel Wartung benötigt.
Mein Tipp: Gehen Sie für den Code, der morgen ausgeliefert werden muss, und für den Code, der in den nächsten fünf Jahren unberührt bleiben muss.
-Grzegorz Nosek
Während sowohl Go als auch Rust eine gute Wahl für jedes ernsthafte Projekt sind, ist es eine gute Idee, sich so gut wie möglich über jede Sprache und ihre Eigenschaften zu informieren. Letztendlich ist es egal, was andere denken: Nur Sie können entscheiden, was für Sie und Ihr Team das Richtige ist.
Wenn Sie schneller entwickeln möchten, vielleicht weil Sie viele verschiedene Dienste zu schreiben haben, oder Sie haben ein großes Team von Entwicklern, dann ist Go Ihre Sprache der Wahl. Go bietet Ihnen Parallelität als erstklassiger Bürger und toleriert keinen unsicheren Speicherzugriff (Rust auch nicht), ohne Sie jedoch zu zwingen, jedes Detail zu verwalten. Go ist schnell und leistungsstark, vermeidet jedoch, den Entwickler zu behindern, und konzentriert sich stattdessen auf Einfachheit und Einheitlichkeit. Wenn auf der anderen Seite das Auswringen der letzten Unze Leistung eine Notwendigkeit ist, dann sollte Rost Ihre Wahl sein.
-Andrew Lader
Fazit
Ich hoffe, dieser Artikel hat Sie überzeugt, dass sowohl Rust als auch Go Ihre ernsthafte Überlegung verdienen. Wenn möglich, sollten Sie zumindest ein gewisses Maß an Erfahrung in beiden Sprachen anstreben, da sie für Sie in jeder technischen Karriere unglaublich nützlich sein werden oder auch wenn Sie gerne als Hobby programmieren. Wenn Sie nur Zeit haben, gut in das Erlernen einer Sprache zu investieren, treffen Sie Ihre endgültige Entscheidung erst, wenn Sie Go und Rust für eine Vielzahl verschiedener Arten von Programmen verwendet haben, groß und klein.
Und das Wissen über eine Programmiersprache ist wirklich nur ein kleiner Teil davon, ein erfolgreicher Softwareentwickler zu sein. Die mit Abstand wichtigsten Fähigkeiten, die Sie benötigen, sind Design, Engineering, Architektur, Kommunikation und Zusammenarbeit. Wenn Sie sich in diesen Bereichen auszeichnen, sind Sie ein großartiger Softwareentwickler, unabhängig von Ihrer Sprachwahl. Viel Spaß beim Lernen!
Vergleich von Rust- und Go-Code
Es gibt eine großartige Website namens programming-idioms.org welches hat einen “Spickzettel”, der zeigt, wie der Rust and Go-Code für über 200 gängige Programmieraufgaben aussieht:
- Go vs Rust idioms
Erste Schritte
Wenn Sie lernen möchten, mit Rust und Go zu programmieren, finden Sie hier einige Ressourcen, die Ihnen möglicherweise hilfreich sind.
Go
- Install Go
- Go Tutorials von Bitfield
- Aus Liebe zu Go
- Eine Tour durch Go
- Go am Beispiel
- Der Go-Spielplatz
- Awesome Go
Rust
- Install Rust
- Eine sanfte Einführung in Rust
- Die Programmiersprache Rust
- Rust books
- Rust By Example
- The Rust Playground
- One Hundred Rust Binaries
Acknowledgements
Ich bin nicht jung genug, um alles zu wissen, wie das Sprichwort sagt, daher bin ich einer Reihe angesehener Gopher und Rustaceans sehr dankbar wer hat sich die Zeit genommen, dieses Stück zu überprüfen und zu korrigieren, sowie einige wirklich nützliche Vorschläge zu machen. Mein besonderer Dank geht an Bill Kennedy, Grzegorz Nosek, Sam Rose, Jack Mott, Steve Klabnik, MN Mark, Ola Nordstrom, Levi Lovelock, Emile Pels, Sebastian Lauwers, Carl Lerche und alle anderen, die dazu beigetragen haben. Sie könnten den Eindruck bekommen, wenn Sie Online-Hot Takes lesen, dass die Rust and Go-Communities nicht miteinander auskommen. Nichts könnte weiter von der Wahrheit entfernt sein, nach meiner Erfahrung; wir hatten sehr zivilisierte und fruchtbare Diskussionen über den Artikelentwurf, und es hat einen großen Unterschied zum fertigen Produkt gemacht. Nochmals vielen Dank.
Leave a Reply