Rust versus Go.

Rust versus Go

Intro

Go und Rust sind einige relativ neue Sprachen nicht so weit verbreitete Sprachen, die zu nativem Code für eine Plattform kompiliert werden. Das unterscheidet sie von Sprachen wie Java / Kotlin, die auf einer JVM laufen und eine Zwischenschicht namens Bytecode verwenden, die dann auf der Host-Plattform ausgeführt wird.

Ich bin ein großer Fan der JVM. Sie ist schnell und hat ein stabiles und reichhaltiges Ökosystem. Außerdem sind Java, Kotlin und Scala wirklich coole Sprachen. Aber die JVM verlangsamt den initialen Anwendungsstart. Warum? Weil zuerst die JVM starten muss, dann die Anwendung. Die JVM-Startverzögerung mag für Sie kein Problem sein - aber manchmal - besonders wenn Sie Ihre Web-Container häufig starten/stoppen (Lambdas, Kubernetes) - wird es zum Problem, weil die erste Anfrage an den neu gestarteten Container einfach langsam ist.

Bei Go und Rust ist es anders - sie kompilieren zu nativem Code und starten sofort.

Leider hatte ich noch nicht die Zeit, Go oder Rust in einem größeren Projekt einzusetzen - mein Wissen stammt nur aus einigen Experimenten mit den Sprachen. Also nehmen Sie das mit Vorsicht - und wenn Sie es besser wissen - lassen Sie es mich wissen!

Go

Pro

  • Nicht viele Sprachfeatures - einfach zu lernen. Ja - und es hat endlich Generics bekommen.
  • Keine Semikolons (daran habe ich mich gewöhnt).
  • Eingebauter Mechanismus zur Verteilung von Last auf mehrere Kerne via Goroutines / Gochannels.
  • Ausführbare Dateien sind eigenständig und sofort lauffähig - die Kompilierung für andere Plattformen ist unkompliziert.
  • Formatter ist eingebaut. Alle Go-Programme sehen ungefähr gleich aus (Tabs haben gewonnen).
  • Die Kompilierung ist sehr schnell.
  • Die Standardbibliothek hat eine riesige Menge cooler Dinge sofort verfügbar. HTTP-Server, HTML-Templating, JSON-Parsing - alles ist ohne Abhängigkeiten vorhanden. Das gefällt mir wirklich!
  • Erstklassige Unterstützung für Tests.
  • Sehr einfache Art, Speicher zu allokieren und freizugeben - das wird von der Sprache und einem Garbage Collector erledigt.

Contra

  • Go ist eine prozedurale Sprache. Wenn Sie einen funktionalen Ansatz mit Immutability mögen, ist Go möglicherweise nicht das Richtige für Sie. Mutability wird überall praktiziert. Und das ist kein Problem, da z.B. Goroutines es einfacher machen, Dinge parallel auszuführen, wenn man veränderbare Variablen verwendet.
  • Obwohl Gochannels cool und ein Sprachfeature sind - sie verhindern nicht alle Fehler - und Sie könnten sich bei der Verwendung in den Fuß schießen.
  • Ich habe mich an einige Sprachfeatures wie erweitertes Pattern Matching gewöhnt - das kann in Go irgendwie simuliert werden, aber es sieht nicht schön aus.
  • Die Fehlerbehandlung ist etwas umständlich, aber im Allgemeinen sieht sie nicht schlechter oder besser aus als traditionelle try-catch-Konzepte.
  • Der Garbage Collector könnte bei bestimmten (seltenen) Anwendungslasten ein Problem sein.

Ein großartiger Weg, Go zu lernen, ist quiis Kurs Test driven development with Go. Ich denke wirklich, dass TDD eine hervorragende Methode ist, neue Sprachen zu lernen.

Rust

Pro

  • Potenziell so schnell wie C (oder schneller). Hat keinen Garbage Collector. Nutzt das Konzept von Ownership und Borrowing. Diese Konzepte sind zunächst fremdartig, erlauben es der Sprache aber, “automatisch” Speicher vom Heap zu allokieren und freizugeben. Clever.
  • Optional-Typ eingebaut.
  • Pattern Matching eingebaut.
  • Immutability ist ein erstklassiges Konzept.
  • Sehr hilfreiche Compiler-Meldungen.
  • Sehr cooles Feature: Dokumentation mit Code-Beispielen wird als Test behandelt und automatisch kompiliert und getestet, um sicherzustellen, dass sie aktuell bleibt.
  • Erstklassige Unterstützung für Tests.

Contra

  • Nun ja. Ownership, Borrowing und Referencing ist ein neues Konzept, an das man sich gewöhnen muss. Es bedeutet im Grunde: Verwenden Sie eine Variable nur einmal. Man kann das umgehen, aber das zu lernen ist der Schlüssel zum Verständnis von Rust - und keine andere Sprache hat dieses Konzept.
  • Tests leben normalerweise in denselben Dateien wie der Code. Daran muss ich mich ehrlich gesagt gewöhnen. Man kann separate Dateien verwenden, aber die Rust-Community scheint diesen Ansatz zu befürworten.
  • Besonders im Vergleich zu Go ist Rust wesentlich komplexer. Sie müssen viel lernen, um zu starten.
  • Es hat Semikolons. Im Jahr 2022 (ok, das ist eine Kleinigkeit).
  • Cargo und das Ökosystem sind komplexer.
  • Formatierung nicht standardmäßig aktiviert.
  • Der Compiler scheint langsamer zu sein (selbst im Draft-Modus) als der von Go.

Zusammenfassung

Der größte Unterschied zwischen den Sprachen ist für mich, wie Speicher auf dem Heap allokiert und freigegeben wird. Go verwendet einen Garbage Collector - Rust das Konzept von Ownership / Borrowing.

Wenn Sie wirklich an Hochleistungsanwendungen arbeiten möchten - dann könnte Rust für einige Grenzfälle “schneller” sein. Discord wechselte von Go zu Rust, weil die Garbage Collection ihre Performance ruinierte. Und Rusts “Einschränkungen” könnten zu standardmäßig schnellerem Code führen.

Aber nehmen Sie das nicht auf die leichte Schulter - beide Sprachen werden selbst für die anspruchsvollsten Workloads sehr empfohlen.

Ich mag auch Gos Ansatz, eine einfache, aber voll ausgestattete Sprache zu sein. Alles, was man braucht, ist eingebaut. Und Go ist viel einfacher zu lernen als Rust. Ein Faktor, der dazu beiträgt, ist der Garbage Collector - er macht die Allokation/Deallokation für den Benutzer zum Kinderspiel.

Ein letzter Blick auf die Stack Overflow Developer Survey zeigt, dass Go und Rust ungefähr auf dem gleichen Level liegen. Go wird etwas häufiger verwendet als Rust. Aber beide Sprachen werden weit weniger verwendet als “Konkurrenten” wie C / C++ oder Java.

Wenn ich mich zwischen diesen beiden entscheiden müsste, wäre ich - zunächst einmal - traurig, weil beide Sprachen großartig sind. Dann würde ich Rust wählen, weil ich finde, dass das Konzept der Ownership zu mächtig ist, um es nicht zu nutzen, und (abgesehen von den Semikolons) die Sprache meiner aktuellen Art, Code zu schreiben, viel mehr ähnelt (Immutability, Optionals usw.). Aber Go ist immer noch richtig cool. Es ist eine schwere Wahl.

Mehr: