Aasta arendustöö jÀrel on vÀlja antud tasuta GCC 15.1 kompilaatorite komplekt, mis on esimene mÀrkimisvÀÀrne vÀljaanne uues GCC 15.x haru. Versioon 15.0 kasutati arendusprotsessis ning vahetult enne GCC 15.1 vabastamist hargnes haru GCC 16.0, mille alusel koostatakse jÀrgmine mÀrkimisvÀÀrne vÀljaanne GCC 16.1.
Peamised muudatused:
- C keeles programmeerimisel kasutatakse vaikimisi standardit C23 (muudatuste ĂŒlevaade), koos GNU laiendustega («-std=gnu23»). Varasemalt kasutati vaikimisi standardit C17 â «-std=gnu17». Muudatus vĂ”ib potentsiaalselt pĂ”hjustada probleeme olemasolevate projektide koostamisel, kuna see hĂ”lmab konstanti nullptr, tĂŒĂŒpi _BitInt(n) ja vĂ”tmesĂ”nu bool, true ning false, mis vĂ”ivad konfliktida rakendustes mÀÀratletud sama nimega identifikaatoritega.
- On rakendatud C23 standardsed vÔimalused:
- Direktiiv «#embed», mis on mÔeldud binaarsete ressursside koodis inteerimiseks.
- Atribut «unsequenced», mis annab mÀrku, et tulemus ei sÔltu tÀideviimise jÀrjekorrast.
- Attribuut "reproduktiivne", mis nÀitab, et funktsioon tagastab alati sama tulemuse sama sisendi korral, st ei sÔltu muudest teguritest.
- Tulevase standardi C2Y (-std=c2y ja -std=gnu2y) elemendid on rakendatud:
- Muuttuvate deklareerimise vĂ”imalus "if"-lause sees, nĂ€iteks "if (int x = get ()) {âŠ}".
- TsĂŒklite nimedega viitamise toetus, et viidata neile koodis. outer: for (int i = 0; i < IK; ++i) { switch (i) { case 1: break; // hĂŒppab CONT1-ile case 2: break outer; // hĂŒppab CONT2-ile } // CONT1 } // CONT2
- TÀisarvude vahemike nÀitamise toetus "case"-lauseid kasutades, nÀiteks "case 1 ⊠10:".
- JuurdepÀÀsu mÀrgid "i" ja "j" kompleksarvudes imaginaarosa tÀhistamiseks.
- "++" ja "â" operaatorite kasutamise vĂ”imalus kompleksarvude puhul.
- Konstruktsioon "_Generic(type, expr1, expr2, âŠ)" operandi tĂŒĂŒbi pĂ”hjal vĂ€ljendi valimiseks.
- MĂ€lublokkide kasutamise tugi teiste objektitĂŒĂŒpide, nĂ€iteks struktuuride ja liideste, jaoks.
- "alignof" operaatori rakendamise toetus mittetÀielikele massiividele (deklareeritud ilma suuruse nÀiteta, nÀiteks "int a[]").
- Uue sĂŒntaksi lisamine kaheksandate, kuuenda ja universaalsete escape-sĂŒmbolijĂ”udude jaoks. Asemel «\u», «\x» ja «\nnn» â on ette pandud jĂ€rjestused «\u{}», «\o{}» ja «\x{}», kuhu saab mÀÀrata suvalise arvu numbreid.
- Sisseehitatud funktsioonid «__builtin_stdc_rotate_left» ja «__builtin_stdc_rotate_right».
- Null-pikkusega operatsioonide lubamine NULL-pointeritega (nt «sizeof(*p)»).
- Frontendis on C++ keele jaoks rakendatud tulevase C++26 standardi arendamiseks mÔeldud funktsioone:
- Variatiivne operaator «friend» («friend TsâŠÂ»).
- Klienditut sÔna «constexpr» kasutus koos «new» operaatori variandiga (placement new), et paigutada objekt eelnevalt eraldatud mÀlus kompileerimise ajal.
- Viga nĂ€idatakse ebatĂ€ieliku tĂŒĂŒbi indikaatori kustutamisel.
- Muutus, et variatiivsete parameetrite mÀÀramise sĂŒntaks sĂŒmpaatilise kolmpunkti kujul on aegunud, kui eelnevat koma ei ole (nĂ€iteks, kui on mĂ€rgitud «void e(intâŠ)» asemel «void e(int, âŠ)»).
- Parameetrite paketi indekseerimine mallides.
- Atribuudid struktureeritud sidumiste jaoks;
- SĂŒntaks â= delete(«pĂ”hjus»)â;
- «@», «$» ja «`» lisamine pĂ”hisĂŒmbolite kogusse.
- Moodulite deklareerimiseks ei ole lubatud makrode kasutamine.
- Struktureeritud sidumise rakendamise vÔimalus tingimusena if ja switch operaatorites.
- Otsese massiivide vÔrdlemise tugi on lÔpetatud (nt «int arr1[5]; int arr2[5]; bool same = arr1 == arr2»).
- Binaarseid ressursse kaasava mehhanismi «#embed» jaoks.
- Aegunud on malliklass is_trivial.
- Lisatud C++23 vÔimalused:
- MÔnede «export» direktiivide kasutamine on keelatud ja «export {}» kasutamine on lubatud.
- Ajutiste objektide eluea pikendamise tugi for tsĂŒklites, mis iteratsioonivad vahemikke.
- Raamatukogus libstdc++ on rakendatud eksperimentaalset tuge std ja std.compat moodulitele.
- Initsialiseerija «{0}» ĂŒhendite puhul C ja C++ koodis ei taga enam kogu sisu puhastamist, vaid viib vaid ĂŒhendite esimese elementi nullimist. Kogu ĂŒhendite puhastamiseks tuleks kasutada vĂ€ljendit «{}», mis on mÀÀratletud C23 spetsifikatsioonis, vĂ”i mÀÀrata valik «-fzero-init-padding-bits=unions» vana kĂ€itumise taastamiseks.
- Rakendatud on «musttail» atribuudi ([[gnu::musttail]] ja [[clang::musttail]]) tugi garanteeritud saba kutsumiste jaoks. Atributti rakendatakse return vĂ€ljenditele, kus toimub rekursiivne ĂŒleskutse praegusele funktsioonile, ja see garanteerib, et selline ĂŒleskutse kasutab saba rekursiooni, mille puhul ei eraldata lisamĂ€lu virna (vĂ€listades mĂ€lupuuduse riski vĂ€ga suure kutsumise arvu korral).
- Toetatakse flag_enum atribuuti ([[gnu::flag_enum]] ja [[clang::flag_enum]]), mida rakendatakse loetelude puhul, et nĂ€idata, et sisu kasutatakse bititegevustes (vĂ€listab hoiatused reĆŸiimis â-Wswitchâ).
- Toetatakse atribuuti âcounted_byâ, mille kaudu saab nĂ€idata vĂ€ljatĂ”mbe struktuuris, mis mÀÀrab paindliku massiivi, mis mÀÀrab elementide arvu. Atribuuti saab kasutada piirangutest vĂ€ljapoole kontrollide efektiivsuse suurendamiseks.
- Funktsioonidele on lisatud atribuut ânonnull_if_nonzeroâ, mis mÀÀrab, et mĂ”ned funktsiooni pointer-parameetrid vĂ”ivad olla NULL, ainult kui teine parameeter on null.
- LahtivĂ”etud assamblerinsertid âasm (âŠ.)â funktsioonide vĂ€listeks kasutamiseks on lubatud. Assamblerinsertides on lubatud muuta mĂ€lu punase kattega virnas (virna tipukohas).
- C++ koodi kompileerimist on kiirendatud parandatud mallide hajutamise tÔttu.
- Uued optimeerimised on lisatud. Toetatakse tsĂŒklite vektori, milles on enneaegse vĂ€ljumise kood (nt kutsumise kaudu break vĂ”i return), isegi kui sellised tsĂŒklid kĂ€sitlevad dĂŒnaamiliselt eraldatud massiive vĂ”i puhver, mille suurus ei ole kompilatsiooni ajal teada. Valiku â-O2â mÀÀramisel on aktiveeritud teatud kergelt vektoreeritud tsĂŒklite vektori, mille iteratsioonide arvu (tripcount) teave puudub.
- Lisatud inkrementaalse optimeerimise reĆŸiim sidumisetapis (LTO, Link-Time Optimization), mis vĂ€hendab oluliselt ĂŒmberkompileerimise aega LTO kasutamisel olukordades, kus koodis on tehtud vĂ€ikesed muudatused (muudetud ĂŒks funktsioon). Inkrementaalse reĆŸiimi aktiveerimiseks on ettepanek valik â-flto-incrementalâ.
- VĂ€ga suurte sisendfailide kompileerimist on parendatud. Rakendatud on veergude numbrite jĂ€lgimine, mis ĂŒletavad 4096. Suurenenud on vigade ja hoiatuste asukoha tĂ€psus vĂ€ga suurtes failides.
- Raportite visuaalne selgus probleemide diagnoosimisel on paranenud. NĂ€iteks on probleemide tekke koht mĂ€rgitud sĂŒmboliga ââ ïžâ, C++ mallides esinevate vigade vĂ€ljundit on ĂŒmber kujundatud ning standardile C23 ĂŒlemineku hĂ”lbustamiseks on lisatud vihjeid. Samuti on tĂ€iustatud vĂ€rviskeemi. Diagnostika vĂ€ljund on nĂŒĂŒd saadaval Sarif formaadis (-fdiagnostics-format=sarif-file).
- Rakendatud on raamatukogu libgdiagnostics, mis vÔimaldab integreerida oma projektidesse GCC-ga seotud diagnostikateate vormistamise vÔimalusi (nÀiteks on vÔimalik kasutada tsitaadi, rÔhutamise ja parandamise vihjete tööriistu).
- Lisatud on hoiatused â-Wtrailing-whitespaceâ ja â-Wleading-whitespaceâ ridade lĂ”pus jÀÀvate tĂŒhikute ning ridade alguses liialt suurte tĂŒhikute leidmiseks.
- Lisatud on hoiatus â-Wheader-guardâ, et teavitada pealkirjafailide kaitsemakrode probleemidest, mis takistavad pealkirjafaili korduvat kaasamist.
- D keele frontend on uuendatud versioonile 2.111.0.
- Fortran keele frontend on lisatud toeks ilma mÀrkideta tÀisarvudele.
- Paketti sisaldab COBOL-i keele kompilaatorit â gcobol, mis toetab x86-64 ja AArch64 platvorme 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.
- Avati OpenMP 5.0, 5.1, 5.2 ja 6.0 (Open Multi-Processing) standardite rakendamine, mis mÀÀratlevad API-d ja meetodite kasutuse eriĂŒlesandeid mitme tuuma ja hĂŒbriidsete (CPU+GPU/DSP) sĂŒsteemide jaoks, mis sisaldavad jagatud mĂ€lu ja vektoriseerimise plokke (SIMD). Lisatud on tuge metadirektiividele ja struktuuridele kuten tile, unroll, interop ja dispatch. MĂ”nedel AMD ja NVIDIA GPU-del lisati ĂŒhtse jagatud mĂ€lu tugi (sisselĂŒlitamiseks tuleb mÀÀrata unified_shared_memory direktiivis ârequiresâ). Toetatud on ka vĂ€ljend âself_mapsâ.
- AArch64 arhitektuuri taustsĂŒsteemi lisati MinGW platvormi tugi (aarch64-w64-mingw32). Teostatud on ĂŒle 20 ARM8 laienduse ja parendatud ACLE (Arm C Language Extensions) laienduse tuge. Tehtud on palju tĂ€iustusi koodigeneraatorisse. Toetatud CPU-d:
- 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)
- AMD Radeon (GCN) GPU koodigeneratsioonibackend toetab nĂŒĂŒd libstdc++ teeki ning on lisatud eksperimentaalne tugi gfx9-generic, gfx10-3-generic ja gfx11-generic seadmete seeria jaoks.
- x86 arhitektuuri backend on laiendatud Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE ja MOVRS arhitektuuri kÀskude laiendusega. Samuti on lisatud Intel Diamond Rapids ja Xeon Phi protsessori tugi.
- LoongArch ja AVR platvormide backendide funktsionaalsust on laiendatud.
- Nios II protsessorites kasutusel olev nios2 sihtarhitektuuri tugi on eemaldatud. ABI ILP32 (-mabi=ilp32) tugi AArch64 portis on kuulutatud aegunuks ning eemaldatakse jÀrgmises suuremas versioonis.
Allikas: opennet.ru
