Izdanje paketa kompajlera GCC 15

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

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster