Auf in die Welt der Module

Go 1.11 veröffentlicht: Go Modules und WebAssembly Support

Frank Müller

© Reneé French (CC BY 3.0 DE) ©SuS Media

Wie erwartet hat Google im gewohnten Takt die neueste Version der Programmiersprache Go vorgestellt. Diese dynamisch in ihrer Beliebtheit zunehmende Sprache hat damit inzwischen Version 1.11 erreicht. Die gleichbleibende Hauptversion „1“ zeigt, dass sich der Sprachkern nicht verändert hat. Der Nutzer kann sich hier also ruhigen Gewissens darauf verlassen, mögliche Änderungen einer Version 2 werden unterdessen weiterhin rege diskutiert.

Die hohe Nebenversionsnummer verdeutlicht hingegen, wie sehr sich die Infrastruktur dieser Sprache weiterentwickelt. Die Sprache ist mit der Zeit robuster geworden und deckt mehr Plattformen ab, außerdem gibt es ständig umfassendere Tools und weitere Bibliotheken, das ist man bereits aus den vergangenen Jahren gewohnt. Zwei Erweiterungen sind allerdings so besonders, dass ihre Tragweite durch den kleinen Sprung von Go 1.10 auf Go 1.11 nicht richtig abgebildet wird. Doch Google bleibt konsequent, nach der 10 kommt nun einmal die 11.

Es ist ja bekannt, dass die Sprache bereits heute viele Plattformen unterstützt. Sowohl aus Sicht der Betriebssysteme als auch bezüglich der Prozessoren. Hier ergibt sich eine Reihe kleinerer Änderungen. So wird macOS nur mehr ab der Version 10.10 unterstützt, Windows ab Version 7 und OpenBSD ab 6.2. Inzwischen ist auch OpenBSD 6.4 eine der abgedeckten Plattformen, die jedoch keinen Support durch ältere Go-Versionen erhalten wird. Weitere Änderungen betreffen den PowerPC, MIPS oder ARM und Betriebssysteme wie NetBSD.

Go 1.11: WebAssembly Support & Go Modules

Doch die wahren Neuerungen in Go 1.11 sind wie gesagt andere. Dazu gehört einerseits die, wenn auch noch experimentelle, Unterstützung von WebAssembly. Sie erlaubt die Ausführung von Go-Programmen im Web-Browser als eine schnelle Ergänzung zu JavaScript. Die Motivation hinter WebAssembly ist die Möglichkeit, binäre Programme schneller als komplexe JavaScript-Programme in einem Browser laden und auch dort mit höherer Performanz ausführen zu können. In Zeiten des Browsers als universelles Frontend immer komplexerer Anwendungen war dies schon lange überfällig. Kompilierte Go-Anwendungen enthalten die komplette Laufzeitumgebung, das Scheduling der Goroutinen, das Garbage Collecting und alles, was als Basis für Go-Anwendungen benötigt wird. Dies ergibt eine Minimalgröße von etwa 2 MB beziehungsweise 500 KB im komprimierten Zustand. Über das neue Package syscall/js können die Programme mit JavaScript interagieren. Damit ergibt sich für Go eine Vielzahl neuer Anwendungsmöglichkeiten, ebenso wie auch ein konsequenterer Fullstack-Einsatz der Sprache.

Der zweite große Block ist die Einführung der Modules basierend auf dem vgo-Konzept von Russ Cox. Es gilt als noch nicht ausgereift, soll aber spätestens mit der Go 1.12 seinen endgültigen Weg in das Toolset der Sprache finden. Die aktuelle Version dient dazu, hierfür die notwendigen Erfahrungen und das Feedback der Anwender zu sammeln. Alle Änderungen in Go 1.12 sollen dann aber kompatibel sein. Ziele sind ein zuverlässigeres und reproduzierbareres Build – auch unabhängig vom GOPATH. Notwendig ist, dass Versionen entsprechend in den Repositorys getaggt und/oder als Pfadbestandteil gespeichert werden sowie eine Datei go.mod existiert, die Informationen zum aktuellen Modul und den Abhängigkeiten enthält. Die Speicherung in einer speziellen Verzeichnisstruktur erlaubt so die Arbeit mit mehreren unterschiedlichen Versionen eines Moduls gleichzeitig. Dies war mit dem bisherigen einfachen go get nicht möglich. Ein Seiteneffekt ist, dass die Version 1.11 die letze Version mit der Einstellung GOCACHE=off. Hintergrund ist die Abschaffung von $GOPATH/pkg im Rahmen der Module. Somit kann dieses Setting bereits jetzt nur noch eingeschränkt genutzt werden.

Gopher ante portas: Go hält Einzug auf JAXenter!

Wenige (relativ) neue Programmiersprachen erfreuen sich derzeit einer so großen Belibtheit wie Go. Googles Alternative für „C“ ist immer häufiger Zentrum interessanter Anwendungen und mittlerweile im Mainstream angekommen. Grund genug, sich ein wenig eingehender mit der Sprache zu befassen. Folgende Artikel, Kolumnen und Infografiken sind Teil unserer aktuellen Go-Aktion auf JAXenter:

Happy Gophing!

Abrundung

Wie immer hat Google einiges getan, um Build-Zeiten zu verkürzen und Laufzeiten zu beschleunigen. Ebenso erzeugt der Compiler nun bessere Debugging-Informationen auch bei optimierten Programmen. Experimentell wird auch der Aufruf von Go-Funktionen innerhalb eines Debuggers unterstützt, allerdings bisher nur in Delve. Auch das Tracing von Anwendungen und die Visualisierung sind leistungsfähiger geworden. Zur Steigerung der Qualität ist nun auch der automatische Aufruf von go vet vor dem Aufruf von go test strenger. Fehlschlagende Typenprüfungen werden jetzt auch als fatale Fehler und nicht mehr nur als Warnungen angezeigt.

Wie mit jedem Release wurde auch die Runtime leistungsfähiger. So hat der Heap in Go 1.11 keine Grenze von 512 GB mehr. Damit werden einige der bisherigen seltenen Fehler bei Kompilierungen mit -race vermieden. Ebenso neu ist die Nutzung von libSystem.so unter macOS und iOS für eine höhere Systemkompatibilität. Individuelle Konstrukte wurden ebenfalls optimiert, zum Beispiel das Löschen von Maps in Schleifen. Dazu kommen Bounds Checking und Verzweigungen, Erweiterungen für Stack Traces über Goroutine-Grenzen hinweg und Profiling.

Neben allen Tools und der Laufzeitumgebung werden natürlich auch mit jedem Release die Bibliotheken verbessert oder erweitert. So sind die Crypto Packages nun stellenweise noch zufälliger und vollständiger, Encoding und Decoding wurden konsistenter. Eine Situation, in der html/template bisher <nil> ausgegeben hat, wird nun wie bei nicht typisierten Nil-Werten nichts mehr ausgegeben. Das net Package erlaubt nun das Setzen von Socket-Optionen vor dem Annehmen und Erzeugen von Verbindungen. Gleichzeitig wurden Fehler auf unterschiedlichen Plattformen behoben. Auch net/http und net/http/httputil bieten mehr Optionen für robuste Anwendungen, zum Beispiel die Limitierung der Anzahl an Verbindungen. Dazu einen Satz weitere Abrundungen, welche die Bedeutung der Netzwerkpakete zeigen. Ebenso wichtig wie das Netz ist der Umgang mit dem Betriebssystem. Dies spiegelt sich in den Erweiterungen der Packages os, os/signal, os/user und auch io/ioutil wieder. Viele weitere kleine Änderungen runden Googles Aufwände ab.

Fazit

Wie es das sanfte und stetige Inkrement der Nebenversionsnummer andeutet, reifen Toolset, Laufzeitumgebung und Bibliotheken der Sprache Google Go kontinuierlich – so auch wieder in Go 1.11. Die Benutzer erhalten ein stabileres und umfangreicheres Werkzeug, ohne mit der Vergangenheit zu brechen. Jedoch wird der Einzug der Module bei vielen Entwicklern von Bibliotheken, gerade in der Open-Source-Szene, noch zu Überarbeitungen ihres Angebots führen. Nicht ohne Aufwand, aber für die Zukunft wichtig.

Verwandte Themen:

Geschrieben von
Frank Müller
Frank Müller
Der Oldenburger Frank Müller ist seit über dreißig Jahren in der IT zu Hause und im Netz vielfach als @themue anzutreffen. Das Interesse an Googles Sprache Go begann 2009 und führte inzwischen zu einem Buch sowie mehreren Artikeln und Vorträgen zum Thema.
Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: