Nach einem Jahr der Entwicklung wurde die erste bedeutende Version des freien Compiler-Sets GCC 16.1 veröffentlicht, die zur neuen GCC 16.x Reihe gehört. Entsprechend dem Versionsschema wurde Version 16.0 während der Entwicklungsphase verwendet, und kurz vor der Veröffentlichung von GCC 16.1 wurde bereits die Linie GCC 17.0 abgezweigt, auf deren Basis das nächste bedeutende Release GCC 17.1 entstehen wird.
Wesentliche Änderungen:
- Der Standardmodus für die Programmiersprache C++ wurde auf die Nutzung des C++20 Standards (GNU C++20-Dialekt, -std=gnu++20) umgeschaltet, anstelle des zuvor angebotenen C++17. Die Implementierung von C++20 in der Standardbibliothek wird als stabil betrachtet.
- Der experimentelle Frontend ga68 zur Kompilierung von Programmen in der Programmiersprache Algol 68 wurde hinzugefügt.
- Die Möglichkeit zur Ausgabe von Diagnosedaten im HTML-Format wurde hinzugefügt. Die Informationen über den Programmablauf, die in der Diagnoseausgabe im SARIF-Format, das auf JSON basiert, einfließen, wurden erweitert (Unterstützung für „-fdiagnostics-format=json“ wurde eingestellt).
- Die Optimierungen in der Verknüpfungsphase (LTO, Link-Time Optimization) wurden erweitert. Eine neue Option „-flto-toplevel-asm-heuristics“ wurde hinzugefügt, die eine Heuristik zur Verbesserung der Codeoptimierung mit Inline-Assembler beinhaltet. Die Technik der spekulativen Devirtualisierung (-fdevirtualize-speculatively) ist nun nicht mehr auf die Transformation virtueller Methoden beschränkt und kann auf die Umwandlung aller indirekten Funktionsaufrufe, wie z. B. Aufrufe über Zeiger, angewendet werden.
- Die Unterstützung für die Vektorisierung von Schleifen, deren Anzahl der Iterationen zum Zeitpunkt der Kompilierung unbekannt ist, wurde implementiert. Die Effizienz bei der Verarbeitung vorzeitiger Schleifenausgänge (z. B. über break) wurde erhöht.
- Experimentelle Unterstützung für viele Funktionen des neu genehmigten Standards C++26 wurde hinzugefügt. Zum Beispiel wurden folgende Funktionen umgesetzt:
- Reflexion, die es ermöglicht, Programmelemente zur Compile-Zeit zu verfolgen und zu modifizieren. Neue Operatoren «^^» wurden hinzugefügt, um Metainformationen über grammatische Strukturen abzurufen, und «[:…:]» zur Durchführung von Umwandlungen. Zur Umwandlung und Verarbeitung der während der Inspektion gewonnenen Informationen steht die Bibliothek std::meta zur Verfügung, die Funktionen für Berechnungen mit Konstanten bietet.
- Vertragsprogrammierung, die es ermöglicht, formale Schnittstellenspezifikationen mit drei neuen Operatoren zu definieren: pre (Vorbedingung), post (Nachbedingung) und contract_assert (Assertionsprüfung). Der Operator «pre» legt die Bedingungen fest, die vor dem Aufruf erfüllt sein müssen (Überprüfung der Eingabewerte); «post» definiert die Bedingungen, die nach der Ausführung eingehalten werden müssen (Ausgabewertanforderungen); contract_assert behandelt die Bedingungen für Ausnahmen. Diese Möglichkeit wird in GCC 16 verfügbar sein.
- Der „template for“-Operator dient dazu, Elemente wie Parameterpakete, tuple-ähnliche Objekte und Reflexionsergebnisse (Meta-Objekte) während der Kompilierung im Stil einer gewöhnlichen Schleife zu durchlaufen. Bei der Ausführung von „template for“ wird der Schleifeninhalt für jedes Element entpackt, und jede Iteration wird in einem separaten Geltungsbereich verarbeitet, in dem das Element der Sequenz, über die die Schleife iteriert, für jede Iteration eine Konstante ist und in konstanten Ausdrücken (constexpr) verwendet werden kann. Im Kontext der Reflexion kann „template for“ verwendet werden, um Eigenschaften von Klassen oder Aufzählungen zu durchlaufen.
- Die Bibliothek std::simd dient der Parallelisierung von Operationen auf Daten mithilfe von SIMD-Befehlssätzen wie AVX-512 und NEON unter Verwendung des standardisierten Typsystems von C++.
- Die Bibliotheken std::inplace_vector, std::optional<T&>, std::copyable_function, std::function_ref, std::indirect, std::polymorphic und std::owner_equal.
- Funktionen, die mit dem Standard C++23 verknüpft sind, wurden implementiert, darunter eine explizite Steuerung der Lebensdauer von Objekten und die Unterstützung der Angabe von Zeichencodierungen für diagnostische Nachrichten.
- Die Unterstützung des C23-Standards wurde erweitert, unter anderem wurde die Möglichkeit zur Verwendung des Attributs „counted_by“ zur Überprüfung der korrekten Nutzung von Zeigern implementiert.
- Die Umsetzung der Standards OpenMP 5.0, 5.1, 5.2 und 6.0 (Open Multi-Processing) wurde fortgesetzt, die die API und Methoden zur Anwendung von paralleler Programmierung auf Mehrkern- und hybriden (CPU+GPU/DSP) Systemen mit gemeinsamem Speicher und Vektorisierungsbaugruppen (SIMD) definieren. Die Umsetzung der Spezifikationen für paralleles Programmieren OpenACC 3.0, 3.3 und 3.4 wurde verbessert, die Mittel für Offloading-Operationen auf GPUs und spezialisierte Prozessoren wie NVIDIA PTX definieren.
- Im Backend für die Architektur x86 wurde die Unterstützung für AMD-Prozessoren auf Basis der Mikroarchitektur Zen6 (-march=znver6) sowie für die Prozessoren Intel Wildcat Lake (-march=wildcatlake) und Nova Lake (-march=novalake) hinzugefügt.
- Im Backend der Codegenerierung für AMD Radeon GPUs (GCN) wurde die Unterstützung für die AMD Instinct MI300-Beschleuniger (gfx942) implementiert.
- Für die Architekturen RISC-V, ARM, S/390 und LoongArch wurde die Unterstützung des Typs „_BitInt (N)“ zur Definition von Ganzzahlen mit einer bestimmten Bitanzahl umgesetzt.
Quelle: opennet.ru
