Die Veröffentlichung von Go 1.18, einer Programmiersprache, die von Google in Zusammenarbeit mit der Community entwickelt wird, wurde vorgestellt. Diese hybride Lösung vereint die hohe Leistung kompilierter Sprachen mit den Vorteilen von Skriptsprachen, wie Leichtigkeit beim Schreiben von Code, schnelle Entwicklung und Fehlerresistenz. Der Quellcode des Projekts wird unter der BSD-Lizenz veröffentlicht.
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.
In der neuen Version wurde die Unterstützung für generische Funktionen und Typen (Generika) hinzugefügt, mit denen Entwickler Funktionen definieren und verwenden können, die für mehrere Typen gleichzeitig ausgelegt sind. Es ist auch möglich, Schnittstellen zu verwenden, um kombinierte Typen zu erstellen, die mehrere Datentypen abdecken. Die Unterstützung für Generika wurde implementiert, ohne die Abwärtskompatibilität mit bestehenden Code zu beeinträchtigen.// Summation von Werten einer Menge, die für die Typen int64 und float64 funktioniert func SumIntsOrFloats[K vergleichbar, V int64 | float64](m map[K]V) V { var s V for _, v := range m { s += v } return s }// Eine andere Variante mit generischer Typdefinition: type Number interface { int64 | float64 } func SumNumbers[K vergleichbar, V Number](m map[K]V) V { var s V for _, v := range m { s += v } return s }
Weitere Verbesserungen:
- In die Standard-Tools sind Utilities für Fuzzing-Code-Tests integriert. Beim Fuzzing-Test werden alle möglichen zufälligen Kombinationen von Eingabedaten generiert und mögliche Fehler während deren Verarbeitung erfasst. Wenn eine bestimmte Sequenz zum Absturz führt oder nicht der erwarteten Reaktion entspricht, deutet dieses Verhalten mit hoher Wahrscheinlichkeit auf einen Fehler oder eine Schwachstelle hin.
- Die Unterstützung für mehrere modulare Arbeitsbereiche wurde hinzugefügt, die es ermöglichen, Befehle gleichzeitig für mehrere Module auszuführen, wodurch der Code in mehreren Modulen gleichzeitig kompiliert und ausgeführt werden kann.
- Es wurde eine erhebliche Leistungsoptimierung für Systeme auf Basis von Apple M1, ARM64 und PowerPC64 durchgeführt. Die Möglichkeit, Register anstelle des Stacks zur Übertragung von Argumenten an Funktionen und zur Rückgabe von Ergebnissen zu verwenden, wurde aktiviert. Das Inline-Deployment von Schleifen durch den Compiler wurde verbessert. Die Typprüfung im Compiler wurde vollständig überarbeitet. In bestimmten Tests im Vergleich zur vorherigen Version wurde eine Leistungssteigerung des Codes um 20 % festgestellt, jedoch dauert die Kompilierung selbst etwa 15 % länger.
- Die Effizienz der Rückgabe freigegebener Speicher an das Betriebssystem wurde im Runtime verbessert, und die Funktionsweise des Garbage Collectors ist jetzt vorhersehbarer.
- Die Standardbibliothek hat neue Pakete wie net/netip und debug/buildinfo hinzugefügt. Die Unterstützung für TLS 1.0 und 1.1 ist im Client-Code standardmäßig deaktiviert. Im Modul crypto/x509 wurde die Verarbeitung von Zertifikaten mit SHA-1 Signaturen eingestellt.
- Die Umgebungsvoraussetzungen für Linux wurden angehoben; nun ist mindestens ein Linux-Kernel in der Version 2.6.32 erforderlich. In der nächsten Version werden ähnliche Änderungen für FreeBSD erwartet (die Unterstützung für die Version FreeBSD 11.x wird eingestellt), und es wird mindestens FreeBSD 12.2 benötigt.
Quelle: opennet.ru
