Nach einem Jahr der Entwicklung wurde die freie GCC-Compiler-Suite 15.1 veröffentlicht, das erste bedeutende Release in der neuen GCC 15.x-Serie. Gemäß dem Versionsnummernschema 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 das nächste bedeutende Release GCC 16.1 entstehen wird.
Hauptänderungen:
- Beim Kompilieren von Programmen in C wird standardmäßig der Standard C23 (Änderungsübersicht) mit GNU-Erweiterungen („-std=gnu23“) verwendet. Zuvor war der Standard C17 — „-std=gnu17“ — standardmäßig aktiv. Diese Änderung könnte beim Kompilieren bestehender Projekte zu Problemen führen, da die Konstante nullptr, der Typ _BitInt(n) und die Schlüsselwörter bool, true und false, die mit in den Anwendungen definierten Bezeichnern in Konflikt stehen können, eingeführt wurden.
- Die Möglichkeiten des Standards C23 wurden implementiert:
- Die Direktive «#embed», die zum Einbetten von Binärressourcen in den Code gedacht ist.
- Das Attribut «unsequenced», das signalisiert, dass das Ergebnis nicht von der Reihenfolge der Ausführung abhängt.
- Das Attribut «reproducible», das angibt, dass eine Funktion bei gleichen Eingabewerten immer dasselbe Ergebnis zurückgibt, d.h. von anderen Faktoren unabhängig ist.
- Elemente des zukünftigen Standards C2Y (-std=c2y und -std=gnu2y) wurden implementiert:
- Die Möglichkeit, Variablen im «if»-Operator zu deklarieren, zum Beispiel «if (int x = get ()) {…}».
- Unterstützung für die Benennung von Schleifen, um im 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 für die Angabe von Bereichs-Werten in «case»-Ausdrücken, zum Beispiel «case 1 … 10:».
- Die Suffixe «i» und «j» zur Kennzeichnung der imaginären Teile in komplexen Zahlen.
- Die Möglichkeit, die Operatoren «++» und «—» mit komplexen Zahlen zu verwenden.
- Die Konstruktion «_Generic(type, expr1, expr2, …)», um den Ausdruck basierend auf dem Typ des Operanden auszuwählen.
- Unterstützung für den Zugriff auf Byte-Arrays als andere Objekttypen, wie Strukturen und Vereinigungen.
- Unterstützung für die Anwendung des Operators «alignof» auf unvollständige Arrays (deklariert ohne Größenangabe, z.B. «int a[]»).
- Eine neue Syntax für oktale, hexadezimale und allgemeine Escape-Zeichenfolgen wurde hinzugefügt. Anstelle von «\u», «\x» und «\nnn» wurden 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 null-langen Zeigern NULL (z. B. «sizeof(*p)») sind erlaubt.
- Im Frontend für die Programmiersprache C++ wurden Möglichkeiten implementiert, die für den zukünftigen Standard C++26 entwickelt werden:
- Variadischer Operator «friend» («friend Ts…»).
- Die Möglichkeit, das Schlüsselwort «constexpr» mit einer Variante des «new»-Operators (Placement new) zu verwenden, um ein Objekt zur Kompilierungszeit 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 Parameterpaketen in Vorlagen.
- Attribute für strukturierte Bindungen;
- Syntax ‘= delete(«Grund»)’;
- Einbeziehung von «@», «$» und «`» in die Grundzeichensatz.
- Die Verwendung von Makros zur Deklaration von Modulen ist verboten.
- Die Möglichkeit, strukturierte Bindungen in Bedingungen in den Anweisungen if und switch zu verwenden.
- Die Unterstützung für den direkten Vergleich von Arrays (z. B. «int arr1[5]; int arr2[5]; bool same = arr1 == arr2») wurde eingestellt.
- Mechanismus «#embed» zum Einbetten von Binärressourcen.
- Die Vorlage der Klasse is_trivial wurde als veraltet erklärt.
- Funktionen von C++23 hinzugefügt:
- Verbot einiger Anwendungen der Direktive «export» und Erlaubnis zur Verwendung von «export {}».
- Unterstützung für die Verlängerung der Lebensdauer temporärer Objekte in «for»-Schleifen, die Bereiche durchlaufen.
- In der Bibliothek libstdc++ wurde experimentelle Unterstützung für die Module std und std.compat implementiert.
- Die Verwendung des Initialisierers «{0}» für Vereinigungen im C- und C++-Code garantiert jetzt nicht mehr die Bereinigung des gesamten Inhalts, sondern führt dazu, dass nur das erste Element der Vereinigung nullgesetzt wird. 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 für das Attribut «musttail» ([[gnu::musttail]] und [[clang::musttail]]) für garantierte Tail Calls wurde implementiert. Das Attribut wird auf return-Ausdrücke angewendet, in denen der aktuelle Funktionsaufruf rekursiv erfolgt, und garantiert, dass dieser Aufruf Tail Recursion verwendet, bei der kein zusätzlicher Speicher auf dem Stack alloziert wird (riskiert nicht, bei einer sehr hohen Anzahl von Aufrufen den Speicher zu erschöpfen).
- Die Unterstützung für das Attribut flag_enum ([[gnu::flag_enum]] und [[clang::flag_enum]]) wurde implementiert, das für Enumerationen verwendet wird, um anzuzeigen, dass der Inhalt in Bitoperationen verwendet wird (verhindert die Ausgabe einer Warnung im Modus „-Wswitch“).
- Die Unterstützung für das Attribut „counted_by“ wurde hinzugefügt, mit dem ein Feld in einer Struktur mit flexibler Array-Größe angegeben werden kann, das die Anzahl der Elemente definiert. Das Attribut kann verwendet werden, um die Effizienz von Überprüfungen des Pufferüberlaufs zu erhöhen.
- Für Funktionen wurde das Attribut „nonnull_if_nonzero“ hinzugefügt, das definiert, dass bestimmte Parameter von Funktionen mit Zeigern den Wert NULL nur annehmen dürfen, wenn ein anderer Parameter null ist.
- Es ist erlaubt, erweiterte Assembler-Einschübe „asm (…)“ außerhalb von Funktionen zu verwenden. In Assembler-Einschüben ist es erlaubt, den Speicher im roten Bereich des Stapels (Bereich an der Spitze des Stapels) zu überschreiben.
- Die Kompilierung von C++-Code wurde durch verbesserte Hashing-Methoden für Templates beschleunigt.
- Neue Optimierungen wurden hinzugefügt. Die Unterstützung für die Vektorisierung von Schleifen, in denen es Code für vorzeitige Ausstiege (z. B. durch Aufruf von break oder return) gibt, wurde implementiert, selbst wenn solche Schleifen dynamisch zugewiesene Arrays oder Puffer manipulieren, deren Größe zur Kompilierzeit unbekannt ist. Bei Angabe der Option „-O2“ wurde die Vektorisierung bestimmter leicht vektorisierbarer Schleifen aktiviert, für die keine Informationen über die Anzahl der Iterationen (tripcount) vorliegen.
- Ein inkrementeller Optimierungsmodus während des Linkens (LTO, Link-Time Optimization) wurde hinzugefügt, der die Zeit für die Neukompilierung bei Verwendung von LTO in Situationen, in denen geringfügige Änderungen am Code vorgenommen wurden (z. B. eine Funktion bearbeitet), erheblich reduziert. Um den inkrementellen Modus zu aktivieren, wurde die Option „-flto-incremental“ vorgeschlagen.
- Die Kompilierung sehr großer Eingabedateien wurde verbessert. Die Verfolgung von Spaltennummern, die 4096 überschreiten, wurde implementiert. Die Genauigkeit der Positionierung von Fehlern und Warnungen in sehr großen Dateien wurde erhöht.
- Die Lesbarkeit von Berichten zur Diagnostik von Problemen wurde erhöht. Zum Beispiel wurde die Hervorhebung des Entstehungsorts des Problems mit dem Symbol „⚠️“ sichergestellt, das Layout der Ausgabe bei C++-Fehlern wurde geändert, Hinweise zur Vereinfachung des Übergangs zu C23 wurden hinzugefügt und das Farbschema überarbeitet. Die Möglichkeit zur Ausgabe von Diagnosen im Sarif-Format (-fdiagnostics-format=sarif-file) wurde hinzugefügt.
- Die libgdiagnostics-Bibliothek wurde implementiert, die es ermöglicht, Funktionalitäten von GCC in Ihre Projekte zu integrieren, die sich auf die Gestaltung von Diagnosemeldungen beziehen (zum Beispiel können Zitationsmittel, Hervorhebungen und Hinweise zur Behebung verwendet werden).
- Warnungen "-Wtrailing-whitespace" und "-Wleading-whitespace" wurden hinzugefügt, um überflüssige Leerzeichen am Ende und zu Beginn von Zeilen zu identifizieren.
- Die Warnung "-Wheader-guard" wurde hinzugefügt, um auf Probleme mit den Header-Guard-Makros hinzuweisen, die ein mehrfaches Einfügen von Header-Dateien verhindern.
- Das Frontend für die Programmiersprache D wurde auf Version 2.111.0 aktualisiert.
- Im Frontend für die Programmiersprache Fortran wurde die Unterstützung für vorzeichenlose Ganzzahlen hinzugefügt.
- Der Compiler für die Programmiersprache COBOL – gcobol – wurde integriert, unterstützt die Plattformen x86-64 und AArch64 und ist nicht für 32-Bit-Systeme ausgelegt. Der Compiler implementiert die ISO/IEC-Spezifikation 1989:2023 und besteht die meisten NIST CCVS/85-Tests.
- Die Implementierung der Standards OpenMP 5.0, 5.1, 5.2 und 6.0 (Open Multi-Processing) wurde fortgesetzt, die API und Anwendungsmethoden für paralleles Programmieren auf Mehrkern- und hybriden (CPU+GPU/DSP) Systemen mit gemeinsamem Speicher und Vektorisierungsblöcken (SIMD) definieren. Unterstützung für Metadirektiven und die Konstruktionen tile, unroll, interop und dispatch wurde hinzugefügt. Für bestimmte AMD- und NVIDIA-GPUs wurde die Unterstützung für Unified Shared Memory hinzugefügt (aktiviert durch Angabe von unified_shared_memory in der "requires"-Direktive). Unterstützung für den Ausdruck "self_maps" wurde 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 umgesetzt und die Unterstützung der ACLE-Erweiterung (Arm C Language Extensions) wurde verbessert. Zahlreiche Verbesserungen im Codegenerator wurden vorgenommen. Unterstützung für CPUs 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 für die Code-Generierung für AMD Radeon GPU (GCN) wurde Unterstützung für die libstdc++-Bibliothek implementiert, sowie experimentelle Unterstützung für die Code-Generierung für die Geräte Serien gfx9-generic, gfx10-3-generic und gfx11-generic hinzugefügt.
- Die Backend-Unterstützung für die x86-Architektur wurde um die Erweiterungen der Befehlssatzarchitektur Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS erweitert. Unterstützung für die CPUs Intel Diamond Rapids und Xeon Phi wurde hinzugefügt.
- Die Möglichkeiten der Backends für die Plattformen LoongArch und AVR wurden erweitert.
- Die Unterstützung der Zielarchitektur nios2, die in Nios II-Prozessoren verwendet wird, wurde entfernt. Die ABI ILP32-Unterstützung (-mabi=ilp32) in der AArch64-Portierung wurde als veraltet erklärt und wird in der nächsten bedeutenden Version entfernt.
Quelle: opennet.ru
