Pas një vit zhvillimi, është publikuar lëshimi i paketës së kompilatorëve të lirë GCC 15.1, lëshimi i parë të rëndësishëm në degën e re GCC 15.x. Sipas skemës së numërimit të lëshimeve, versioni 15.0 është përdorur gjatë zhvillimit, dhe pak para lançimit të GCC 15.1, është shkëputur dega GCC 16.0, mbi të cilën do të formohet lëshimi i ardhshëm të rëndësishëm GCC 16.1.
Ndryshimet kryesore:
- GjatĂ« kompilimit tĂ« programeve nĂ« gjuhĂ«n C, standardi C23 (pĂ«rmbledhja e ndryshimeve) me zgjerimet GNU (â-std=gnu23â) Ă«shtĂ« aktivizuar si i parazgjedhur. MĂ« parĂ«, si i parazgjedhur pĂ«rdorej standardi C17 â â-std=gnu17â. Ky ndryshim potencialisht mund tĂ« sjellĂ« probleme gjatĂ« ndĂ«rtimit tĂ« projekteve ekzistuese pĂ«r shkak tĂ« pĂ«rfshirjes sĂ« konstantĂ«s nullptr, tipit _BitInt(n) dhe fjalĂ«ve kyçe bool, true dhe false, qĂ« mund tĂ« konfl iktojnĂ« me identifikatorĂ«t e njĂ«jtĂ« tĂ« caktuar nĂ« aplikacione.
- Janë realizuar mundësitë e standardit C23:
- Direktiva â#embedâ, e cila Ă«shtĂ« e destinuar pĂ«r tĂ« pĂ«rfshirĂ« nĂ« kod burime binare.
- Atributi âunsequencedâ, qĂ« sinjalizon se rezultati nuk varet nga rendi i ekzekutimit.
- Atributi âreproducibleâ, qĂ« tregon se funksioni gjithmonĂ« kthen tĂ« njĂ«jtin rezultat me tĂ« dhĂ«na hyrĂ«se tĂ« njĂ«jta, dmth, nuk varet nga faktorĂ« tĂ« tjerĂ«.
- Janë realizuar elementet e standardit të ardhshëm C2Y (-std=c2y dhe -std=gnu2y):
- MundĂ«sia pĂ«r shpalljen e variablave nĂ« operatorin âifâ, pĂ«r shembull, âif (int x = get ()) {âŠ}â.
- Mbështetje për emërtimin e cikleve për t'u referuar në to në kod. outer: for (int i = 0; i < IK; ++ i) { switch (i) { case 1: break; // kalon në CONT1 case 2: break outer; // kalon në CONT2 } // CONT1 } // CONT2
- MbĂ«shtetje pĂ«r caktimin e intervaleve tĂ« numrave tĂ« plotĂ« nĂ« shprehjet âcaseâ, pĂ«r shembull, âcase 1 ⊠10:â.
- Shtesat âiâ dhe âjâ pĂ«r tĂ« treguar pjesĂ«n imaginare nĂ« numrat kompleksĂ«.
- MundĂ«sia pĂ«r tĂ« pĂ«rdorur operatorĂ«t â++â dhe âââ me numra kompleksĂ«.
- Konstruksioni â_Generic(type, expr1, expr2, âŠ)â pĂ«r tĂ« zgjedhur shprehjen nĂ« bazĂ« tĂ« tipit tĂ« operandit.
- Mbështetje për qasjen në vargje bajtësh si në tipe të tjera objektesh, siç janë strukturat dhe unionet.
- MbĂ«shtetje pĂ«r aplikimin e operatorit âalignofâ nĂ« vargje tĂ« paplota (tĂ« shpallura pa caktuar madhĂ«sinĂ«, pĂ«r shembull, âint a[]â).
- Shtohen sintaksat e reja pĂ«r sekuencat e karaktereve nĂ« sistemet oktale, heksadecimale dhe universale. NĂ« vend tĂ« «\u», «\x» dhe «\nnn» â ofrohen sekuencat «\u{}», «\o{}» dhe «\x{}», ku mund tĂ« specifikoni njĂ« numĂ«r tĂ« pakufizuar shifrash.
- Funksionet e ndërtuara «__builtin_stdc_rotate_left» dhe «__builtin_stdc_rotate_right».
- Lejohen operacionet me gjatësi zero në tregues NULL (p.sh., «sizeof(*p)»).
- Në frontend për gjuhën C++ janë implementuar mundësi që po zhvillohen për standardin e ardhshëm C++26:
- Operatori variativ «friend» («friend TsâŠÂ»).
- Mundësia për të përdorur fjalën kyçe «constexpr» me llojin e operatorit «new» (placement new) për të vendosur një objekt në memorie të rezervuar paraprakisht gjatë kompilimit.
- Shfaqja e një gabimi kur fshihet një tregues në një tip të papërfunduar.
- Deklarimi i sintaksĂ«s pĂ«r pĂ«rcaktimin e parametrave variativĂ« me pikĂ« tĂ« shumĂ«fishta pa njĂ« presje paraprake Ă«shtĂ« shpallur i dhĂ«nĂ« pas. (pĂ«r shembull, kur shkruhet «void e(int...)» nĂ« vend tĂ« «void e(int, âŠ)»).
- Indeksimi i paketës së parametrave në shabllone.
- Atributet për lidhjet e strukturuara;
- Sintaksa â= delete(«arsye»)â;
- Përfshirja e «@», «$» dhe «`» në grupin bazë të simboleve.
- Përdorimi i makrove për deklarimin e moduleve është i ndaluar.
- Mundësia e aplikimit të lidhjeve të strukturuara (structured binding) si kusht në operatorët if dhe switch.
- Përfundimi i mbështetjes për krahasimin e drejtpërdrejtë të arrave (p.sh., «int arr1[5]; int arr2[5]; bool same = arr1 == arr2»).
- Mekanizmi «#embed» për inkorporimin e burimeve binare.
- Klasa template is_trivial është shpallur e dhënë pas.
- Shtohen mundësitë e C++23:
- Ndalimi i disa aplikimeve të drejtorisë «export» dhe leja për përdorimin e «export {}».
- Mbështetje për zgjatjen e jetës së objekteve kalimtare në ciklet «for» që iterojnë mbi intervalet.
- Në biblioteka libstdc++ është realizuar mbështetje eksperimentale për modulët std dhe std.compat.
- Përdorimi i iniciatorit «{0}» për bashkime në kodin C dhe C++ tani nuk garanton pastrimin e gjithë përmbajtjes, por çon në zerimin e elementit të parë të bashkimit. Për pastrimin e të gjithë bashkimit, duhet të përdorim shprehjen «{}», e cila është përcaktuar në specifikimin C23, ose të specifikojmë opsionin «-fzero-init-padding-bits=unions» për të rikthyer sjelljen e vjetër.
- ĂshtĂ« realizuar mbĂ«shtetje pĂ«r atributin «musttail» ([[gnu::musttail]] dhe [[clang::musttail]]) pĂ«r thirrje tail tĂ« garantuara. Atributi aplikohet nĂ« shprehjet e kthimit, ku bĂ«het thirrje rekurzive nĂ« funksionin aktual, dhe garanton qĂ« njĂ« thirrje e tillĂ« do tĂ« pĂ«rdorĂ« rekurzion tail, pa alokuar memorie tĂ« shtuar nĂ« stack (shkĂ«put rrezikun e shterimit tĂ« memorie pĂ«r numra shumĂ« tĂ« mĂ«dhenj thirrjesh).
- ĂshtĂ« realizuar mbĂ«shtetje pĂ«r atributin flag_enum ([[gnu::flag_enum]] dhe [[clang::flag_enum]]), i cili pĂ«rdoret pĂ«r enumerimet pĂ«r tĂ« treguar qĂ« pĂ«rmbajtja pĂ«rdoret nĂ« operacione me bitĂ« (pĂ«rjashton nxjerrjen e paralajmĂ«rimeve nĂ« modalitetin "-Wswitch").
- ĂshtĂ« shtuar mbĂ«shtetje pĂ«r atributin "counted_by", pĂ«rmes tĂ« cilit mund tĂ« tregoni njĂ« fushĂ« nĂ« strukturĂ« me njĂ« array fleksibĂ«l, qĂ« pĂ«rcakton numrin e elementeve. Atributi mund tĂ« pĂ«rdoret pĂ«r tĂ« pĂ«rmirĂ«suar efikasitetin e kontrolleve tĂ« daljes pĂ«rtej tamponit.
- Për funksionet është shtuar atributi "nonnull_if_nonzero", i cili përcakton se disa parametra të funksionit me tregues mund të marrin vlerën NULL vetëm nëse parametri tjetër është zero.
- ĂshtĂ« lejuar pĂ«rdorimi i inkursionet tĂ« zgjeruara tĂ« assembler-it "asm (...)" jashtĂ« funksioneve. NĂ« inkursionet assembler Ă«shtĂ« lejuar rwrite e memories nĂ« zonĂ«n e kuqe tĂ« stack-ut (zona nĂ« majĂ« tĂ« stack-ut).
- Kompilimi i kodit C++ është përshpejtuar falë përmirësimit të hashing-ut për shabllone.
- JanĂ« shtuar optimizime tĂ« reja. ĂshtĂ« realizuar mbĂ«shtetje pĂ«r vektorimin e cikleve, ku ka kod pĂ«r dalje tĂ« parakohshme (pĂ«r shembull, pĂ«rmes thirrjes break ose return), edhe nĂ«se kĂ«to cikle manipullojnĂ« array tĂ« ndarĂ« dinamikisht ose buferĂ«, tĂ« cilat kanĂ« njĂ« madhĂ«si tĂ« panjohur nĂ« fazĂ«n e kompilimit. Kur specifikohet opsioni "-O2", Ă«shtĂ« pĂ«rfshirĂ« vektorimi i disa cikleve tĂ« lehta pĂ«r vektorim, pĂ«r tĂ« cilat nuk ka informacione pĂ«r numrin e iteraioneve (tripcount).
- ĂshtĂ« shtuar njĂ« modalitet i optimizimit inkremental nĂ« fazĂ«n e lidhjes (LTO, Link-Time Optimization), duke reduktuar ndjeshĂ«m kohĂ«n e rikoimplimit kur pĂ«rdoret LTO nĂ« situata, ku janĂ« bĂ«rĂ« ndryshime tĂ« vogla nĂ« kod (ndryshuar njĂ« funksion). PĂ«r aktivizimin e modalitetit inkremental, ofrohet opsioni "-flto-incremental".
- ĂshtĂ« pĂ«rmirĂ«suar kompilimi i skedarĂ«ve shumĂ« tĂ« mĂ«dhenj tĂ« hyrjes. ĂshtĂ« realizuar mbajtja e shenjave tĂ« kolonave qĂ« i kalojnĂ« 4096. ĂshtĂ« rritur saktĂ«sia e pĂ«rcaktimit tĂ« vendndodhjes sĂ« gabimeve dhe paralajmĂ«rimeve nĂ« skedarĂ«t shumĂ« tĂ« mĂ«dhenj.
- ĂshtĂ« rritur qartĂ«sia e raporteve gjatĂ« diagnozave tĂ« problemeve. PĂ«r shembull, Ă«shtĂ« siguruar theksimi i vendit tĂ« shfaqjes sĂ« problemit me simbolin "â ïž", Ă«shtĂ« ndryshuar disponimi i daljes gjatĂ« gabimeve nĂ« shabllonet C++, janĂ« shtuar kĂ«shilla pĂ«r tĂ« lehtĂ«suar kalimin nĂ« standard C23, Ă«shtĂ« riparuar skema e ngjyrave. ĂshtĂ« shtuar mundĂ«sia e nxjerrjes sĂ« diagnozĂ«s nĂ« formatin Sarif (-fdiagnostics-format=sarif-file).
- Librairia libgdiagnostics është implementuar, e cila lejon integrimin e mundësive të GCC lidhur me formatimin e mesazheve diagnostike në projektet tuaja (p.sh., mund të shfrytëzoni mjetet e citimeve, ndriçimit dhe sugjerimeve për korrigjime).
- Janë shtuar paralajmërimet "-Wtrailing-whitespace" dhe "-Wleading-whitespace" për identifikimin e hapësirave të mbetura në fundin e rreshtave dhe hapësirave të panevojshme në fillim të rreshtave.
- Një paralajmërim "-Wheader-guard" është shtuar për të informuar për problemet në makros për mbrojtjen e skedarëve të titullit, duke parandaluar përfshirjen e përsëritur të skedarit të titullit.
- Frontend-i për gjuhën D është përditësuar në versionin 2.111.0.
- Frontend-i për gjuhën Fortran tani përfshin mbështetje për numra të plotë pa nënshkrim.
- Compiler pĂ«r gjuhĂ«n COBOL â gcobol, qĂ« mbĂ«shtet platformat x86-64 dhe AArch64, Ă«shtĂ« pĂ«rfshirĂ« nĂ« pĂ«rbĂ«rje dhe nuk Ă«shtĂ« menduar pĂ«r pĂ«rdorim nĂ« sisteme 32-bit. Compiler-i zbatohet specifikimin ISO/IEC 1989:2023 dhe kalon pjesĂ«n mĂ« tĂ« madhe tĂ« testeve NIST CCVS/85.
- Zbatimi i standardeve OpenMP 5.0, 5.1, 5.2 dhe 6.0 (Open Multi-Processing) është vazhduar, të cilat përcaktojnë API-të dhe mënyrat e aplikimit të metodave të programimit të paralel në sisteme me shumë bërthama dhe hibride (CPU+GPU/DSP) me memorie të përbashkët dhe blloqe të vektorimit (SIMD). Janë shtuar mbështetje për metadirektivat dhe konstrukcionet tile, unroll, interop dhe dispatch. Për disa GPU AMD dhe NVIDIA është shtuar mbështetje për memorinë e ndarë të unifikuar (aktivizohet përmes specifikimit të unified_shared_memory në direktivën "requires"). Janë shtuar mbështetje për shprehjen "self_maps".
- Backend-i për arkitekturën AArch64 ka marrë mbështetje për platformën MinGW (aarch64-w64-mingw32). Janë implementuar më shumë se 20 zgjerime ARM8 dhe është përmirësuar mbështetja për zgjerimin ACLE (Arm C Language Extensions). Janë kryer shumë përmirësime në gjenerimin e kodit. Janë shtuar mbështetje për 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ë backendin e gjenerimit të kodit për GPU AMD Radeon (GCN) është implementuar mbështetje për bibliotekën libstdc++ dhe është shtuar mbështetje eksperimentale për gjenerimin e kodit për seritë e pajisjeve gfx9-generic, gfx10-3-generic dhe gfx11-generic.
- NĂ« backend pĂ«r arkitekturĂ«n x86 Ă«shtĂ« shtuar mbĂ«shtetje pĂ«r zgjerimet e arkitekturĂ«s sĂ« setit tĂ« komandave Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. ĂshtĂ« shtuar mbĂ«shtetje pĂ«r CPU Intel Diamond Rapids dhe Xeon Phi.
- Janë zgjeruar mundësitë e backend-eve për platformat LoongArch dhe AVR.
- ĂshtĂ« hequr mbĂ«shtetja pĂ«r arkitekturĂ«n e targetuar nios2, e pĂ«rdorur nĂ« procesorĂ«t Nios II. ĂshtĂ« shpallur e vjetruar dhe do tĂ« hiqet nĂ« versionin e ardhshĂ«m tĂ« rĂ«ndĂ«sishĂ«m mbĂ«shtetja ABI ILP32 (-mabi=ilp32) nĂ« portin pĂ«r AArch64.
Burimi: opennet.ru
