Uvoľnenie súboru kompilátorov GCC 15

Po roku vývoja bol zverejnený uvoľnenie voľného súboru kompilátorov GCC 15.1, prvé významné vydanie v novej vetve GCC 15.x. Podľa schémy číslovania vydaní bola verzia 15.0 použitá v procese vývoja a krátko pred vydaním GCC 15.1 sa už odvetvila vetva GCC 16.0, na základe ktorej bude vytvorené ďalšie významné vydanie GCC 16.1.

Hlavné zmeny:

  • Pri kompilácii programov v jazyku C je predvolene použitý štandard C23 (prehľad zmien) s rozšíreniami GNU („-std=gnu23“). Predtým bol predvolene používaný štandard C17 — „-std=gnu17“. Zmena môže potenciálne spôsobiť problémy pri zostavovaní existujúcich projektov kvôli zaradeniu konštanty nullptr, typu _BitInt(n) a kľúčových slov bool, true a false, ktoré môžu kolidovať s rovnomennými identifikátormi určenými v aplikáciách.
  • Bol implementovaný štandard C23:
    • Direktíva „#embed“, určená na vkladanie do kódu binárnych prostriedkov.
    • Atribút „unsequenced“, signalizujúci, že výsledok nezávisí od poradia vykonávania.
    • Atribút „reproducible“, uvádzajúci, že funkcia vždy vracia rovnaký výsledok pri identických vstupných údajoch, t.j. nezávisí od iných faktorov.
  • Implementované prvky budúceho štandardu C2Y (-std=c2y a -std=gnu2y):
    • Možnosť vyhlásenia premenných v operátore „if“, napríklad „if (int x = get ()) {…}“.
    • Podpora priraďovania názvov cyklom, aby sa na ne dalo odkazovať v kóde. outer: for (int i = 0; i < IK; ++ i) { switch (i) { case 1: break; // preskočí na CONT1 case 2: break outer; // preskočí na CONT2 } // CONT1 } // CONT2
    • Podpora uvádzania intervalov celých čísel vo výrazoch „case“, napríklad „case 1 … 10:“.
    • Sufixy „i“ a „j“ na označenie predstavenej časti v komplexných číslach.
    • Možnosť používania operátorov „++“ a „—“ s komplexnými číslami.
    • Konštrukcia „_Generic(type, expr1, expr2, …)“ na výber výrazu na základe typu operandu.
    • Podpora prístupu k bajtovým poliam ako k iným typom objektov, ako sú štruktúry a zlučeniny.
    • Podpora aplikovania operátora „alignof“ na neúplné polia (vyhlásené bez určenia veľkosti, napríklad „int a[]“).
    • Bol nový syntax pre osmičkové, hexadecimálne a univerzálne escape sekvencie znakov. Namiesto „\u“, „\x“ a „\nnn“ sa navrhujú sekvencie „\u{}“, „\o{}“ a „\x{}“, v ktorých je možné uviesť ľubovoľný počet číslic.
    • Vstavané funkcie „__builtin_stdc_rotate_left“ a „__builtin_stdc_rotate_right“.
    • Povolené operácie s nulovou dĺžkou na ukazovateľoch NULL (napríklad „sizeof(*p)“).
  • Na frontend pre jazyk C++ boli implementované možnosti, ktoré sa vyvíjajú pre budúci štandard C++26:
    • Variabilný operátor „friend“ („friend Ts…“).
    • Možnosť použitia kľúčového slova „constexpr“ s variantom operátora „new“ (placement new) na umiestnenie objektu do vopred pridelenej pamäte počas kompilácie.
    • Zobrazenie chyby pri odstraňovaní ukazovateľa na neúplný typ.
    • Vyhlásený za zastaraný syntax definovania variabilných parametrov s trochou bez predchádzajúcej čiarky (napríklad, keď sa uvádza „void e(int…)“ namiesto „void e(int, …)“).
    • Indexovanie balíka parametrov v šablónach.
    • Atribúty pre štruktúrované viazania;
    • Syntax ‚= delete(„dôvod“);‘
    • Zahrnutie „@“, „$“ a „`“ do základného znakového súboru.
    • Zakázané používanie makier na vyhlásenie modulov.
    • Možnosť aplikácie štruktúrovaného viazania (structured binding) ako podmienky v operátoroch if a switch.
    • Podpora priameho porovnávania polí (napríklad „int arr1[5]; int arr2[5]; bool same = arr1 == arr2“) bola ukončená.
    • Mechanizmus „#embed“ na vloženie binárnych zdrojov.
    • Vyhlásený za zastaraný šablónový trieda is_trivial.
  • Pridané možnosti C++23:
    • Zákaz niektorých aplikácií smernice „export“ a povolenie používať „export {}“.
    • Podpora predĺženia životnosti dočasných objektov v cykloch „for“, ktoré prechádzajú rozsahmi.
  • V knižnici libstdc++ bola implementovaná experimentálna podpora modulov std a std.compat.
  • Použitie inicializátora „{0}“ pre unie v kóde jazyka C a C++ teraz nezaručuje vyčistenie celého obsahu, ale vedie k nulovaniu prvého prvku unie. Na vyčistenie celej unie by sa malo použiť výrazy „{}“, definované v špecifikácii C23, alebo uviesť možnosť „-fzero-init-padding-bits=unions“ na obnovenie starého správania.
  • Bol podporený atribút „musttail“ ([[gnu::musttail]] a [[clang::musttail]]) pre garantované chvostové volania. Atribút sa aplikuje na výrazy return, v ktorých sa vykonáva rekurzívne volanie aktuálnej funkcie, a zabezpečuje, že takéto volanie využije chvostovú rekurziu, pri ktorej sa nealokuje ďalšia pamäť na zásobníku (vylučuje riziko prečerpania pamäte pri veľmi veľkom počte volaní).
  • Bol podporený atribút flag_enum ([[gnu::flag_enum]] a [[clang::flag_enum]]), ktorý sa aplikuje na enumerácie na indikáciu, že obsah sa používa v bitových operáciách (vylučuje výstup varovania v režime „-Wswitch“).
  • Pridaná podpora atribútu „counted_by“, prostredníctvom ktorého je možné určiť pole v štruktúre s flexibilným poľom, ktoré definuje počet prvkov. Atribút môže slúžiť na zvýšenie efektivity kontrol výstupu za hranicu bufferu.
  • Pre funkcie bol pridaný atribút „nonnull_if_nonzero“, ktorý určuje, že niektoré parametre funkcie s ukazovateľmi môžu prijať hodnotu NULL, len ak je iný parameter rovný nule.
  • Povolené použitie rozšírených assemblerových vkladov „asm (….)“ mimo funkcií. V assemblerových vkladoch je povolené prepísať pamäť v červenej zóne zásobníka (oblasť na vrchole zásobníka).
  • Kompilácia kódu v C++ bola urýchlená vďaka vylepšenému hashovaniu šablón.
  • Pridané nové optimalizácie. Realizovaná podpora vektorizácie cyklov, v ktorých je kód pre predčasný výstup (napríklad prostredníctvom volania break alebo return), aj keď takéto cykly manipulujú s dynamicky alokovanými poľami alebo bufferami, ktorých veľkosť nie je známa v čase kompilácie. Pri uvedení voľby „-O2“ je zahrnutá vektorizácia niektorých ľahko vektorizovateľných cyklov, pre ktoré chýbajú informácie o počte iterácií (tripcount).
  • Pridaný režim inkrementálnej optimalizácie v štádiu prepojovania (LTO, Link-Time Optimization), ktorý výrazne skracuje čas rekompilácie pri použití LTO v situáciách, keď boli vykonané drobné zmeny v kóde (upravená jedna funkcia). Na zapnutie inkrementálneho režimu bola navrhnutá voľba „-flto-incremental“.
  • Vylepšená kompilácia veľmi veľkých vstupných súborov. Realizované sledovanie čísel stĺpcov presahujúcich 4096. Zvýšená presnosť určenia miesta výskytu chýb a upozornení vo veľmi veľkých súboroch.
  • Zvýšená prehľadnosť správ pri diagnostike problémov. Napríklad, zabezpečené zvýraznenie miesta vzniku problému symbolom „⚠️“, zmenená kompozícia výstupu pri chybách v šablónach C++, pridané tipy na zjednodušenie prechodu na štandard C23, prepracovaná farebná schéma. Pridaná možnosť výstupu diagnostiky vo formáte Sarif (-fdiagnostics-format=sarif-file).
  • Realizovaná knižnica libgdiagnostics, ktorá umožňuje integrovať do svojich projektov možnosti GCC súvisiace s formátovaním diagnostických správ (napríklad, je možné využívať prostriedky citovania, zvýraznenia a tipov na opravu).
  • Pridané upozornenia „-Wtrailing-whitespace“ a „-Wleading-whitespace“ na identifikáciu zvyškových medzier na konci riadkov a nadbytočných medzier na začiatku riadkov.
  • Pridané upozornenie „-Wheader-guard“ na informovanie o problémoch v makrách ochrany hlavičkových súborov, ktoré bránia opakovanému zahrnutiu hlavičkového súboru.
  • Frontend pre jazyk D bol aktualizovaný na verziu 2.111.0.
  • Vo frontend pre jazyk Fortran bola pridaná podpora bezznamenných celých čísel.
  • Do súboru bol pridaný kompilátor pre jazyk COBOL — gcobol, ktorý podporuje platformy x86-64 a AArch64, a nie je určený na použitie na 32-bitových systémoch. Kompilátor realizuje špecifikáciu ISO/IEC 1989:2023 a prechádza väčšinou testov NIST CCVS/85.
  • Pokračuje realizácia štandardov OpenMP 5.0, 5.1, 5.2 a 6.0 (Open Multi-Processing), ktoré definujú API a spôsoby aplikácie metód paralelného programovania na viacjadrových a hybridných (CPU+GPU/DSP) systémoch s dátovou pamäťou a blokmi vektorizačných príkazov (SIMD). Pridaná podpora metadirektív a konštrukcií tile, unroll, interop a dispatch. Pre niektoré GPU AMD a NVIDIA bola pridaná podpora unifikovanej zdieľanej pamäte (aktívna prostredníctvom príkazu unified_shared_memory v direktíve „requires“). Pridaná podpora výrazu „self_maps“.
  • Do backendu pre architektúru AArch64 bola pridaná podpora platformy MinGW (aarch64-w64-mingw32). Realizovaných viac ako 20 rozšírení ARM8 a zlepšená podpora rozšírenia ACLE (Arm C Language Extensions). Boli vykonané mnohé vylepšenia v generátore kódu. Pridaná 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 generátore kódu na GPU AMD Radeon (GCN) bola implementovaná podpora knižnice libstdc++ a pridaná experimentálna podpora generovania kódu pre zariadenia gfx9-generic, gfx10-3-generic a gfx11-generic.
  • Do backendu pre architektúru x86 bola pridaná podpora rozšírení architektúry súboru inštrukcií Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Pridaná podpora pre CPU Intel Diamond Rapids a Xeon Phi.
  • Možnosti backendov pre platformy LoongArch a AVR boli rozšírené.
  • Podpora cieli architektúry nios2, ktorá sa používa v procesoroch Nios II, bola odstránená. Podpora ABI ILP32 (-mabi=ilp32) v portu pre AArch64 bola vyhlásená za zastaranú a bude odstránená v nasledujúcom významnom vydaní.

Zdroj: opennet.ru

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster