Po roce vývoje byla uvolněna bezplatná sada kompilátorů GCC GCC 15.1, první velké vydání v nové větvi GCC 15.x. Podle schématu číslování vydání byla při vývoji použita verze 15.0 a krátce před vydáním GCC 15.1 již byla větev GCC 16.0 rozvětvena, což bude tvořit základ příští hlavní verze, GCC 16.1.
Hlavní změny:
- Při kompilaci programů C se standardně používá standard C23 (Shrnutí změn) s rozšířeními GNU ("-std=gnu23"). Dříve se standardně používal standard C17 (-std=gnu17). Změna by mohla potenciálně způsobit problémy při vytváření existujících projektů kvůli zahrnutí konstanty nullptr, typu _BitInt(n) a klíčových slov bool, true a false, což by mohlo být v konfliktu s podobně pojmenovanými identifikátory definovanými v aplikacích.
- Byly implementovány následující schopnosti standardu C23:
- Direktiva "#embed" je navržena pro vkládání binárních zdrojů do kódu.
- Atribut „unsequenced“, který označuje, že výsledek nezávisí na pořadí provedení.
- Atribut "reprodukovatelný" označuje, že funkce vždy vrací stejný výsledek při stejném vstupu, tj. nezávisí na jiných faktorech.
- Byly implementovány prvky budoucího standardu C2Y (-std=c2y a -std=gnu2y):
- Schopnost deklarovat proměnné v příkazu "if", jako je "if (int x = get ()) {...}".
- Podpora pro pojmenování smyček, aby se na ně odkazovalo v kódu. vnější: for (int i = 0; i < IK; ++ i) { switch (i) { case 1: break; // skočí na CONT1 case 2: break external; // skočí na CONT2 } // CONT1 } // CONT2
- Podpora pro specifikaci rozsahů celočíselných hodnot ve výrazech typu case, jako je "case 1...10:".
- Přípony „i“ a „j“ k označení imaginární části v komplexních číslech.
- Možnost použití operátorů "++" a "—" s komplexními čísly.
- Konstrukt "_Generic(type, expr1, expr2, …)" pro výběr výrazu na základě typu operandu.
- Podpora pro přístup k bajtovým polím jako u jiných typů objektů, jako jsou struktury a sjednocení.
- Podpora pro použití operátoru "alignof" na neúplná pole (ta, která jsou deklarována bez určení velikosti, například "int a[]").
- Přidána nová syntaxe pro osmičkové, šestnáctkové a univerzální sekvence escape znaků. Místo „\u“, „\x“ a „\nnn“ jsou navrženy sekvence „\u{}“, „\o{}“ a „\x{}“, ve kterých lze zadat libovolný počet číslic.
- Vestavěné funkce "__builtin_stdc_rotate_left" a "__builtin_stdc_rotate_right".
- Operace nulové délky na ukazatelích NULL jsou povoleny (např. "sizeof(*p)").
- Frontend pro jazyk C++ implementuje funkce, které jsou vyvíjeny pro budoucí standard C++26:
- Variační operátor "friend" ("friend Ts...").
- Možnost použít klíčové slovo constexpr s obměnou operátoru new (placement new) k umístění objektu do předem přidělené paměti v době kompilace.
- Chybový výstup při mazání ukazatele na neúplný typ.
- Syntaxe pro definování variadických parametrů se třemi tečkami bez předchozí čárky (například při zadávání "void e(int…)" místo "void e(int, …)" byla zastaralá.
- Indexování balíčku parametrů v šablonách.
- Atributy pro strukturované vazby;
- Syntaxe '= delete("reason")';
- Zahrnutí "@", "$" a "`" do základní znakové sady.
- Použití maker k deklaraci modulů je zakázáno.
- Schopnost používat strukturovanou vazbu jako podmínku v příkazech if a switch.
- Podpora přímého porovnávání polí (např. "int arr1[5]; int arr2[5]; bool same = arr1 == arr2") byla ukončena.
- Mechanismus "#embed" pro vkládání binárních zdrojů.
- Třída šablony is_trivial byla zastaralá.
- Přidané funkce C++23:
- Zakázat některá použití direktivy "export" a povolit použití "export {}".
- Podpora pro prodloužení životnosti dočasných objektů v cyklech for, které se opakují přes rozsahy.
- Knihovna libstdc++ implementuje experimentální podporu pro moduly std a std.compat.
- Použití inicializátoru "{0}" pro sjednocení v kódu C a C++ již nezaručuje, že bude vymazán veškerý obsah, ale místo toho bude první prvek sjednocení vynulován. Chcete-li vymazat celé sjednocení, použijte výraz "{}" definovaný ve specifikaci C23 nebo zadejte volbu "-fzero-init-padding-bits=unions" pro obnovení starého chování.
- Implementována podpora pro atribut "musttail" ([[gnu::musttail]] a [[clang::musttail]]) pro zaručená koncová volání. Atribut se vztahuje na příkazy return, které provádějí rekurzivní volání aktuální funkce, a zajišťuje, že takové volání bude používat koncovou rekurzi, která nepřiděluje další paměť na zásobníku (eliminuje riziko nedostatku paměti při velmi velkém počtu volání).
- Implementovaná podpora atributu flag_enum ([[gnu::flag_enum]] a [[clang::flag_enum]]) aplikovaná na výčty k označení toho, že obsah je používán v bitových operacích (zabraňuje varování v režimu -Wswitch).
- Přidána podpora pro atribut „counted_by“, který lze použít k určení pole ve struktuře s flexibilním polem, které určuje počet prvků. Atribut lze použít ke zlepšení účinnosti kontrol přetečení vyrovnávací paměti.
- Do funkcí přidán atribut "nonnull_if_nonzero", který určuje, že některé parametry funkcí s ukazateli mohou mít hodnotu NULL, pouze pokud je jiný parametr nulový.
- Rozšířený assembler vkládající vnější funkce "asm(….)" je povolen. Ve insertech assembleru je povoleno přepisovat paměť v červené zóně zásobníku (oblast v horní části zásobníku).
- Kompilace kódu C++ je rychlejší díky vylepšenému hashování šablon.
- Přidány nové optimalizace. Byla implementována podpora pro vektorizaci smyček, které obsahují kód pro předčasné ukončení (například prostřednictvím přerušení nebo zpětného volání), i když takové smyčky manipulují s dynamicky alokovanými poli nebo vyrovnávací paměti, jejichž velikost je v době kompilace neznámá. Když je specifikována možnost -O2, je povolena vektorizace některých snadno vektorizovatelných smyček, pro které nejsou k dispozici informace o počtu cest.
- Přidán režim přírůstkové optimalizace ve fázi propojení (LTO, Link-Time Optimization), který výrazně zkracuje dobu rekompilace při použití LTO v situacích, kdy byly v kódu provedeny drobné změny (upravena jedna funkce). Pro aktivaci inkrementálního režimu je navržena volba "-flto-incremental".
- Vylepšená kompilace velmi velkých vstupních souborů. Implementováno sledování čísel sloupců větších než 4096. Vylepšená přesnost indikace umístění chyb a varování ve velmi velkých souborech.
- Vylepšená viditelnost sestav při diagnostice problémů. Například místo problému je zvýrazněno symbolem „⚠️“, bylo změněno rozložení výstupu pro chyby v šablonách C++, byly přidány rady pro zjednodušení přechodu na standard C23 a bylo přepracováno barevné schéma. Přidána možnost výstupu diagnostiky ve formátu Sarif (-fdiagnostics-format=sarif-soubor).
- Byla implementována knihovna libgdiagnostics, která vám umožňuje integrovat funkce GCC související s návrhem diagnostických zpráv do vašich projektů (můžete například používat rady pro citace, zvýraznění a opravy).
- Přidána varování "-Wtrailing-whitespace" a "-Wleading-whitespace" pro detekci zbytkového bílého místa na konci řádků a nadbytečné bílé mezery na začátku řádků.
- Přidáno varování "-Wheader-guard" pro hlášení problémů v makrech pro ochranu záhlaví, které brání opětovnému zahrnutí souboru záhlaví.
- Frontend pro jazyk D byl aktualizován na verzi 2.111.0.
- Do frontendu Fortranu byla přidána podpora pro celá čísla bez znaménka.
- Balíček obsahuje kompilátor pro jazyk COBOL gcobol, který podporuje platformy x86-64 a AArch64 a není určen pro použití na 32bitových systémech. Kompilátor implementuje specifikaci ISO/IEC 1989:2023 a projde většinou testů NIST CCVS/85.
- Pokračovalo se v implementaci standardů OpenMP 5.0, 5.1, 5.2 a 6.0 (Open Multi-Processing), definujících API a metody pro aplikaci metod paralelního programování na vícejádrových a hybridních (CPU+GPU/DSP) systémech se sdílenou pamětí a vektorizačními jednotkami (SIMD). Přidána podpora pro metasměrnice a konstrukce dlaždic, rozbalování, interoperace a odesílání. U některých GPU AMD a NVIDIA byla přidána podpora sjednocené sdílené paměti (povolená zadáním unified_shared_memory v direktivě „requires“). Přidána podpora pro výraz "self_maps".
- Backend pro architekturu AArch64 byl aktualizován, aby podporoval platformu MinGW (aarch64-w64-mingw32). Bylo implementováno více než 20 rozšíření ARM8 a byla vylepšena podpora rozšíření ACLE (Arm C Language Extensions). V generátoru kódu byla provedena řada vylepšení. Přidána podpora CPU:
- Apple A12 (apple-a12)
- Apple M1 (apple-m1)
- Apple M2 (apple-m2)
- Apple M3 (apple-m3)
- Rameno Cortex-A520AE (cortex-a520ae)
- Rameno Cortex-A720AE (cortex-a720ae)
- Arm Cortex-A725 (cortex-A725)
- Rameno 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
- NVIDIA Olympus (Olympus)
- Qualcomm Oryon-1 (Oryon-1)
- Backend pro generování kódu AMD Radeon GPU (GCN) byl aktualizován, aby podporoval knihovnu libstdc++ a byla přidána podpora experimentálního generování kódu pro řadu zařízení gfx9-generic, gfx10-3-generic a gfx11-generic.
- Backend x86 nyní podporuje rozšíření architektury instrukční sady Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Přidána podpora pro procesory Intel Diamond Rapids a Xeon Phi.
- Rozšířené možnosti backendu pro platformy LoongArch a AVR.
- Odebrána podpora pro cílovou architekturu nios2 používanou v procesorech Nios II. Podpora pro ILP32 ABI (-mabi=ilp32) v portu AArch64 byla zastaralá a bude odstraněna v příští hlavní verzi.
Zdroj: opennet.ru
