Programmiersprache: Go 1.14 setzt auf mehr Effizienz

Die Neuerungen der Programmiersprache Go sitzen vor allem unter der Haube und zielen auf performanteren Code und mehr Einblick beim Kompilieren.

In Pocket speichern vorlesen Druckansicht 11 Kommentare lesen
Programmiersprache: Go 1.14 setzt auf Effizienz
Lesezeit: 4 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Google hat Version 1.14 der Programmiersprache Go veröffentlicht. Die meisten Neuerungen betreffen das Laufzeitverhalten der Programme und den Compiler. Sie zielen vor allem auf eine verbesserte Performance beim Ausführen von Code und eine erweiterte Analysefunktionen beim Kompilieren. Die Sprache selbst bringt lediglich eine Neuerung mit, die den Umgang mit Interfaces vereinfacht.

Das Go-Team hat zudem den in Version 1.11 der Programmiersprache eingeführten Einsatz von Modulen nun als reif für den produktiven Einsatz befunden und empfiehlt Entwicklern, ihre Projekte auf Go-Module zu migrieren.

Bisher durften eingebettete Interfaces keine Methodennamen und Signaturen verwenden, die bereits ein anderes eingebettetes Interface verwendet hat. Nun dürfen Entwickler die Namen erneut verwenden, was vor allem bei rautenförmigen Embedding-Graphen helfen soll. Nach wie vor ist es jedoch untersagt, eine explizit zuvor deklarierte Methode wiederzuverwenden.

Somit ist folgendes Konstrukt neuerdings erlaubt:

type E interface { m() }
type I interface { E; E }

Folgendes ist hingegen weiterhin verboten, da m() doppelt explizit deklariert ist:

type I interface {
m()
m()
}

Einige Verbesserungen betreffen das Laufzeitverhalten von Go-Code. Unter anderem soll der verzögerte Aufruf von Funktion über defer deutlich weniger Overhead verursachen und nahezu dieselbe Performance wie der direkte Aufruf aufweisen. Eine mit defer aufgerufene Funktion wird erst nach der Rückkehr aus der Funktion ausgeführt, die den Aufruf enthält.

Der Page Allocator von Go arbeitet nun effizienter und soll bei zahlreichen Threads, die nahe an dem durch GOMAXPROCS definierten Limit liegen, deutlich weniger Lock-Konflikte verursachen. Auch die von Funktionen wie time.After, time.Tick und net.Conn.SetDeadline verwendeten internen Timer arbeiten wohl effizienter.

Goroutinen ohne Methodenaufruf können bisher potenziell zu Deadlocks führen, da die sogenannte Preemption, bei der der Go-Scheduler die Ausführung der Goroutinen umschaltet, nur beim Aufruf von Funktionen zuschlägt. Im aktuellen Release der Programmiersprache gelten Gorutinen nun als "Asynchronously Preemptible", um den Umschaltprozess auch ohne Funktionsaufruf zu erlauben.

Das in Go 1.14 eingeführte Compiler-Flag -d=checkptr prüft den Code auf das Einhalten der Regeln zum Umgang mit unsafe.Pointer. Das Flag ist auf allen Plattformen außer Windows standardmäßig gesetzt. Für Microsofts Betriebssystem rät das Go-Team explizit davon ab, da es Fehlalarme in der Standard-Library auslösen kann.

Ebenfalls neu ist, dass der Compiler nun beim Verwenden des -json-Flags maschinenlesbare Logs der Optimierungen wie Inlining, Escape Analysis und Bounds-checking Elimination erzeugt.

Google hatte Go 2009 erstmals der Öffentlichkeit vorgestellt und die Programmiersprache als Alternative zu C positioniert. 2015 befreite sich das Projekt von den letzten C-Überbleibseln im Code und besitzt seitdem eine komplett in Go geschriebene Toolchain und Laufzeitumgebung. Die Programmiersprache unterstützt Nebenläufigkeit und entstand vor allem mit Blick auf verteilte Cloud- und Serveranwendungen. Zu den Vorzeigeprojekten gehören Kubernetes, Istio und Docker.

Weitere Details zu Go 1.14 lassen sich dem Go-Blog entnehmen. Die Version ist die letzte, die macOS 10.11 El Capitan sowie 32-bit Binaries auf macOS und vermutlich auf iOS unterstützt. Der Native Client ist wie bei der Veröffentlichung von Go 1.13 angekündigt keine Zielplattform mehr.

Siehe dazu auf heise Developer:

(rme)