Mit dem Release der Programmiersprache Go 1.16, entwickelt von Google in Zusammenarbeit mit der Community, wird eine hybride Lösung vorgestellt, die die hohe Performance kompilierter Sprachen mit den Vorteilen von Skriptsprachen verbindet, wie die einfache Codeerstellung, rasche Entwicklung und Fehleranfälligkeit. Der Quellcode des Projekts wird unter der BSD-Lizenz verbreitet.
Die Syntax von Go basiert auf bekannten Elementen der Programmiersprache C mit einzelnen Entlehnungen aus Python. Die Sprache ist recht prägnant, der Code ist jedoch leicht lesbar und verständlich. Go-Code wird in separate, eigenständige ausführbare Binärdateien kompiliert, die nativ ohne Verwendung einer virtuellen Maschine ausgeführt werden (Profilierungs-, Debugging- und andere Fehlererkennungssysteme werden in Form von Runtime-Komponenten integriert), was eine Performance ermöglichen kann, die mit Programmen in C vergleichbar ist.
Das Projekt wird von Anfang an mit dem Fokus auf Multithreading und die effiziente Nutzung von Mehrkernsystemen entwickelt. Dabei werden auf Betreiber-Ebene implementierte Werkzeuge für die Organisation paralleler Berechnungen und die Interaktion zwischen gleichzeitig ausgeführten Methoden bereitgestellt. Die Sprache bietet zudem integrierte Schutzmechanismen gegen das Überschreiten der zulässigen Grenzen reservierter Speicherblöcke und ermöglicht die Nutzung eines Garbage Collectors.
Die wichtigsten Neuerungen, die mit dem Release Go 1.16 eingeführt wurden:
- Das embed-Paket wurde hinzugefügt, das Mittel zum Einbetten beliebiger Dateien und Verzeichnisse in ein Programm bereitstellt. Um die zu embedenden Dateien zur Kompilierungszeit anzugeben, steht eine neue Direktive "//go:embed" zur Verfügung. Beispielsweise führt die Angabe im Code-Kommentar "//go:embed test.txt" und die anschließende Deklaration der Variablen "var f embed.FS" dazu, dass die Datei test.txt eingebettet und über den Deskriptor "f" darauf zugegriffen werden kann. Auf ähnliche Weise können erforderliche Ressourcendateien oder einzelne Werte eines bestimmten Typs eingebettet werden. Um beispielsweise die String-Variable "s" aus der Datei version.txt zu erhalten, kann Folgendes angegeben werden: import _ "embed" //go:embed version.txt var s string print(s)
- Standardmäßig ist jetzt die Verwendung eines neuen Modulsystems erforderlich, das eine integrierte Unterstützung für Versionskontrolle bietet und die auf GOPATH basierenden Abhängigkeitsverwaltungssysteme ersetzt. Die Umgebungsvariable GO111MODULE ist standardmäßig auf "on" eingestellt, und der Modus für Module wird unabhängig von der Anwesenheit einer go.mod-Datei im Arbeits- oder übergeordneten Verzeichnis verwendet. Im neuen Modus ändern die Build-Befehle wie „go build“ und „go test“ den Inhalt von go.mod und go.sum nicht, während der Befehl „go install“ Argumente mit Versionsangabe verarbeitet (z. B. „go install example.com/cmd@v1.0.0“). Um das alte Verhalten wiederherzustellen, sollte GO111MODULE auf "auto" gesetzt werden. Es wird vermerkt, dass bereits 96 % der Entwickler auf das neue Modulsystem umgestiegen sind.
- Der Linker wurde optimiert. Für große Projekte erfolgt das Linken jetzt 20-25 % schneller und benötigt 5-15 % weniger Speicher.
- Der Compiler unterstützt nun das Inline-Entfalten von Funktionen mit verkürzten Schleifen-Definitionen „for“, Methodenwerten (method values) und Konstrukten ‘type switch’.
- Die Unterstützung von Apple-Systemen mit dem neuen ARM-Apple M1-Chip wurde hinzugefügt. Die Ports netbsd/arm64 und openbsd/mips64 wurden implementiert, mit Unterstützung für NetBSD auf 64-Bit ARM und OpenBSD auf MIPS64-Systemen. Im Port linux/riscv64 wurde die Unterstützung für cgo und den Modus „-buildmode=pie“ hinzugefügt.
- Die Unterstützung für den x87-Kommode (GO386=387) wurde eingestellt. Die Unterstützung für Prozessoren ohne SSE2-Befehle ist nun über den Softwaremodus „GO386=softfloat“ verfügbar.
Ein weiterer Punkt ist der Beginn der Beta-Testphase der Programmiersprache Dart 2.12, in der der Modus der sicheren Verwendung des Wertes „Null“ (null safety) stabilisiert wurde. Dieser Modus soll Abstürze verhindern, die durch den Zugriff auf nicht definierte Variablen verursacht werden können, deren Wert auf „Null“ gesetzt ist. Er gewährleistet, dass Variablen keine undefinierten Werte haben, es sei denn, ihnen wird explizit der Wert null zugewiesen. In diesem Modus werden die Typen der Variablen streng berücksichtigt, was dem Compiler zusätzliche Optimierungen ermöglicht. Der Typenabgleich erfolgt zur Compile-Zeit; zum Beispiel wird bei dem Versuch, den Wert „Null“ einer Variablen zuzuweisen, die einen Typ hat, der keinen undefinierten Zustand annimmt, wie „int“, ein Fehler ausgegeben.
Quelle: opennet.ru
