Go laut Tiobe-Index die Sprache mit stärkstem Zulauf

Ist Golang das neue Java?
Kommentare

Golang ist neu, hip und erfrischend. Es versprüht Charme, ohne selbst schön sein zu müssen und hat dadurch einen ganz besonderen Reiz. Hat Go damit das Zeug dazu, sich ähnlich stark zu etablieren wie es Java über die letzten 20 Jahre geschafft hat?

Golang (aka ‚Go‘) ist eine verhältnismäßig junge Programmiersprache, die aber schon sehr stabil und ausgereift ist. Go kann bereits ohne Bedenken in großen Projekten eingesetzt werden und ist laut dem Tiobe-Index derzeit sogar die Sprache mit dem stärksten Zulauf. Keine andere Sprache konnte in jüngster Zeit so stark zulegen und ihren Marktanteil um fast zwei Prozent pro Jahr vergrößern (Stand April 2017).

Die Entwicklung der Sprache begann 2007 durch Google und wird nach wie vor maßgeblich von dort betrieben. Allerdings wird anhand der Beiträge zur aktuellen Version 1.8 deutlich, dass nicht nur Google, sondern auch eine breite Community Golang weiter etablieren will.

Wie lässt sich Go klassifizieren? Go ist statisch kompiliert, streng typisiert und extrem performant. Die Runtime verfügt über einen guten Garbage-Collector und eine Laufzeit-Prüfung von Speicherzugriffen. Da ein moderner Ansatz der Objektorientierung geboten, aber nicht erzwungen wird, können Entwickler relativ frei entscheiden, welches Paradigma sie wo einsetzen wollen.

Golang: direkt, einfach und trotzdem komfortabel

Schnell wird klar: Die Erfinder von Golang hatten die Möglichkeit, die besten Charaktereigenschaften von einer Vielzahl moderner Sprachen zu übernehmen. Sie haben allerdings nicht einfach alle mächtigen Features in Go hineingedrückt. Ganz im Gegenteil: Go überzeugt durch die Kombination von netten Features und gleichzeitig konsequent reduzierter Komplexität.

Abb. 1: Golangs Eigenschaften im Vergleich zu anderen Programmiersprachen

Verglichen mit anderen Sprachen lässt sich Golang grob zwischen C, Python und Java einordnen (Abb. 1). Dadurch, dass es statisch kompiliert ist, hat es ein ähnliches Start- und Laufzeit-Verhalten wie C-Programme. Auch die Portabilität auf andere Plattformen ist ähnlich hoch, wenn auch mit Golang deutlich einfacher gelöst. Einige der reduzierten und schlauen Syntax-Konstrukte erinnern an die Finessen von Python. Java-Entwickler hingegen freuen sich darüber, eine Laufzeitumgebung vorzufinden, die sich genauso sicher anfühlt wie die JVM, jedoch ohne die Trägheit, die Java dabei mit sich bringt.

Alles was auf dem Server läuft

Der Einsatzbereich von Go ist zurzeit recht klar definiert und kann grob mit dem Satz „alles was auf dem Server läuft“ umrissen werden. Dies liegt jedoch weniger an der Sprache selbst, als vielmehr an dem Ökosystem und den vorhandenen Librarys und Projekten. Dieser Trend wurde nicht zuletzt durch Docker und das Container-Ökosystem geprägt, das komplett auf Golang setzt. Hinzu kommt: Docker hält Einzug in die Standardsoftware der Linux-Distributionen. Außerdem gibt es mit GopherJS einen erstaunlich guten Transpiler für die Übersetzung von Go nach JavaScript, sowie einige Ansätze Golangprogrammen eine UI zu spendieren. Genutzt wird von alldem jedoch noch sehr wenig.

Skalierbar, produktiv, lesbar und idiomatisch: Ein Charakter, der motiviert

Das Besondere und Schöne an Golang liegt in seiner Einfachheit und Effizienz. In Zeiten von immer komplexer werdenden Problemen in der Softwareentwicklung ist es umso wichtiger, diese Probleme mit Werkzeugen lösen zu können, die einfach zu bedienen sind. Golang ist nicht so komplex wie viele andere Sprachen. Vielmehr ist es einfach, darin einen Code zu programmieren, der darauf ausgelegt ist, auch später wieder leicht gelesen und verstanden zu werden. Guter Go-Code ist nicht immer schön und eloquent. Er weist sich nicht dadurch aus, dass Probleme auf magische Weise gelöst sind und alles besonders elegant geschrieben ist, sondern dadurch, dass die Software ein Problem korrekt und effizient löst und dabei lesbar und nachvollziehbar bleibt. Neben technisch effizienten Programmen kann auch die organisatorische Skalierbarkeit verbessert werden. Der Grund: Es ist einfacher die entstandene Software in Teams mit heterogenem Erfahrungsstand weiterzuentwickeln. Dies ist nicht zuletzt der einheitlichen Denkweise zu verdanken, die die Go-Community prägt.

Obwohl Golang als Sprache relativ viele Programmierstile unterstützt, ist es sehr idiomatisch. Das heißt, Golang gibt vor, wie eine Lösung in der Sprache aussehen soll. Ebenso idiomatisch war anfangs Java. Bei JavaScript hingegen ist genau das Gegenteil der Fall. Aufgrund der Tatsache, dass Go klar definiert, wie Lösungen aussehen sollten, sorgt die idiomatische Denkweise dafür, dass mehrere Entwickler das gleiche Problem auf eine sehr ähnliche Art und Weise lösen und Programme sehr einheitlich aussehen. Ein Beispiel hierfür ist die Formatierung, die bei Golang direkt mit dem Standard-Tooling ausgeliefert wird. Dadurch ist festgelegt, wie ein Golang-Code auszusehen hat und wie er formatiert wird. Diskussionen darüber, wie eingerückt und geklammert wird bzw. wie die IDE zu konfigurieren ist, gibt es nicht. Weitere Beispiele sind die Fehlerbehandlung, die Vorgaben zur Dokumentation, der Ident Error Flow, die Defer-Statements und die Data-Driven Tests. Diese idiomatische Denkweise hat dazu geführt, dass nicht bloß die Sprache und Standardbibliothek von Go selbst eine hohe Qualität aufweist, sondern dass auch ein Ökosystem mit sehr konsistentem Erscheinungsbild und hoher Qualität entstehen konnte.

Hohe Performance

Der Hauptgrund dafür, dass viele Entwickler von Golang begeistert sind, ist die hohe Performance der Sprache (Abb.2). Sowohl in der Start- als auch in Ausführungsgeschwindigkeit spielt Go ganz vorne mit. Rein technisch ist die Ausführungsgeschwindigkeit von Go und Java grob vergleichbar. Da der Java-Compiler über die vielen Jahre stark optimiert wurde, liefert auch er einen sehr optimierten Code.

Abb. 2: Performance verschiedener Sprachen im Vergleich

Um das zu belegen, haben wir zum Vergleich eine einfache Hello-World-HTTP-Anwendung aufgebaut. Interessant zu sehen ist im Benchmarkt: Der Java-basierte Undertow Container ist sogar etwas schneller als die schnellste Golang-http-Implementierung. In der Praxis scheinen die meisten Go-Anwendungen dennoch deutlich schneller zu sein, als typische Java-Services.

Der größte Unterschied zwischen Go- und Java-Anwendungen entsteht nicht direkt durch die Plattform, sondern durch die Denk- und Herangehensweise. Im Java-Bereich binden Entwickler üblicherweise eine Vielzahl von Abhängigkeiten ein und bauen zahlreiche Abstraktionsschichten auf. Bei Golang hingegen sind eher minimalistische Anwendungen üblich, die sich der Standardbibliothek bedienen und auf das Wesentliche konzentrieren.

Während die meisten Go-Services direkt auf der HTTP-Implementierung der Standardbibliothek aufsetzen, hat im Java-Bereich noch immer das Spring-Framework die größte Verbreitung.

Eine minimale Spring-Boot-Applikation in Java benötigt aktuell rund drei bis vier Sekunden, bis sie HTTP-Anfragen beantworten kann. Typische Golang-Services starten hingegen innerhalb weniger Millisekunden und sind in der Ausführungsgeschwindigkeit gerne fünfmal so schnell.

Der Vergleich der Go-Standardbibliothek mit einem umfangreichen Framework wie Spring hinkt auf den ersten Blick, denn er ähnelt dem Vergleich eines Elefanten mit einer Gazelle. Immerhin ist Spring ja ein Framework. Aber genau das gehört bei Golang zum Konzept und macht den großen Unterschied aus.

Um Golang bewerten zu können, gilt es, nicht nur den allgemeinen Charakter, sondern auch einige Highlights zu betrachten.

Die Syntax von Golang: reduziert und sparsam

Obwohl die Golang-Syntax an die klassische C-Syntax angelehnt ist, beinhaltet sie viele kleine Verbesserungen und ist deutlich reduziert. Beispielsweise werden keine zwingend benötigten runden Klammern verwendet und das abschließende Semikolon ist optional einsetzbar. Sichtbarkeiten von Bezeichnern (Package-weit oder öffentlich) werden über die Schreibweise (groß oder klein) umgesetzt. Das spezielle Package ‚main‘ mit der Funktion ‚main()‘ dient als Einstiegspunkt des Programms, wie in Abbildung 3 zu sehen ist:

Abb. 3: Package “main” als Einstiegspunkt

Über die Basissyntax hinaus sind in dem Beispiel bereits einige typische Elemente von Go zu erkennen:

  • Typisierung: Golang ist streng typisiert. Trotzdem fällt die aufwändige Syntax zur Deklaration von Variablen –wie sie in anderen Sprachen üblich ist – weg. Dies geschieht bei Go über den Zuweisungsoperator“:=“. Doppelpunkt und Gleichzeichen zeigen hier Deklaration und Zuweisung in einem an. Der Typ der neuen Variablen wird dabei automatisch über Inferenz auf dem zugewiesenen Argument abgeleitet.
  • Mehrere Rückgabewerte und Fehlerbehandlung: Funktionen können mehrere Werte zurückgeben. Die Konvention ist es, als letztes einen Wert vom Typ ‚error‘ zurückzugeben. Wenn dieser Wert gesetzt ist, liegt ein Fehler vor. Es gibt zwar auch ein zu Exceptions vergleichbares Konstrukt (panic/recover), es wird aber nicht für den regulären Kontrollfluss, sondern nur in echten Ausnahmefällen verwendet.
  • Überarbeitete Kontrollstrukturen: Sowohl das ‚if‘- als auch der ‚for‘-loop sind in Golang leicht überarbeitet und etwas flexibler als in anderen Sprachen.

Objektorientierung in Go?

Go bietet einen objektorientierten Programmierstil, der sich jedoch von klassischen OO-Sprachen unterscheidet. In Golang wird Objektorientierung dadurch unterstützt, dass Methoden auf beliebigen Typen definiert werden können. Auf explizite Konstruktoren und eine Typhierarchie mit Subclassing wurde bewusst verzichtet. Dafür gibt es jedoch Interfaces nach dem Ducktyping-Prinzip und ein Embedding bzw. eine Delegation von Typen. Im engeren Sinne ist Go damit eigentlich nicht einmal objektorientiert. Die Prinzipien sind aber ähnlich mächtig wie die der klassischen OO-Paradigmen und vermeiden die typischen Probleme, die mit Vererbungshierarchien und der starken Koppelung klassischer Interfaces einhergehen.

Fazit

Mich persönlich hat Go überzeugt! Es ist eine Sprache für die Entwicklerinnen und Entwickler, die nicht ständig über ihr Arbeitswerkzeug nachdenken wollen, sondern die sich auf die eigentliche Lösung konzentrieren. Go ermöglicht das Schreiben von Software, die produktiv eingesetzt werden kann und auch von Kollegen mit weniger Berufserfahrung schnell verstanden wird. Auch wenn ich für Plattformen wie Java und NodeJS weiterhin eine deutliche Existenzberechtigung sehe, glaube ich, dass sich Golang in den nächsten Jahren einen festen Platz in der ersten Reihe sichern wird.

Literaturtipps: Wer sich tiefer als im obigen Beispiel mit Golang beschäftigen möchte, dem seien „A Tour of Go“ und „Effective Go“ als schnelle Einstiege empfohlen. Dort sind auch die weiterführenden Konzepte wie beispielsweise Nebenläufigkeit mit Go-Routinen und -Channel erklärt.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -