Vydání balíku kompilátorů GCC 15

Po roce vývoje byl vydán svobodný set kompilátorů GCC 15.1, první významné vydání v nové větvi GCC 15.x. V souladu s číslicovým schématem vydání byla verze 15.0 používána během vývoje, a krátce před vydáním GCC 15.1 již byla odštěpena větev GCC 16.0, na jejímž základě bude vytvořeno další významné vydání GCC 16.1.

Hlavní změny:

  • Při kompilaci programů v jazyce C je ve výchozím nastavení použit standard C23 (přehled změn) s rozšířeními GNU („-std=gnu23“). Dříve byl ve výchozím nastavení používaný standard C17 — „-std=gnu17“. Tato změna může potenciálně způsobit problémy při sestavování stávajících projektů kvůli zavedení konstanty nullptr, typu _BitInt(n) a klíčových slov bool, true a false, které mohou kolidovat s identifikátory stejného jména definovanými v aplikacích.
  • Byly implementovány možnosti standardu C23:
    • Direktiva „#embed“, určená k vkládání binárních zdrojů do kódu.
    • Atribut „unsequenced“, signalizující, že výsledek nezávisí na pořadí vykonávání.
    • Atribut „reproducible“, udávající, že funkce vždy vrací stejný výsledek při stejných vstupních datech, t.j. nezávisí na jiných faktorech.
  • Byly implementovány prvky budoucího standardu C2Y (-std=c2y a -std=gnu2y):
    • Možnost deklarace proměnných v příkazu „if“, například „if (int x = get ()) {…}“.
    • Podpora pojmenovávání cyklů pro odkazování na ně v kódu. outer: for (int i = 0; i < IK; ++ i) { switch (i) { case 1: break; // jumps to CONT1 case 2: break outer; // jumps to CONT2 } // CONT1 } // CONT2
    • Podpora specifikace rozsahů celých čísel ve výrazích „case“, například „case 1 … 10:“.
    • Sufixy „i“ a „j“ pro označení imaginární části v komplexních číslech.
    • Možnost použití operátorů „++“ a „—“ s komplexními čísly.
    • Konstrukce „_Generic(type, expr1, expr2, …)“ pro výběr výrazu na základě typu operand.
    • Podpora zpracování bytových polí jako jiných typů objektů, jako jsou struktury a unie.
    • Podpora použití operátoru „alignof“ pro neúplná pole (deklarovaná bez specifikace velikosti, například „int a[]“).
    • Byl přidán nový syntax pro osmické, hexadecimální a univerzální escape sekvence znaků. Místo „\u“, „\x“ a „\nnn“ byly navrženy sekvence „\u{}“, „\o{}“ a „\x{}“, v nichž lze uvádět libovolný počet číslic.
    • Vestavěné funkce „__builtin_stdc_rotate_left“ a „__builtin_stdc_rotate_right“.
    • Byly povoleny operace s nulovou délkou na ukazatelích NULL (např. „sizeof(*p)“).
  • Ve front-endu pro jazyk C++ byly implementovány možnosti, které jsou rozvíjeny pro budoucí standard C++26:
    • Variabilní operátor „friend“ („friend Ts…“).
    • Možnost použití klíčového slova „constexpr“ se variantou operátoru „new“ (placement new) pro umístění objektu do předem alokované paměti během kompilace.
    • Výstup chyby při odstraňování ukazatele na neúplný typ.
    • Byla prohlášena za zastaralou syntaxe definice variabilních parametrů s třemi tečkami bez předchozí čárky (například, když je uvedeno „void e(int…)“ místo „void e(int, …)“).
    • Indexování balíčku parametrů v šablonách.
    • Atributy pro strukturované vazby;
    • Syntaxe „= delete(„důvod“);“;
    • Začlenění „@“, „$“ a „`“ do základní množiny znaků.
    • Použití makra pro deklaraci modulů je zakázáno.
    • Možnost aplikace strukturovaného vazby (structured binding) jako podmínky v operátorech if a switch.
    • Byla zastavena podpora přímého porovnávání polí (např. „int arr1[5]; int arr2[5]; bool same = arr1 == arr2“).
    • Mechanismus „#embed“ pro začlenění binárních zdrojů.
    • Byla prohlášena za zastaralou šablonová třída is_trivial.
  • Byly přidány možnosti C++23:
    • Zákaz některých použití direktivy „export“ a povolení použití „export {}“.
    • Podpora prodloužení životnosti dočasných objektů v cyklech „for“, které procházejí rozsahy.
  • V knihovně libstdc++ byla provedena experimentální podpora modulů std a std.compat.
  • Použití inicializátoru „{0}“ pro unie v kódu C a C++ nyní nezaručuje vymazání veškerého obsahu, ale vede k nulování prvního prvku unie. Pro vymazání celé unie by mělo být použito výraz „{}“, definované ve specifikaci C23, nebo by měla být uvedena volba „-fzero-init-padding-bits=unions“ pro obnovení starého chování.
  • Byla zavedena podpora atributu „musttail“ ([[gnu::musttail]] a [[clang::musttail]]) pro garantované tail volání. Atribut se používá u výrazů return, ve kterých dochází k rekurzivnímu volání aktuální funkce, a zaručuje, že takové volání bude používat tail rekurzi, při které se nealokuje další paměť na zásobníku (vylučuje riziko vyčerpání paměti při velmi vysokém počtu volání).
  • Byla implementována podpora atributu flag_enum ([[gnu::flag_enum]] a [[clang::flag_enum]]), který se používá u výčtů k indikaci, že se obsah používá v bitových operacích (vylučuje výstup varování v režimu „-Wswitch“).
  • Byla přidána podpora atributu „counted_by“, pomocí kterého lze určit pole ve struktuře s flexibilním polem, které definuje počet prvků. Atribut může být použit ke zvýšení efektivity kontrol přetečení bufru.
  • Byl přidán atribut „nonnull_if_nonzero“ pro funkce, který určuje, že některé parametry funkce s ukazateli mohou přijmout hodnotu NULL, pouze pokud je jiný parametr roven nule.
  • Bylo povoleno používat rozšířené assemblerové vložky „asm (…)“ mimo funkce. V assemblerových vložkách je povoleno přepisovat paměť v červené zóně zásobníku (oblastech na vrcholu zásobníku).
  • Kompilace kódu v C++ byla zrychlena díky vylepšenému hashování šablon.
  • Byly přidány nové optimalizace. Byla implementována podpora vektorizace smyček, které obsahují kód pro předčasné vystoupení (např. prostřednictvím volání break nebo return), i když tyto smyčky manipulují s dynamicky přidělovanými poli nebo buffery, jejichž velikost není známa v době kompilace. Při zadání volby „-O2“ je povolena vektorizace některých snadno vektorizovatelných smyček, pro které nejsou k dispozici informace o počtu iterací (tripcount).
  • Byl přidán režim inkrementální optimalizace při fázi slučování (LTO, Link-Time Optimization), který výrazně zkracuje čas rekompilace při použití LTO v situacích, kdy byly provedeny drobné změny v kódu (upravena jedna funkce). Pro zahrnutí inkrementálního režimu byla navržena volba „-flto-incremental“.
  • Byla vylepšena kompilace velmi velkých vstupních souborů. Bylo implementováno sledování čísel sloupců přesahujících 4096. Byla zvýšena přesnost určení umístění chyb a varování ve velmi velkých souborech.
  • Byla zlepšena přehlednost zpráv při diagnostice problémů. Například byl zajištěn výběr místa vzniku problému symboly „⚠️“, byla změněna struktura výstupu při chybách v šablonách C++, byly přidány tipy pro usnadnění přechodu na standard C23 a byla přepracována barevná schéma. Byla přidána možnost výstupu diagnostiky ve formátu Sarif (-fdiagnostics-format=sarif-file).
  • Byla implementována knihovna libgdiagnostics, která umožňuje integrovat do projektů funkce GCC související s formátováním diagnostických zpráv (například je možné využít nástroje pro citace, zvýraznění a tipy na opravy).
  • Byly přidány varování „-Wtrailing-whitespace“ a „-Wleading-whitespace“ pro odhalování zbývajících mezer na konci řádků a nadbytečných mezer na začátku řádků.
  • Bylo přidáno varování „-Wheader-guard“ pro informování o problémech s makry strážícími hlavičkový soubor a zabraňujícími opětovnému zahrnutí hlavičkového souboru.
  • Frontend pro jazyk D byl aktualizován na verzi 2.111.0.
  • Frontend pro jazyk Fortran byl rozšířen o podporu nezáporných celých čísel.
  • Byl zahrnut kompilátor pro jazyk COBOL — gcobol, který podporuje platformy x86-64 a AArch64 a není určen pro použití na 32-bitových systémech. Kompilátor implementuje specifikaci ISO/IEC 1989:2023 a prochází většinou testů NIST CCVS/85.
  • Pokračuje implementace standardů OpenMP 5.0, 5.1, 5.2 a 6.0 (Open Multi-Processing), které definují API a způsoby použití metod paralelního programování na vícejádrových a hybridních (CPU+GPU/DSP) systémech se sdílenou pamětí a vektorovými bloky (SIMD). Byla přidána podpora metadirektiv a konstrukcí tile, unroll, interop a dispatch. Pro některé GPU od AMD a NVIDIA byla přidána podpora unifikované sdílené paměti (zapíná se použitím unified_shared_memory v direktivě „requires“). Byla přidána podpora výrazu „self_maps“.
  • Do backendu pro architekturu AArch64 byla přidána podpora platformy MinGW (aarch64-w64-mingw32). Bylo implementováno více než 20 rozšíření ARM8 a zlepšena podpora rozšíření ACLE (Arm C Language Extensions). Bylo provedeno mnoho vylepšení v generátoru kódu. Byla přidána podpora CPU:
    • 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)
  • V backendu generace kódu pro GPU AMD Radeon (GCN) byla implementována podpora knihovny libstdc++ a přidána experimentální podpora generace kódu pro série zařízení gfx9-generic, gfx10-3-generic a gfx11-generic.
  • Do backend architecture x86 byla přidána podpora rozšíření architektury instrukční sady Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Byla přidána podpora CPU Intel Diamond Rapids a Xeon Phi.
  • Možnosti backendů pro platformy LoongArch a AVR byly rozšířeny.
  • Byla odstraněna podpora cílové architektury nios2, používané v procesorech Nios II. Podpora ABI ILP32 (-mabi=ilp32) v portu pro AArch64 byla vyhlášena za zastaralou a bude odstraněna v příštím významném vydání.

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster