Nach einem Jahr Entwicklung veröffentlicht Veröffentlichung des freien Satzes von Compilern GCC 16.1, die erste bedeutende Veröffentlichung in der neuen Reihe GCC 16.x. Entsprechend der Versionsnummerierung, wurde Version 16.0 im Entwicklungsprozess verwendet, und kurz vor der Veröffentlichung von GCC 16.1 hat sich bereits der Branch GCC 17.0, auf dessen Basis die nächste bedeutende Veröffentlichung GCC 17.1 erstellt wird.
Haupt- Änderungen:
- Der Standardmodus für die Programmiersprache C++ wurde auf die Verwendung des Standards C++20 (Dialekt GNU C++20, -std=gnu++20) anstelle des zuvor angebotenen C++17. Die Implementierung von C++20 in der Standardbibliothek wurde als stabil erklärt.
- Ein experimentelles Frontend ga68 für die Kompilierung von Programmen in der Programmiersprache Algol 68 wurde hinzugefügt.
- Die Möglichkeit zur Ausgabe von Diagnosen im HTML-Format wurde hinzugefügt. Die Informationen zum Programmablauf, die bei der Diagnose im Format ausgegeben werden, wurden erweitert SARIF, basierend auf JSON (die Unterstützung für „-fdiagnostics-format=json“ wurde eingestellt).
- Die Optimierungen im Bindungsprozess wurden erweitert (LTO, Link-Time Optimization). Eine neue Option „-flto-toplevel-asm-heuristics“ wurde hinzugefügt, die Heuristiken zur Verbesserung der Codeoptimierung mit Assembler-Einfügungen einschließt. Die Technik der spekulativen Devirtualisierung (-fdevirtualize-speculatively) ist nun nicht mehr auf die Transformation virtueller Methoden beschränkt und kann bei der Umwandlung in direkte Aufrufe aller indirekten Funktionsaufrufe, z.B. über Zeiger, angewendet werden.
- Die Unterstützung für die Vektorisierung von Schleifen, bei denen die Anzahl der Iterationen zur Kompilierungszeit unbekannt ist, wurde implementiert. Die Effizienz bei der Verarbeitung vorzeitiger Schleifenabrechnungen (z.B. über break) wurde erhöht.
- Es wurde experimentelle Unterstützung hinzugefügt viele Funktionen kürzlich genehmigte Standards C++26. Zum Beispiel wurden implementiert:
- Reflexion (Reflection, „-freflection“), die es ermöglicht, Elemente eines Programms zur Kompilierungszeit zu verfolgen und zu modifizieren. Neue Operatoren „^^ (open-std.org)“ zum Abrufen von Metainformationen über grammatische Konstrukte und „[:…:]“ zur Durchführung der Umkehrtransformation wurden hinzugefügt. Für die Transformation und Verarbeitung der durch Inspektion erhaltenen Informationen wurde die Bibliothek std::meta angeboten, und Funktionen wie Berechnungen mit Konstanten sind verfügbar.
- Vertragliches Programmieren (Verträge), mit dem formale Spezifikationen für Schnittstellen durch drei neue Operatoren definiert werden können: pre (Vorbedingung), post (Nachbedingung) und contract_assert (Überprüfung der Behauptung). Der Operator „pre“ definiert die Vorbedingungen, die vor dem Aufruf erfüllt sein müssen (Eingabedatenüberprüfung); „post“ sind die Bedingungen, die nach der Ausführung erfüllt sein müssen (Ausgabedatenanforderungen); contract_assert sind die Bedingungen, unter denen Ausnahmen auftreten können. Diese Funktion wird in GCC 16 verfügbar sein.
- Der Operator „template for“ dient zum Durchlaufen von Elementen wie parameterisierten Paketen, die tuple-ähnliche Objekte und Reflexionsergebnisse (Meta-Objekte) während der Kompilierung im Stil einer normalen Schleife ähnelt. Bei der Ausführung von „template for“ wird der Rumpf der Schleife für jedes Element aufgedeckt, und jede Iteration wird in einem separaten Sichtbereich verarbeitet, in dem das Element der Sequenz, über das die Schleife iteriert, für jede Iteration eine Konstante ist und an konstanten Ausdrücken (constexpr) beteiligt sein kann. Im Kontext der Reflexion kann „template for“ verwendet werden, um die Eigenschaften von Klassen oder Aufzählungen zu durchlaufen.
- Die Bibliothek std::simd zum Parallelisieren der Ausführung von Operationen auf Daten mithilfe von SIMD-Befehlssätzen wie AVX-512 und NEON, unter Verwendung des Standard-C++-Typsystems.
- Die Bibliotheken std::inplace_vector, std::optional, std::copyable_function, std::function_ref, std::indirect, std::polymorphic und std::owner_equal.
- Funktionen, die mit dem Standard C++23 in Verbindung stehen, wurden implementiert, wie explizites Management der Lebensdauer von Objekten und unterstützt Angaben zur Zeichencodierung von Diagnosemeldungen.
- Die Unterstützung des Standards C23 (opennet.ru), beispielsweise wurde die Verwendung des Attributs „counted_by“ zur Überprüfung der korrekten Verwendung von Zeigern implementiert.
- Fortgesetzt Implementierung der Standards OpenMP 5.0, 5.1, 5.2 und 6.0 (Open Multi-Processing), die APIs und Methoden zum Parallelprogrammieren auf Mehrkern- und hybriden (CPU+GPU/DSP) Systemen mit gemeinsamem Speicher und Vektorisierungsblöcken (SIMD) definieren. Verbessert Implementierung von Spezifikationen für paralleles Programmieren OpenACC 3.0, 3.3 und 3.4, die Mittel zum Offloading von Operationen auf GPUs und spezialisierte Prozessoren wie NVIDIA PTX definieren.
- Im Backend für die x86-Architektur wurde die Unterstützung von AMD-Prozessoren basierend auf der Mikroarchitektur Zen6 (-march=znver6), sowie von Intel-Prozessoren Wildcat Lake (-march=wildcatlake) und Nova Lake (-march=novalake) hinzugefügt.
- Im Backend der Codegenerierung für GPU AMD Radeon (GCN) wurde die Unterstützung für die Beschleuniger AMD Instinct MI300 (gfx942) implementiert.
- Für die Architekturen RISC-V, ARM, S/390 und LoongArch wurde die Unterstützung für den Typ „_BitInt (N)“ zur Definition von Ganzzahlen mit einer angegebenen Anzahl von Bits implementiert.
Quelle: linux.org.ru
