Po roku vývoja bol zverejnený vydanie voľného súboru kompilátorov GCC 16.1, prvé významné vydanie v novej vetve GCC 16.x. V súlade s schémou číslovania vydaní, verzia 16.0 bola použitá v priebehu vývoja, a krátko pred vydaním GCC 16.1 sa už odvetvila vetva GCC 17.0, na báze ktorej bude vytvorená nasledujúca významná verzia GCC 17.1.
Hlavné zmeny:
- Predvolený režim pre jazyk C++ bol prepnútý na používanie štandardu C++20 (dialekt GNU C++20, -std=gnu++20) namiesto predtým navrhnutého C++17. Implementácia C++20 v štandardnej knižnici bola vyhlásená za stabilnú.
- Do súboru bol zahrnutý experimentálny frontend ga68 pre kompiláciu programov v programovacom jazyku Algol 68.
- Pridaná možnosť výstupu diagnostických informácií vo formáte HTML. Rozšírené informácie o priebehu programu, zahrnuté pri výstupe diagnostiky vo formáte SARIF, založenom na JSON (podpora „-fdiagnostics-format=json“ bola ukončená).
- Rozšírené optimalizácie v štádiu prepojenia (LTO, Link-Time Optimization). Pridaná možnosť „-flto-toplevel-asm-heuristics“, ktorá zahrnuje heuristiku na zlepšenie optimalizácie kódu s assemblerovými vložkami. Technika spekulatívnej devírtualizácie (-fdevirtualize-speculatively) už nie je obmedzená na transformáciu virtuálnych metód a môže sa aplikovať pri transformácii na priame volania akýchkoľvek nepriamych volaní funkcií, napríklad volaní cez ukazovatele.
- Realizovaná podpora vektorizácie cyklov, pre ktoré nie je v čase kompilácie známe číslo iterácií. Zvýšená efektivita spracovania predčasných výstupov z cyklu (napríklad cez break).
- Bola pridaná experimentálna podpora mnohých možností nedávno schváleného štandardu C++26. Napríklad, realizované:
- Reflexia (Reflection, „-freflection“), ktorá umožňuje sledovať a modifikovať prvky programu v štádiu kompilácie. Pridané nové operátory „^^ (open-std.org)“ na získanie metainformácií o gramatickej konštrukcii a „[:…:]“ na vykonanie spätnej transformácie. Na transformáciu a spracovanie získaných informácií počas inšpekcie bola navrhnutá knižnica std::meta a sú k dispozícii také možnosti, ako sú výpočty s konštantami.
- Zmluvné programovanie (Contracts), ktoré umožňuje definovať formálne špecifikácie rozhraní pomocou troch nových operátorov: pre (predpoklad), post (popre) a contract_assert (kontrola tvrdenia). Operátor „pre“ určuje predpoklady, ktoré musia byť splnené pred volaním (kontrola vstupných údajov); „post“ — podmienky, ktoré musia byť splnené po vykonaní (požiadavky na výstupné údaje); contract_assert — podmienky vzniku výnimiek. Možnosť sa objaví v GCC 16.
- Operátor „template for“ na prechádzanie prvkami, ako sú balíky parametrov, podobné n-ticovým objektom a výsledky reflexie (metaobjekty), počas kompilácie v štýle bežného cyklu. Pri vykonávaní „template for“ sa telo cyklu rozširuje pre každý prvok a každá iterácia sa spracováva v samostatnej oblasti viditeľnosti, v ktorej je prvok sekvencie, po ktorej sa iteruje, konštantou pre každú iteráciu a môže sa zúčastniť v konštantných výrazových (constexpr) operáciách. V kontexte reflexie sa „template for“ môže použiť na prechod cez vlastnosti tried alebo enumerácií.
- Knižnica std::simd na paralelizáciu vykonávania operácií nad údajmi pomocou súborov inštrukcií SIMD, ako sú AVX-512 a NEON, s použitím štandardného typového systému C++.
- Knižnice std::inplace_vector, std::optional<T&>, std::copyable_function, std::function_ref, std::indirect, std::polymorphic a std::owner_equal.
- Boli implementované funkcie súvisiace s normou C++23, ako napríklad explicitné riadenie životnosti objektov a podpora určenie kódovania znakov diagnostických správ.
- Bola rozšírená podpora normy C23 (opennet.ru), napríklad bola implementovaná možnosť používania atribútu „counted_by“ na kontrolu správneho používania ukazovateľov.
- Pokračuje implementácia noriem 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 zdieľanou pamäťou a blokmi vektorizácie (SIMD). Vylepšená implementácia špecifikácií paralelného programovania OpenACC 3.0, 3.3 a 3.4, ktoré definujú prostriedky na presun operácií (offloading) na GPU a špecializované procesory, ako sú NVIDIA PTX.
- Do backendu pre architektúru x86 bola pridaná podpora procesorov AMD založených na mikroarchitektúre Zen6 (-march=znver6), ako aj procesorov Intel Wildcat Lake (-march=wildcatlake) a Nova Lake (-march=novalake).
- V backendovej generácii kódu pre GPU AMD Radeon (GCN) je implementovaná podpora akcelerátorov AMD Instinct MI300 (gfx942).
- Pre architektúry RISC-V, ARM, S/390 a LoongArch je implementovaná podpora typu „_BitInt (N)“ na definovanie celých čísel so špecifikovaným počtom bitov.
Zdroj: linux.org.ru
