Nakon godine dana razvoja objavljeno je izdanje slobodnog seta kompajlera GCC 15.1, prvi značajan izdanak u novoj liniji GCC 15.x. U skladu s shemom numeracije izdanja, verzija 15.0 korištena je tokom razvoja, a nedugo prije izlaska GCC 15.1 već se odvojila grana GCC 16.0, na temelju koje će biti oblikovano sljedeće značajno izdanje GCC 16.1.
Glavne promjene:
- Prilikom kompilacije programa na jeziku C prema zadanim postavkama koristi se standard C23 (pregled promjena) s GNU proširenjima („-std=gnu23”). Ranije se prema zadanim postavkama koristio standard C17 — „-std=gnu17”). Ova promjena može potencijalno dovesti do problema pri gradnji postojećih projekata zbog uključivanja konstante nullptr, tipa _BitInt(n) i ključnih riječi bool, true i false, koji mogu biti u sukobu sa identifikatorima istog imena definiranim u aplikacijama.
- Implementirane su mogućnosti standarda C23:
- Direktiva „#embed“, namijenjena za ugradnju u kod binarnih resursa.
- Atribut „unsequenced“, koji signalizira da rezultat ne ovisi o redoslijedu izvođenja.
- Atribut „reproducible“, koji ukazuje da funkcija uvijek vraća isti rezultat pri istim ulaznim podacima, tj. ne ovisi o drugim faktorima.
- Implementirani su elementi budućeg standarda C2Y (-std=c2y i -std=gnu2y):
- Mogućnost deklaracije varijabli unutar izraza „if”, na primjer, „if (int x = get ()) {…}”.
- Podrška za imenovanje petlji kako bi se na njih moglo referirati u kodu. 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
- Podrška za navođenje raspona cijelih vrijednosti u „case” izrazima, na primjer, „case 1 … 10:”.
- Sufiksi „i” i „j” za označavanje imaginarne komponente u kompleksnim brojevima.
- Mogućnost korištenja operatora „++” i „—” s kompleksnim brojevima.
- Konstukcija „_Generic(type, expr1, expr2, …)” za odabir izraza na temelju tipa operanda.
- Podrška za pristup bajtovnim nizovima kao drugim tipovima objekata, poput struktura i unija.
- Podrška za primjenu operatora „alignof” na nepotpunim nizovima (deklariranim bez navođenja veličine, na primjer, „int a[]”).
- Dodana je nova sintaksa za osmine, heksadecimalne i univerzalne escape sekvence karaktera. Umesto „\u“, „\x“ i „\nnn“ - predložene su sekvence „\u{}“, „\o{}“ i „\x{}“, u kojima se može navesti proizvoljan broj cifara.
- Ugrađene funkcije „__builtin_stdc_rotate_left“ i „__builtin_stdc_rotate_right“.
- Dozvoljene su operacije sa nul-lenth na NULL pokazivačima (na primer, „sizeof(*p)“).
- Na frontend-u za jezik C++ implementirane su mogućnosti koje se razvijaju za budući standard C++26:
- Variativni operator „friend“ („friend Ts…“).
- Mogućnost korišćenja ključne reči „constexpr“ sa varijantom operatora „new“ (placement new) za smeštanje objekta u prethodno alociranu memoriju tokom kompajliranja.
- Izlaz greške prilikom brisanja pokazivača na nepuni tip.
- Proglasan je zastarelo sintaktičko određivanje variativnih parametara sa množenjem bez prethodne zapete (na primer, kada se navodi „void e(int…)“ umesto „void e(int, …)“).
- Indeksiranje paketa parametara u šablonima.
- Atributi za strukturirane veze;
- Sintaksa ‘= delete(„razlog“)’;
- Uključivanje „@“, „$“ i „`“ u osnovni skup simbola.
- Zabranjena upotreba makroa za definisanje modula.
- Mogućnost primene strukturiranog vezivanja (structured binding) kao uslova u operatorima if i switch.
- Prekrašena podrška za direktno poređenje nizova (na primer, „int arr1[5]; int arr2[5]; bool samo = arr1 == arr2“).
- Mehanizam „#embed“ za ugradnju binarnih resursa.
- Proglasan je zastarelo šablonski klasa is_trivial.
- Dodate su mogućnosti C++23:
- Zabrana nekih primena direktive „export“ i dozvola korišćenja „export {}“.
- Podrška za produženje veka trajanja privremenih objekata u petljama „for“, koje prolaze kroz opsege.
- U biblioteci libstdc++ implementirana je eksperimentalna podrška modula std i std.compat.
- Korišćenje inicijalizatora „{0}“ za unije u C i C++ kodu već ne garantuje čišćenje celog sadržaja, već dovodi do nula prvog elementa unije. Za čišćenje cele unije treba koristiti izraz „{}“, definisan u specifikaciji C23, ili navesti opciju „-fzero-init-padding-bits=unions“ za obnavljanje starog ponašanja.
- Implementirana je podrška za atribut "musttail" ([[gnu::musttail]] i [[clang::musttail]]) za garantirane krive pozive. Atribut se primjenjuje na izraze return, u kojima se vrši rekurzivni poziv trenutne funkcije, i jamči da će takav poziv koristiti krivu rekurziju, pri čemu se ne dodjeljuje dodatna memorija na stogu (izostavlja rizik od iscrpljenja memorije pri vrlo velikom broju poziva).
- Implementirana je podrška za atribut flag_enum ([[gnu::flag_enum]] i [[clang::flag_enum]]), koji se primjenjuje na enumeracije za indikaciju da se sadržaj koristi u bitnim operacijama (izostavlja izlaz upozorenja u režimu "-Wswitch").
- Dodana je podrška za atribut "counted_by", putem kojeg se može odrediti polje u strukturi s fleksibilnim nizom koje određuje broj elemenata. Atribut se može koristiti za povećanje učinkovitosti provjera izlaza iz granica bafera.
- Za funkcije je dodan atribut "nonnull_if_nonzero", koji definira da neki parametri funkcije s pokazivačima mogu prihvatiti NULL samo ako je drugi parametar nula.
- Omogućena je upotreba proširenih asembler umetanja "asm (...)" izvan funkcija. U asembler umetanjima dopušteno je prepisivanje memorije u crvenoj zoni stoga (područje na vrhu stoga).
- Kompilacija C++ koda ubrzana je zahvaljujući poboljšanom heširanju predložaka.
- Dodane su nove optimizacije. Implementirana je podrška za vektorizaciju petlji u kojima postoji kod za raniji izlaz (npr. putem poziva break ili return), čak i ako takve petlje manipuliraju dinamički dodijeljenim nizovima ili baferima, čija veličina nije poznata u vrijeme kompajliranja. Kada se navede opcija "-O2", uključena je vektorizacija nekih lako vektorizabilnih petlji, za koje nema informacija o broju iteracija (tripcount).
- Dodan je način inkrementalne optimizacije u fazi povezivanja (LTO, Link-Time Optimization), koji znatno smanjuje vrijeme ponovnog kompiliranja prilikom korištenja LTO u situacijama kada su napravljene manje promjene u kodu (uređena jedna funkcija). Za uključivanje inkrementalnog načina predložena je opcija "-flto-incremental".
- Poboljšana je kompilacija vrlo velikih ulaznih datoteka. Implementirano je praćenje brojeva stupaca koji prelaze 4096. Povećana je točnost označavanja lokacija grešaka i upozorenja u vrlo velikim datotekama.
- Povećana je preglednost izvještaja prilikom dijagnosticiranja problema. Na primjer, problematično mjesto je označeno simbolom „⚠️“, izmijenjen je raspored izlaza pri greškama u C++ predlošcima, dodane su pomoći za olakšavanje prijelaza na standard C23, a redizajnirana je shema boja. Dodana je mogućnost prikaza dijagnostike u Sarif formatu (-fdiagnostics-format=sarif-file).
- Implementirana je biblioteka libgdiagnostics, koja omogućuje integraciju mogućnosti GCC-a vezanih za formatiranje dijagnostičkih poruka u vlastitim projektima (npr. mogu se koristiti alati za citiranje, isticanje i savjeti za ispravak).
- Dodana su upozorenja „-Wtrailing-whitespace” i „-Wleading-whitespace” za identifikaciju viška razmaka na kraju redaka i nepotrebnih razmaka na početku redaka.
- Dodano je upozorenje „-Wheader-guard” za obavještavanje o problemima u makrosima zaštite zaglavlja koji sprečavaju ponovno uključivanje zaglavlja.
- Frontend za jezik D ažuriran je na verziju 2.111.0.
- Frontend za jezik Fortran dodao je podršku za bezznaka cjelobrojna svojstva.
- Uključuje kompajler za jezik COBOL — gcobol, koji podržava x86-64 i AArch64 platforme, a nije namijenjen korištenju na 32-bitnim sustavima. Kompajler implementira specifikaciju ISO/IEC 1989:2023 i prolazi većinu NIST CCVS/85 testova.
- Nastavljena je implementacija standarda OpenMP 5.0, 5.1, 5.2 i 6.0 (Open Multi-Processing), koji definiraju API i metode za primjenu paralelnog programiranja na višezadaćnim i hibridnim (CPU+GPU/DSP) sustavima s dijeljenom memorijom i SIMD vektorskim blokovima. Dodana je podrška za metadirektive te konstrukcije tile, unroll, interop i dispatch. Za neke AMD i NVIDIA GPU-ove dodana je podrška za jedinstvenu dijeljenu memoriju ( aktivira se putem unosa unified_shared_memory u „requires” direktivu). Dodana je podrška za izraz „self_maps”.
- Backend za arhitekturu AArch64 dodao je podršku za MinGW platformu (aarch64-w64-mingw32). Implementirano je više od 20 ARM8 proširenja i poboljšana je podrška za ACLE (Arm C Language Extensions). Unesene su brojne poboljšanja u generatoru koda. Dodana je podrška za 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)
- U backendu za generaciju koda za GPU AMD Radeon (GCN) implementirana je podrška za biblioteku libstdc++ i dodana eksperimentalna podrška za generaciju koda za serije uređaja gfx9-generic, gfx10-3-generic i gfx11-generic.
- U backend za arhitekturu x86 dodana je podrška za proširenja arhitekture skupa instrukcija Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Dodana je podrška za CPU Intel Diamond Rapids i Xeon Phi.
- Proširene su mogućnosti backenda za platforme LoongArch i AVR.
- Uklonjena je podrška za ciljne arhitekture nios2, korištene u procesorima Nios II. Objavljeno je da će podrška ABI ILP32 (-mabi=ilp32) u portu za AArch64 postati zastarjela i bit će uklonjena u sljedećem značajnom izdanju.
Izvor: opennet.ru
