Po letu razvoja objavljen izdanje slobodnog skupa kompajlera GCC 16.1, prvo značajno izdanje u novoj grani GCC 16.x. U skladu sa shema numeracije izdanja, verzija 16.0 korišćena je u procesu razvoja, a nedugo pre izlaska GCC 16.1 već se odvojila grana GCC 17.0, na osnovu koje će biti formirano sledeće značajno izdanje GCC 17.1.
Glavne spremembe:
- Podrazumevani režim za jezik C++ prebačen je na korišćenje standarda C++20 (GNU C++20 dijalekat, -std=gnu++20) umesto ranije predloženog C++17. Implementacija C++20 u standardnoj biblioteci proglašena je stabilnom.
- Uključen je eksperimentalni frontend ga68 za kompajliranje programa na programskom jeziku Algol 68.
- Dodana je mogućnost prikazivanja dijagnostičkih informacija u HTML formatu. Proširene su informacije o toku izvršavanja programa, uključene pri prikazivanju dijagnostike u formatu SARIF, zasnovanom na JSON-u (podrška za „-fdiagnostics-format=json“ obustavljena).
- Proširene su optimizacije u fazi povezivanja (LTO, Link-Time Optimization). Dodata je opcija „-flto-toplevel-asm-heuristics“, koja uključuje heuristiku za poboljšanje optimizacije koda sa asemberskim umetanjima. Tehnika spekulativne devirtualizacije (-fdevirtualize-speculatively) sada nije ograničena na transformaciju virtuelnih metoda i može se primenjivati prilikom transformacije u direktne pozive bilo kojih indirektnih poziva funkcija, na primer, poziva putem pokazivača.
- Implementirana je podrška za vektorizaciju petlji, za koje na fazi kompajliranja nije poznat broj iteracija. Povećana je efikasnost obrade preuranjenih izlaza iz petlje (na primer, putem break).
- Dodana eksperimentalna podpora mnogo možnosti nedavno usvojenog standarda C++26. Na primer, implementirani su:
- Refleksija (Reflection, „-freflection“), koja omogućava praćenje i modifikaciju elemenata programa u fazi kompajliranja. Dodati su novi operatori „^^ (open-std.org)“ za dobijanje metainformacija o gramatičkoj konstrukciji i „[:…:]“ za izvršavanje obrnutog transformisanja. Za transformaciju i obradu informacija dobijenih tokom inspekcije predložena je biblioteka std::meta i dostupne su mogućnosti kao što su proračuni sa konstantama.
- Ugovorno programiranje (Contracts), ki omogoča določitev formalnih specifikacij vmesnikov z uporabo treh novih operatorjev: pre (predpogoji), post (poslepogoji) in contract_assert (preverjanje trditev). Operator „pre“ določa predpogoje, ki jih je treba izpolniti pred klicanjem (preverjanje vhodnih podatkov); „post“ – pogoje, ki jih je treba izpolniti po izvedbi (zahteve za izhodne podatke); contract_assert – pogoje za pojav izjem. Možnost se bo pojavila v GCC 16.
- Operator „template for“ za izvajanje iteracije čez elemente, kot so paketi parametrov, podobni tuplom, objekti in rezultati refleksije (metaobjekti), v fazi prevajanja v slogu običajnega cikla. Pri izvedbi „template for“ se telo cikla razširi za vsak element, vsaka iteracija pa se obdela v ločeni vidnosti, kjer je element zaporedja, čez katerega se iterira, konstanta za vsako iteracijo in lahko sodeluje v konstantnih izrazih (constexpr). V kontekstu refleksije se „template for“ lahko uporablja za prehod čez lastnosti razredov ali enumeracij.
- Knjižnica std::simd za paralelizacijo izvedbe operacij nad podatki z uporabo nizov SIMD ukazov, kot sta AVX-512 in NEON, z uporabo standardnega sistema tipov C++.
- Knjižnice std::inplace_vector, std::optional<T&>, std::copyable_function, std::function_ref, std::indirect, std::polymorphic in std::owner_equal.
- Izvedene so bile funkcionalnosti, povezane s standardom C++23, kot so izrecno upravljanje življenjske dobe objektov in podpora natančna določitev kodiranja znakov diagnostičnih sporočil.
- Razširjena podpora za standard C23 (opennet.ru), na primer, uvedena je bila možnost uporabe atributa „counted_by“ za preverjanje pravilne uporabe kazalcev.
- Nadaljuje se izvedba standardov OpenMP 5.0, 5.1, 5.2 in 6.0 (Open Multi-Processing), ki določajo API in načine za uporabo metod paralelnega programiranja na večjedrnih in hibridnih (CPU+GPU/DSP) sistemih z deljeno pomnilnikom in bloki vektorizacije (SIMD). Izboljšano izvedba specifikacij paralelnega programiranja OpenACC 3.0, 3.3 in 3.4, ki določajo sredstva za prenos operacij (offloading) na GPU in specializirane procesorje, kot je NVIDIA PTX.
- V backend za arhitekturo x86 je bila dodana podpora za procesorje AMD, zasnovane na mikroarhitekturi Zen6 (-march=znver6), pa tudi za procesorje Intel Wildcat Lake (-march=wildcatlake) in Nova Lake (-march=novalake).
- V backendu za generiranje kode za GPU AMD Radeon (GCN) je implementirana podpora za acceleratorje AMD Instinct MI300 (gfx942).
- Za arhitekture RISC-V, ARM, S/390 in LoongArch je implementirana podpora za tip „_BitInt (N)“ za določanje celih števil z določenim številom bitov.
Izvor: linux.org.ru
