Veröffentlichung der Programmiersprache Go 1.19

Vorgestellt wird die Veröffentlichung der Programmiersprache Go 1.19, die von Google unter Beteiligung der Community als Hybridlösung entwickelt wird, die die hohe Leistung kompilierter Sprachen mit Vorteilen von Skriptsprachen wie der einfachen Codeschreibbarkeit kombiniert , Entwicklungsgeschwindigkeit und Fehlerschutz. Der Projektcode wird unter der BSD-Lizenz verteilt.

Die Go-Syntax basiert auf bekannten Elementen der C-Sprache mit einigen Anleihen aus Python. Die Sprache ist recht prägnant, der Code jedoch leicht lesbar und verständlich. Go-Code wird in separate ausführbare Binärdateien kompiliert, die nativ ohne Verwendung einer virtuellen Maschine ausgeführt werden (Profiling-Module, Debugging-Module und andere Subsysteme zur Problemerkennung zur Laufzeit sind als Laufzeitkomponenten integriert). Dadurch wird eine mit C-Programmen vergleichbare Leistung erreicht.

Das Projekt wird zunächst mit Blick auf Multithread-Programmierung und effizienten Betrieb auf Multi-Core-Systemen entwickelt, einschließlich der Bereitstellung von Mitteln auf Bedienerebene zur Organisation paralleler Berechnungen und Interaktion zwischen parallel ausgeführten Methoden. Die Sprache bietet außerdem einen integrierten Schutz vor überbelegten Speicherblöcken und bietet die Möglichkeit, einen Garbage Collector zu verwenden.

Zu den Änderungen in der neuen Version gehören:

  • Die in der vorherigen Version hinzugefügte Unterstützung für generische Funktionen und Typen (Generics) wurde verbessert. Dadurch können Entwickler Funktionen definieren und verwenden, die für die gleichzeitige Verwendung mehrerer Typen ausgelegt sind. Die Leistung einiger Programme, die Generics verwenden, wurde optimiert und um 20 % gesteigert.
  • Dokumentationskommentare wurden aktualisiert, um Links, Listen und eine einfachere Syntax zur Header-Definition zu unterstützen. Das Dienstprogramm gofmt bietet eine Formatierung, die die erweiterten Funktionen von Kommentaren mit API-Dokumentation berücksichtigt.
  • Das Speichermodell für Go wurde überarbeitet, um mit den Speichermodellen von C, C++, Java, JavaScript, Rust und Swift übereinzustimmen, die keine sequentiell konsistenten atomaren Werte unterstützen. Um die Verwendung atomarer Werte zu vereinfachen, wurden neue Typen wie atomic.Int64 und atomic.Pointer[T] im Paket sync/atomic eingeführt. Die Änderung des Speichermodells hat keinen Einfluss auf die Kompatibilität mit bereits geschriebenem Code.
  • Um die Sicherheit zu verbessern, ignoriert das Modul „os/exec“ jetzt relative Pfade beim Erweitern der Umgebungsvariable „PATH“ (beispielsweise wird das aktuelle Verzeichnis nicht mehr überprüft, wenn der Pfad für eine ausführbare Datei bestimmt wird).
  • Der Garbage Collector kann jetzt weiche Speichergrenzen definieren, die durch die Begrenzung der Heap-Größe und eine aggressivere Rückgabe des Speichers an das System durchgesetzt werden. Das heißt, es ist nicht garantiert, dass der Verbrauch unter allen Bedingungen innerhalb der angegebenen Grenzen liegt. Weiche Grenzen können für die Optimierung von Programmen nützlich sein, die in Containern mit festem Speicher ausgeführt werden.
  • Eine neue Build-Einschränkung „Unix“ wurde hinzugefügt, die in „go:build“-Zeilen verwendet werden kann, um Unix-ähnliche Systeme (AIX, Android, Darwin, Dragonfly, FreeBSD, Hurd, Illumos, iOS, Linux, NetBSD, OpenBSD, Solaris) herauszufiltern.
  • Zahlreiche Performance-Optimierungen wurden implementiert. Unterstützung für die dynamische Festlegung der Coroutine-Stackgröße wurde hinzugefügt, um die Größe kopierter Daten zu reduzieren. Auf Unix-Systemen wurde die automatische Verwendung zusätzlicher Dateideskriptoren implementiert (Erhöhung des RLIMIT_NOFILE-Limits). Um große Switch-Ausdrücke auf x86-64- und ARM64-Systemen zu beschleunigen, wurden Sprungtabellen verwendet, wodurch große Switch-Ausdrücke bis zu 20 % schneller verarbeitet werden konnten. Auf RISCV64-Systemen werden Funktionsargumente über CPU-Register übergeben, was die Performance um ca. 10 % verbessert hat.
  • Experimentelle Unterstützung für Linux-Umgebungen auf Systemen mit Loongson-Prozessoren basierend auf der 64-Bit-LoongArch-Architektur (GOARCH=loong64) hinzugefügt.

Source: opennet.ru