PĂ€rast aasta arendust on vĂ€lja antud tasuta GCC 15.1 kompilaatorite komplekti versioon, mis on esimene mĂ€rkimisvÀÀrne vĂ€ljaanne uues GCC 15.x haru. VĂ€ljalaske numbrite sĂŒsteemi kohaselt kasutati arendusprotsessis versiooni 15.0 ning GCC 15.1 vĂ€ljalaskmise eel juba eraldus haru GCC 16.0, mille alusel moodustatakse jĂ€rgmine mĂ€rkimisvÀÀrne GCC 16.1 vĂ€ljaanne.
Peamised muudatused:
- C keeles programmide kompileerimisel on vaikimisi aktiivne C23 standard (muudatuste ĂŒlevaade) koos GNU laiendustega (â-std=gnu23â). Varem kasutati vaikimisi C17 standardit â â-std=gnu17â). Muudatus vĂ”ib potentsiaalselt pĂ”hjustada probleeme olemasolevate projektide kokkupanemisel, kuna see sisaldab konstanti nullptr, tĂŒĂŒpi _BitInt(n) ning vĂ”tmesĂ”nu bool, true ja false, mis vĂ”ivad konfliktida rakendustes mÀÀratud sama nimega identifikaatoritega.
- C23 standardi vÔimalused on rakendatud:
- Direktiiv â#embedâ, mis on mĂ”eldud binaarsete ressursside koodis embedimiseks.
- Atribuut âunsequencedâ, mis nĂ€itab, et tulemus ei sĂ”ltu tĂ€itmise jĂ€rjestusest.
- Atribuut âreproducibleâ, mis nĂ€itab, et funktsioon tagastab alati sama tulemuse, kui sisendid on samad, st ei sĂ”ltu teistest teguritest.
- C2Y standardi elemendid (-std=c2y ja -std=gnu2y) on rakendatud:
- Muuttuvate deklareerimise vĂ”imalus âifâ lauses, nĂ€iteks âif (int x = get ()) {âŠ}â.
- TsĂŒklitele nimede andmise tugi, et neile koodis viidata. outer: for (int i = 0; i < IK; ++ i) { switch (i) { case 1: break; // hĂŒppab CONT1 juurde case 2: break outer; // hĂŒppab CONT2 juurde } // CONT1 } // CONT2
- TĂ€isarvude valikute âcaseâ lausetes vahemike mÀÀramise tugi, nĂ€iteks âcase 1 ⊠10:â.
- Sufiksid âiâ ja âjâ kompleksnumbrites imaginarse osa tĂ€histamiseks.
- Kompleksnumbrites operaatorite â++â ja âââ kasutamise vĂ”imalus.
- Konstruktsioon â_Generic(type, expr1, expr2, âŠ)â, mis valib vĂ€ljendi operandi tĂŒĂŒbi pĂ”hjal.
- Byte-massiivide kĂ€sitlemise tugi kui teised objekti tĂŒĂŒbid, nagu struktuurid ja liidendid.
- Operaatori âalignofâ rakendamise tugi mittetĂ€ielikele massiividele (mille suurust ei ole mÀÀratud, nĂ€iteks âint a[]â).
- Lisatud on uus sĂŒntaks kaheksandike, kuueteistkĂŒmnendike ja universaalsete escape-jĂ€rjestuste jaoks. â\uâ, â\xâ ja â\nnnâ asemel on pakkuda jĂ€rjestused â\u{}â, â\o{}â ja â\x{}â, kus saab mÀÀrata suvalise arvu numbreid.
- Sisemised funktsioonid â__builtin_stdc_rotate_leftâ ja â__builtin_stdc_rotate_rightâ.
- Nullpikkusega operatsioonid NULL-viidikute kohta on lubatud (nĂ€iteks âsizeof(*p)â).
- C++ keeles on esitatud front-endis tulevase C++26 standardi arendamise vÔimalused:
- Muutuva arvu parameetrite operaator âfriendâ (âfriend TsâŠâ).
- VĂ”imalus kasutada âconstexprâ vĂ”tmesĂ”na ânewâ operaatori erivariantiga (placement new) objekti asetamist eelnevalt eraldatud mĂ€llu kompileerimise ajal.
- Veateate vĂ€ljastamine, kui kustutatakse viidik, mis osutab mittetĂ€ielikule tĂŒĂŒbile.
- Mugavuse huvides on deklareeritud suhtes ettenĂ€htud sarnaste parameetrite defineerimise sĂŒntaks, kus enne kolme punkti pole koma (nĂ€iteks âvoid e(intâŠ)â asemel âvoid e(int, âŠ)â).
- Parameetrite paketi indekseerimine ĆĄabloonides.
- Atribuudid struktureeritud seondumiste jaoks;
- SĂŒntaks â= delete(âpĂ”hjusâ);â;
- â@â, â$â ja â`â kaasamine baassĂŒmbolite kogumisse.
- Makrode kasutamine moodulite deklareerimiseks on keelatud.
- Struktureeritud seondumise (structured binding) kasutamise vÔimalus tingimustena if- ja switch-lauseis.
- Otsese massiivi vĂ”rdlemise toetus on lĂ”petatud (nĂ€iteks âint arr1[5]; int arr2[5]; bool same = arr1 == arr2â).
- Mehhanism â#embedâ binaarsete ressursside sisse embedimiseks.
- Mugavused on klassifitseeritud nagu is_trivial.
- C++23 vÔimalused on lisatud:
- MĂ”nede âexportâ direktiivi rakenduste keelamine ja âexport {}â kasutamise lubamine.
- Ajutiste objektide eluea pikenemise tugi tsĂŒklites âforâ, mis lĂ€bivad vahemikke.
- Raamatukogus libstdc++ on rakendatud eksperimentaalne toetus std ja std.compat moodulitele.
- Initsialiseerija â{0}â kasutamine liidetes C ja C++ koodis ei taga kogu sisu puhastamist, vaid viib liidete esimese elemendi nullimiseni. Kogu liidu puhastamiseks tuleks kasutada C23 spetsifikatsioonis mÀÀratletud vĂ€ljendit â{}â vĂ”i mÀÀrata valik â-fzero-init-padding-bits=unionsâ, et taastada vana kĂ€itumine.
- Tehtud on toetuse lisamine «musttail» atribuudi ([[gnu::musttail]] ja [[clang::musttail]]) jaoks, et tagada garantiseeritud saba kutsed. Atribuut rakendub return avaldustes, kus toimub praeguse funktsiooni rekursiivne kutsumine, ja garanteerib, et selline kutsumine kasutab saba rekursiooni, kus ei jaotata tÀiendavat mÀlu virna (vÀlja arvatud mÀlu ammendamise risk vÀga suure kutsumise arvu korral).
- Tehtud on toetuse lisamine flag_enum atribuudi ([[gnu::flag_enum]] ja [[clang::flag_enum]]) jaoks, mida rakendatakse loenditele, et nĂ€idata, et sisu kasutatakse bititegevustes (vĂ€listab hoiatuse esitamise reĆŸiimis «-Wswitch»).
- Lisatud on toetuse lisamine atribuudi «counted_by» jaoks, mille kaudu saab mÀÀrata struktuuri paindliku massiivi vÀlja, mis mÀÀrab elementide arvu. Atribuuti saab kasutada puutumatuse kontrollide efektiivsuse suurendamiseks.
- Funktsioonidele on lisatud atribuut «nonnull_if_nonzero», mis mÀÀratleb, et mÔned funktsiooni parameetrite pointerid vÔivad vÔtta vÀÀrtuse NULL ainult juhul, kui mÔni teine parameeter on null.
- Lubatavad on laiendatud assembleri sisestused «asm (âŠ.)» vĂ€ljaspool funktsioone. Assembleri sisestustes on lubatud kirjutada ĂŒle mĂ€lu virna punases tsoonis (ala virna tipus).
- C++ koodi kompileerimist on kiirus suurem parendatud mallide hasheeringu tÔttu.
- Lisatud on uued optimeerimised. Tehtud on toetuse lisamine silmade vektoriseerimisele, kus on kood enneaegseteks vĂ€ljumisteks (nĂ€iteks break vĂ”i returni kaudu), isegi kui sellised silmad manipuleerivad dĂŒnaamiliselt jaotatud massiivide vĂ”i puutmete tegemisega, mille suurust ei ole kompileerimise ajal teada. Valides valiku «-O2» on lubatud mĂ”nede kergesti vektoriseeritavate silmade vektoriseerimine, mille osas puuduvad teated iteratsioonide arvu (tripcount) kohta.
- Lisatud on inkrementeerimise optimeerimise reĆŸiim sidumisetapis (LTO, Link-Time Optimization), mis oluliselt vĂ€hendab uuesti kompileerimise aega LTO kasutamisel olukordades, kus on tehtud vĂ€ikeseid muudatusi koodis (muudetud ĂŒks funktsioon). Inkremendi reĆŸiimi lubamiseks on pakutud variant «-flto-incremental».
- Parandatud vĂ€ga suurte sisendfailide kompileerimist. Tehtud veergude numbrite jĂ€lgimine, mis ĂŒletavad 4096. Parandatud vigade ja hoiatuste asukoha mÀÀramise tĂ€psust vĂ€ga suurtes failides.
- Parandatud aruannete selgust probleemide diagnoosimisel. NĂ€iteks on probleemi tekkekohta tĂ€histatud sĂŒmboliga "â ïž", muudetud C++ mallide vigade vĂ€ljundi paigutust, lisatud vihjeid standardile C23 ĂŒlemineku hĂ”lbustamiseks, ĂŒmber kujundatud vĂ€rviskeem. Lisatud vĂ”imalus diagnostika vĂ€ljundi genereerimiseks Sarif formaadis (-fdiagnostics-format=sarif-file).
- Töötatud vÀlja raamatukogu libgdiagnostics, mis vÔimaldab integreerida oma projektidesse GCC, seotud diagnostiliste sÔnumite vormindamisvÔimalusi (nt saab kasutada tsiteerimise, esiletÔstmise ja paranduste vihjete vahendeid).
- Lisatud hoiatused "-Wtrailing-whitespace" ja "-Wleading-whitespace" lĂ”pprea ĂŒleliigsete ja algrea tĂ€iendavate tĂŒhikute tuvastamiseks.
- Lisatud hoiatus "-Wheader-guard", et teavitada pealkirja makrode kaitse failide probleeme, et vÀltida pealkirja faili korduvat kaasamist.
- D keele front-end on uuendatud versioonini 2.111.0.
- Fortran keele front-endis on lisatud toe andmine mÀrkumatute tÀisarvude jaoks.
- Komplekti on lisatud COBOL-i kompilaator â gcobol, mis toetab platvorme x86-64 ja AArch64, ning ei ole mĂ”eldud kasutamiseks 32-bitistes sĂŒsteemides. Kompilaator rakendab ISO/IEC 1989:2023 spetsifikatsiooni ja lĂ€bib suure osa NIST CCVS/85 testidest.
- JĂ€tkub OpenMP 5.0, 5.1, 5.2 ja 6.0 (Open Multi-Processing) standardite rakendamine, mis mÀÀratlevad API-d ja meetodite rakendamise viise paralleelse programmeerimise jaoks mitme tuumaga ja hĂŒbriidsĂŒsteemides (CPU+GPU/DSP) koos jagatud mĂ€lu ja vektorite plokkide (SIMD) kasutamisega. Lisatud tugi meta-direktiividele ja konstruktsioonidele tile, unroll, interop ja dispatch. MĂ”nede AMD ja NVIDIA GPU-de jaoks on lisatud ĂŒhtse jagatud mĂ€lu tugi (lĂŒlitatakse sisse unified_shared_memory direktiivi "requires" kaudu). Lisatud tugi vĂ€ljendile "self_maps".
- AArch64 arhitektuuri taustal on lisatud MinGW (aarch64-w64-mingw32) platvormi tugi. Tehtud ĂŒle 20 ARM8 laienduse, parandatud ACLE (Arm C Language Extensions) laienduse tuge. On tehtud mitmeid parandusi koodigeneraatorisse. Lisatud CPU toete:
- 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)
- GPU AMD Radeon jaoks koodi genereerimise taustal (GCN) on lisatud libstdc++ teegi tugi ja katsetuslik tugi koodi genereerimiseks seadmete sarjadele gfx9-generic, gfx10-3-generic ja gfx11-generic.
- x86 arhitektuuri tausta on lisatud Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS arhitektuurilaienemiste tugi. Lisatud on CPU Intel Diamond Rapids ja Xeon Phi tugi.
- LoongArch ja AVR platvormide taustade vÔimalusi on laiendatud.
- Nios II protsessorites kasutatava sihtaarchitektuuri nios2 tugi on eemaldatud. ABI ILP32 (-mabi=ilp32) tugi AArch64 portis on kuulutatud vananenuks ja eemaldatakse jÀrgmises olulisemas vÀljaandes.
Allikas: opennet.ru
