Vydání sady kompilátorů GCC 15

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

Kupte si spolehlivý hosting pro stránky s DDoS ochranou, VPS VDS servery 🔥 Kupte si spolehlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster