După un an de dezvoltare, a fost lansată versiunea liberă a setului de compilatoare GCC 15.1, prima versiune semnificativă din noul ramură GCC 15.x. Conform schemei de numerotare, versiunea 15.0 a fost utilizată în procesul de dezvoltare, iar cu puțin timp înainte de lansarea GCC 15.1, s-a ramificat deja ramura GCC 16.0, pe baza căreia va fi formulată următoarea lansare semnificativă GCC 16.1.
Modificări principale:
- Atunci când se compilează programe în C, standardul S23 (prezentare generală a modificărilor) cu extensii GNU („-std=gnu23”) este activat implicit. Anterior, standardul implicit a fost C17 — „-std=gnu17”). Această modificare poate duce la probleme în compilarea proiectelor existente din cauza includerii constantelor nullptr, tipului _BitInt(n) și cuvintelor cheie bool, true și false, care pot intra în conflict cu identificatorii omonimi definiți în aplicații.
- Sunt implementate funcționalitățile standardului C23:
- Directiva „#embed”, destinat să încorporeze resurse binare în cod.
- Atributul „unsequenced”, semnalizând că rezultatul nu depinde de ordinea de execuție.
- Atributul „reproducible”, indicând că funcția returnează întotdeauna același rezultat pentru aceleași date de intrare, adică nu depinde de alți factori.
- Sunt implementate elemente ale viitorului standard C2Y (-std=c2y și -std=gnu2y):
- Posibilitatea declarării variabilelor în operatorul „if”, de exemplu, „if (int x = get ()) {…}.”
- Suport pentru atribuirea de nume buclelor pentru a se referi la ele în cod. 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
- Suport pentru specificarea intervalelor de valori întregi în expresiile „case”, de exemplu, „case 1 … 10:”.
- Sufixele „i” și „j” pentru a indica partea imaginară în numere complexe.
- Posibilitatea utilizării operatorilor „++” și „—” cu numere complexe.
- Construcția „_Generic(type, expr1, expr2, …)” pentru selectarea expresiei pe baza tipului operandului.
- Suport pentru accesarea tablourilor de octeți ca la alte tipuri de obiecte, cum ar fi structuri și uniuni.
- Suport pentru aplicarea operatorului „alignof” la tablouri incomplete (declarate fără a specifica dimensiunea, de exemplu, „int a[]”).
- A fost adăugat un nou sintaxă pentru secvențele de escape în octal, hexazecimal și universal. În loc de «\u», «\x» și «\nnn», sunt propuse secvențele «\u{}», «\o{}» și «\x{}», în care pot fi specificate un număr arbitrar de cifre.
- Funcții încorporate «__builtin_stdc_rotate_left» și «__builtin_stdc_rotate_right».
- Sunt permise operații cu lungime zero pe pointerii NULL (de exemplu, «sizeof(*p)»).
- În frontendul pentru limbajul C++, au fost implementate funcționalități dezvoltate pentru viitorul standard C++26:
- Operatorul variadic «friend» («friend Ts…»).
- Posibilitatea de a folosi cuvântul cheie «constexpr» cu varianta operatorului «new» (placement new) pentru a plasa un obiect în memorie alocată anterior în timpul compilării.
- Afișarea erorii la ștergerea unui pointer către un tip incomplet.
- A fost declarat ca fiind învechit sintaxa de definire a parametrilor variabili cu trei puncte fără o virgulă anterioară (de exemplu, când se specifică «void e(int…)» în loc de «void e(int, …)».
- Indexarea pachetului de parametrii în șabloane.
- Atribute pentru legături structurale;
- Sintaxa ‘= delete(«motiv»)’;
- Includerea «@», «$» și «`» în setul de caractere de bază.
- Utilizarea macrocomenzilor pentru a declara module este interzisă.
- Posibilitatea aplicării legării structurate (structured binding) ca condiție în operatorii if și switch.
- Suportul pentru compararea directă a masivelor a fost sistat (de exemplu, «int arr1[5]; int arr2[5]; bool same = arr1 == arr2»).
- Mecanismul «#embed» pentru încorporarea resurselor binare.
- A fost declarat ca fiind învechit clasa template is_trivial.
- Au fost adăugate capabilitățile C++23:
- Interzicerea unor aplicații ale directivei «export» și permiterea utilizării «export {}».
- Suportul pentru prelungirea duratei de viață a obiectelor temporare în bucle «for» care iterează peste intervale.
- În biblioteca libstdc++ a fost implementat suport experimental pentru modulele std și std.compat.
- Folosirea inițializatorului «{0}» pentru uniuni în codul C și C++ nu mai garantează curățarea întregului conținut, ci duce la zeroarea primului element al uniunii. Pentru a curăța întreaga uniune, ar trebui folosit expresia «{}», definită în specificația C23, sau opțiunea «-fzero-init-padding-bits=unions» pentru a restaura comportamentul anterior.
- A fost implementat suportul pentru atributul «musttail» ([[gnu::musttail]] și [[clang::musttail]]) pentru apeluri tail garantate. Atributul se aplică expresiilor return, în care se realizează un apel recursiv al funcției curente și garantează că un astfel de apel va utiliza recursia tail, care nu alocă memorie suplimentară în stivă (excluzând riscul de epuizare a memoriei la un număr foarte mare de apeluri).
- A fost implementat suportul pentru atributul flag_enum ([[gnu::flag_enum]] și [[clang::flag_enum]]), folosit pentru enumerații pentru a indica faptul că conținutul este utilizat în operații bitwise (excluzând afișarea unui avertisment în modul „-Wswitch”).
- A fost adăugat suportul pentru atributul „counted_by”, prin care se poate specifica un câmp din structură cu un array flexibil, care definește numărul de elemente. Atributul poate fi utilizat pentru a îmbunătăți eficiența verificărilor de depășire a buffer-ului.
- Pentru funcții a fost adăugat atributul „nonnull_if_nonzero”, care definește că anumiți parametri ai funcției cu pointeri pot accepta valoarea NULL, doar dacă un alt parametru este egal cu zero.
- Este permisă utilizarea inserțiilor de asamblare extinse „asm (….)” în afara funcțiilor. În inserțiile de asamblare este permisă suprascrierea memoriei în zona roșie a stivei (zona de vârf a stivei).
- Compilarea codului C++ a fost accelerată datorită îmbunătățirii hashing-ului șabloanelor.
- Au fost adăugate noi optimizări. A fost implementat suportul pentru vectorizarea buclelor care conțin cod pentru ieșirea prematură (de exemplu, prin apelul break sau return), chiar dacă astfel de bucle manipulează array-uri dinamice sau buffere ale căror dimensiuni nu sunt cunoscute în etapa de compilare. Atunci când se specifică opțiunea „-O2”, este activată vectorizarea unor bucle ușor vectorizabile, pentru care nu există informații despre numărul de iterații (tripcount).
- A fost adăugat modul de optimizare incrementală la etapa de legătură (LTO, Link-Time Optimization), care reduce semnificativ timpul de recompilare în situații când s-au făcut modificări minore în cod (a fost editată o funcție). Pentru activarea modului incremental a fost propusă opțiunea „-flto-incremental”.
- Compilarea fișierelor de intrare foarte mari a fost îmbunătățită. A fost implementată urmărirea numerelor de coloană care depășesc 4096. A fost crescută precizia indicării locației erorilor și avertismentelor în fișiere foarte mari.
- A fost îmbunătățită claritatea rapoartelor în diagnosticarea problemelor. De exemplu, a fost asigurat marcajul locului în care apare problema cu simbolul „⚠️”, a fost modificată layout-ul meniului în caz de erori în șabloanele C++, au fost adăugate sugestii pentru simplificarea trecerii la standardul C23, a fost reproiectată schema de culori. A fost adăugată opțiunea de a exporta diagnosticele în format Sarif (-fdiagnostics-format=sarif-file).
- A fost implementată biblioteca libgdiagnostics, care permite integrarea în proiectele proprii a funcționalităților GCC legate de generarea mesajelor de diagnostic (de exemplu, se pot folosi instrumentele de citare, evidențiere și sugestii de corectare).
- Au fost adăugate avertizări «-Wtrailing-whitespace» și «-Wleading-whitespace» pentru a identifica spațiile reziduale de la sfârșitul liniilor și spațiile în exces de la începutul liniilor.
- A fost adăugată avertizarea «-Wheader-guard» pentru a informa despre problemele din macro-urile de protecție a fișierelor header, care previn includerea repetată a fișierului header.
- Frontend-ul pentru limbajul D a fost actualizat la versiunea 2.111.0.
- În frontend-ul pentru limbajul Fortran a fost adăugată suportul pentru numere întregi fără semn.
- A fost inclus compilatorul pentru limbajul COBOL — gcobol, care suportă platformele x86-64 și AArch64 și nu este destinat utilizării pe sisteme de 32 de biți. Compilatorul implementează specificația ISO/IEC 1989:2023 și trece majoritatea testelor NIST CCVS/85.
- A continuat implementarea standardelor OpenMP 5.0, 5.1, 5.2 și 6.0 (Open Multi-Processing), care definesc API și metodele de aplicare a tehnicilor de programare paralelă pe sisteme multi-core și hibride (CPU+GPU/DSP) cu memorie comună și blocuri de vectorizare (SIMD). S-a adăugat suport pentru directivele meta și construcțiile tile, unroll, interop și dispatch. Pentru anumite GPU AMD și NVIDIA a fost adăugat suport pentru memorie unificată partajată (activată prin specificarea unified_shared_memory în directiva «requires»). A fost adăugat suport pentru expresia «self_maps».
- Backend-ul pentru arhitectura AArch64 a fost extins cu suport pentru platforma MinGW (aarch64-w64-mingw32). S-au implementat peste 20 de extensii ARM8 și s-a îmbunătățit suportul pentru extensia ACLE (Arm C Language Extensions). Au fost aduse numeroase îmbunătățiri generatorului de cod. S-a adăugat suport pentru 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)
- În backend-ul generatorului de cod pentru GPU AMD Radeon (GCN) a fost implementat suportul pentru biblioteca libstdc++ și a fost adăugat suport experimental pentru generarea de cod pentru seriile de dispozitive gfx9-generic, gfx10-3-generic și gfx11-generic.
- În backend-ul pentru arhitectura x86 a fost adăugată suportul pentru extensiile setului de instrucțiuni Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. A fost adăugat suportul pentru CPU Intel Diamond Rapids și Xeon Phi.
- Capabilitățile backend-urilor pentru platformele LoongArch și AVR au fost extinse.
- Suportul pentru arhitectura țintă nios2, utilizată în procesoarele Nios II, a fost eliminat. Suportul ABI ILP32 (-mabi=ilp32) în portul pentru AArch64 a fost declarat învechit și va fi eliminat în următoarea versiune majoră.
Sursa: opennet.ro
