Nach einem Jahr Entwicklungsarbeit wurde die erste bedeutende Veröffentlichung in der neuen Reihe GCC 15.x, GCC 15.1, veröffentlicht. Laut dem Versionsnummerierungsschema wurde die Version 15.0 während der Entwicklung verwendet, und kurz vor der Veröffentlichung von GCC 15.1 wurde bereits der Branch GCC 16.0 abgezweigt, auf dessen Basis die nächste bedeutende Veröffentlichung, GCC 16.1, erstellt wird.
Wesentliche Änderungen:
- Beim Kompilieren von Programmen in der Programmiersprache C wird standardmäßig der Standard C23 (Änderungsübersicht) mit GNU-Erweiterungen ('-std=gnu23') verwendet. Zuvor wurde standardmäßig der Standard C17 – '-std=gnu17' – eingesetzt. Diese Änderung kann möglicherweise zu Problemen beim Bauen bestehender Projekte führen, da die Konstante nullptr, der Typ _BitInt(n) und die Schlüsselwörter bool, true und false eingeführt wurden, die mit in den Anwendungen definierten gleichnamigen Identifikatoren in Konflikt geraten können.
- Die Möglichkeiten des Standards C23 wurden implementiert:
- Die Direktive '#embed', die dazu dient, binäre Ressourcen in den Code einzubetten.
- Das Attribut 'unsequenced', das signalisiert, dass das Ergebnis nicht von der Ausführungsreihenfolge abhängt.
- Das Attribut „reproduzierbar“, das angibt, dass eine Funktion bei identischen Eingabewerten immer dasselbe Ergebnis zurückliefert, d.h. von anderen Faktoren unabhängig ist.
- Implementierung von Elementen des zukünftigen Standards C2Y (-std=c2y und -std=gnu2y):
- Möglichkeit, Variablen im ‚if‘-Operator zu deklarieren, z.B. ‚if (int x = get ()) {…}‘.
- Unterstützung der Benennung von Schleifen, um in Code auf sie zu verweisen. outer: for (int i = 0; i < IK; ++i) { switch (i) { case 1: break; // springt zu CONT1 case 2: break outer; // springt zu CONT2 } // CONT1 } // CONT2
- Unterstützung der Angabe von Bereichswerten in ‚case‘-Ausdrücken, z.B. ‚case 1 … 10:‘.
- Suffixe „i“ und „j“ zur Kennzeichnung des Imaginärteils in komplexen Zahlen.
- Möglichkeit, die Operatoren „++“ und „—“ mit komplexen Zahlen zu verwenden.
- Die Konstruktion „_Generic(type, expr1, expr2, …)“ zur Auswahl des Ausdrucks basierend auf dem Typ des Operanden.
- Unterstützung des Zugriffs auf Byte-Arrays als andere Objekttypen, wie z.B. Strukturen und Vereinigungen.
- Unterstützung der Anwendung des Operators „alignof“ auf unvollständige Arrays (deklariert ohne Größenangabe, z.B. „int a[]“).
- Ein neuer Syntax für oktale, hexadezimale und universelle Escape-Zeichensequenzen wurde hinzugefügt. Anstelle von „\u“, „\x“ und „\nnn“ werden die Sequenzen „\u{}“, „\o{}“ und „\x{}“ vorgeschlagen, in denen eine beliebige Anzahl von Ziffern angegeben werden kann.
- Eingebaute Funktionen „__builtin_stdc_rotate_left“ und „__builtin_stdc_rotate_right“.
- Operationen mit nulllängigen Zeigern NULL sind erlaubt (z. B. „sizeof(*p)“).
- Im Frontend für die Programmiersprache C++ wurden Funktionen implementiert, die für den zukünftigen Standard C++26 entwickelt werden:
- Variadischer Operator „friend“ („friend Ts…“).
- Möglichkeit, das Schlüsselwort „constexpr“ mit der Variante des „new“-Operators (Placement New) zu verwenden, um ein Objekt zur Compile-Zeit im Voraus reservierten Speicher zu platzieren.
- Fehlerausgabe beim Löschen eines Zeigers auf einen unvollständigen Typ.
- Die Syntax zur Definition variadischer Parameter mit Ellipsen ohne vorhergehendes Komma wurde als veraltet erklärt (z. B. wenn „void e(int…)“ anstelle von „void e(int, …)“ angegeben wird).
- Indizierung von Parametersets in Vorlagen.
- Attribute für strukturierte Bindungen;
- Syntax ‚= delete(„Grund“);‘
- Einbeziehung von „@“, „$“ und „`“ in den Basiszeichensatz.
- Die Verwendung von Makros zur Deklaration von Modulen ist nicht gestattet.
- Die Möglichkeit der Anwendung von strukturiertem Binding als Bedingung in den if- und switch-Anweisungen ist hinzugefügt worden.
- Die Unterstützung des direkten Vergleichs von Arrays wurde eingestellt (z. B. «int arr1[5]; int arr2[5]; bool same = arr1 == arr2»).
- Der Mechanismus «#embed» zur Einbettung von binären Ressourcen.
- Die Vorlagklasse is_trivial wurde als veraltet erklärt.
- Funktionen von C++23 wurden hinzugefügt:
- Die Nutzung bestimmter Anwendungen der Direktive «export» ist verboten, während die Verwendung von «export {}» erlaubt ist.
- Die Unterstützung zur Verlängerung der Lebensdauer temporärer Objekte in for-Schleifen, die Bereiche durchlaufen, wurde hinzugefügt.
- In der libstdc++-Bibliothek wurde eine experimentelle Unterstützung für die Module std und std.compat implementiert.
- Die Verwendung des Initialisierers «{0}» für Vereinigungen in C- und C++-Code garantiert nun nicht mehr die Bereinigung des gesamten Inhalts, sondern führt zur Nullsetzung des ersten Elements der Vereinigung. Um die gesamte Vereinigung zu bereinigen, sollte der Ausdruck «{}» verwendet werden, der in der Spezifikation C23 definiert ist, oder die Option «-fzero-init-padding-bits=unions» angegeben werden, um das alte Verhalten wiederherzustellen.
- Die Unterstützung des Attributs „musttail“ ([[gnu::musttail]] und [[clang::musttail]]) für garantierte Schwanzaufrufe wurde implementiert. Das Attribut wird auf Rückgabewerte angewendet, bei denen eine rekursive Aufruf der aktuellen Funktion erfolgt, und stellt sicher, dass dieser Aufruf Schwanzrekursion verwendet, bei der kein zusätzlicher Speicher im Stack zugeordnet wird (was das Risiko einer Speichererschöpfung bei sehr vielen Aufrufen ausschließt).
- Die Unterstützung des Attributs flag_enum ([[gnu::flag_enum]] und [[clang::flag_enum]]) wurde eingeführt, das auf Aufzählungen angewendet wird, um anzuzeigen, dass deren Inhalt in Bitoperationen verwendet wird (was das Ausgeben von Warnungen im Modus „-Wswitch“ ausschließt).
- Die Unterstützung des Attributs „counted_by“ wurde hinzugefügt, mit dem man ein Feld in einer Struktur mit flexiblem Array angeben kann, das die Anzahl der Elemente definiert. Dieses Attribut kann verwendet werden, um die Effizienz von Grenzwertprüfungen zu verbessern.
- Für Funktionen wurde das Attribut „nonnull_if_nonzero“ hinzugefügt, das festlegt, dass bestimmte Funktionsparameter mit Zeigern nur dann den Wert NULL annehmen können, wenn ein anderer Parameter null ist.
- Erweiterte Inline-Assembler-Einsätze „asm (…)“ sind außerhalb von Funktionen erlaubt. In den Assembler-Einsätzen ist es gestattet, den Speicher im roten Bereich des Stacks (Bereich oben auf dem Stack) neu zu schreiben.
- Die Übersetzung von C++-Code wurde durch verbessertes Hashing von Vorlagen beschleunigt.
- Neue Optimierungen wurden hinzugefügt. Die Unterstützung für die Vektorisierung von Schleifen wurde implementiert, in denen es Code für frühzeitiges Verlassen gibt (z. B. durch den Aufruf von break oder return), selbst wenn solche Schleifen dynamisch zugewiesene Arrays oder Puffer manipulieren, deren Größe zur Compile-Zeit unbekannt ist. Bei Angabe der Option „-O2“ wird die Vektorisierung einiger leicht zu vektorisierender Schleifen aktiviert, für die keine Informationen über die Anzahl der Iterationen (tripcount) vorliegen.
- Ein inkrementeller Optimierungsmodus während der Bindung (LTO, Link-Time Optimization) wurde hinzugefügt, der die Zeit der Neukompilierung erheblich verkürzt, wenn LTO in Situationen verwendet wird, in denen geringe Änderungen am Code vorgenommen wurden (einzelne Funktion bearbeitet). Zur Aktivierung des inkrementellen Modus wird die Option „-flto-incremental“ empfohlen.
- Die Kompilierung von sehr großen Eingabedateien wurde verbessert. Es wurde eine Verfolgung der Spaltennummern über 4096 implementiert. Die Genauigkeit bei der Angabe von Fehler- und Warnstandorten in sehr großen Dateien wurde erhöht.
- Die Übersichtlichkeit der Berichte bei der Diagnose von Problemen wurde verbessert. Zum Beispiel wird der Ort des Problems mit dem Symbol „⚠️“ hervorgehoben, die Darstellung bei Fehlern in C++-Vorlagen wurde geändert, es wurden Hinweise zum einfachen Übergang auf den Standard C23 hinzugefügt und das Farbschema überarbeitet. Es wurde die Möglichkeit hinzugefügt, Diagnosen im Sarif-Format auszugeben (-fdiagnostics-format=sarif-file).
- Eine Bibliothek libgdiagnostics wurde implementiert, die es ermöglicht, die Funktionen von GCC zur Gestaltung von Diagnosenachrichten in Ihre Projekte zu integrieren (z. B. kann auf Zitiermittel, Hervorhebungen und Tipps zur Behebung zurückgegriffen werden).
- Die Warnungen „-Wtrailing-whitespace“ und „-Wleading-whitespace“ wurden hinzugefügt, um überflüssige Leerzeichen am Ende und den Beginn von Zeilen zu identifizieren.
- Die Warnung „-Wheader-guard“ wurde hinzugefügt, um über Probleme mit Makros zum Schutz von Header-Dateien zu informieren, die ein wiederholtes Einfügen der Header-Datei verhindern.
- Das Frontend für die Sprache D wurde auf Version 2.111.0 aktualisiert.
- Im Frontend für die Sprache Fortran wurde die Unterstützung für vorzeichenlose Ganzzahlen hinzugefügt.
- Ein Compiler für die Sprache COBOL - gcobol, der die Plattformen x86-64 und AArch64 unterstützt, und nicht für den Einsatz auf 32-Bit-Systemen ausgelegt ist, wurde aufgenommen. Der Compiler setzt die ISO/IEC-Spezifikation 1989:2023 um und besteht die meisten Tests NIST CCVS/85.
- Die Umsetzung der Standards OpenMP 5.0, 5.1, 5.2 und 6.0 (Open Multi-Processing), die API und Methoden zur Anwendung von paralleler Programmierung auf Multi-Core und hybriden (CPU+GPU/DSP) Systemen mit gemeinsamem Speicher und Vektorisierungsblöcken (SIMD) definieren, wird fortgesetzt. Unterstützung für Metadirektiven und Konstruktionen wie tile, unroll, interop und dispatch wurde hinzugefügt. Für einige AMD- und NVIDIA-GPUs wurde die Unterstützung für unified shared memory (aktiviert durch die Angabe von unified_shared_memory in der Direktive „requires“) hinzugefügt. Unterstützung für den Ausdruck „self_maps“ wurde ebenfalls hinzugefügt.
- Im Backend für die Architektur AArch64 wurde die Unterstützung für die MinGW-Plattform (aarch64-w64-mingw32) hinzugefügt. Über 20 ARM8-Erweiterungen wurden implementiert und die Unterstützung für die ACLE-Erweiterung (Arm C Language Extensions) verbessert. Zahlreiche Verbesserungen im Codegenerator wurden vorgenommen. Unterstützung für die CPU wurde hinzugefügt:
- Apple A12 (apple-a12)
- Apple M1 (apple-m1)
- Apple M2 (apple-m2)
- Apple M3 (apple-m3)
- Arm Cortex-A520AE (cortex-a520ae)
- Arm Cortex-A720AE (cortex-a720ae)
- Arm Cortex-A725 (cortex-a725)
- Arm Cortex-R82AE (cortex-r82ae)
- Arm Cortex-X925 (cortex-x925)
- Arm Neoverse N3 (neoverse-n3)
- Arm Neoverse V3 (neoverse-v3)
- Arm Neoverse V3AE (neoverse-v3ae)
- FUJITSU-MONAKA (fujitsu-monaka)
- NVIDIA Grace (grace)
- NVIDIA Olympus (olympus)
- Qualcomm Oryon-1 (oryon-1)
- Im Backend der Codegenerierung für AMD Radeon GPUs (GCN) wurde die Unterstützung für die Bibliothek libstdc++ implementiert und experimentelle Unterstützung für die Codegenerierung für die Geräte-Serien gfx9-generic, gfx10-3-generic und gfx11-generic hinzugefügt.
- Im Backend für die x86-Architektur wurde die Unterstützung für die Erweiterungen des Intel Befehlssatzes AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS hinzugefügt. Unterstützung für Intel Diamond Rapids und Xeon Phi wurde ebenfalls implementiert.
- Die Funktionen der Backends für die LoongArch- und AVR-Plattformen wurden erweitert.
- Die Unterstützung für die Zielarchitektur nios2, verwendet in Nios II-Prozessoren, wurde entfernt. Die ABI ILP32 (-mabi=ilp32) im AArch64-Port wurde für veraltet erklärt und wird in der nächsten Hauptversion entfernt.
Quelle: opennet.ru
