Egy év fejlesztés után megjelent a GCC 15.1 szabad fordító készletének kiadása, amely az első jelentős verzió az új GCC 15.x ágon. A kiadási számolási rendszernek megfelelően a 15.0 verzió a fejlesztés alatt állt, míg a GCC 15.1 megjelenése előtt már elágazott a GCC 16.0 ág, amelyen a következő jelentős kiadás, a GCC 16.1 fog alapszik.
Főbb változások:
- C nyelven írt programok fordításakor alapértelmezés szerint a C23 szabvány van érvényben (a változások áttekintése) GNU kiterjesztésekkel („-std=gnu23”). Korábban a C17 szabvány volt az alapértelmezett — „-std=gnu17”). Ez a változás potenciálisan problémákat okozhat a meglévő projektek fordításakor, mivel bevezeti a nullptr állandót, a _BitInt(n) típust, és a bool, true és false kulcsszavakat, amelyek ütközhetnek a meglévő alkalmazásokban használt, azonos nevű azonosítókkal.
- A C23 szabvány lehetőségei megvalósítva:
- A „#embed” direktíva, amely bináris erőforrások kódba ágyazására szolgál.
- Az „unsequenced” attribútum, amely azt jelzi, hogy az eredmény nem függ a végrehajtás sorrendjétől.
- A „reproducible” attribútum, amely megmutatja, hogy a függvény mindig ugyanazt az eredményt adja ugyanazon bemenetek mellett, azaz nem függ egyéb tényezőktől.
- A jövőbeli C2Y szabvány elemei megvalósítva (-std=c2y és -std=gnu2y):
- A változók deklarálásának lehetősége az „if” utasításban, például: „if (int x = get ()) {…}”.
- A ciklusok nevének megadásának támogatása, hogy hivatkozni lehessen rájuk a kódban. 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
- A „case” kifejezésekben egész számok tartományának megadásának támogatása, például: „case 1 … 10:”.
- Az „i” és „j” utótagok a komplex számok képzetes részének megjelölésére.
- A „++” és „—” operátorok komplex számokkal történő használatának lehetősége.
- A „_Generic(type, expr1, expr2, …)” konstrukció az operandus típusának megfelelő kifejezés kiválasztásához.
- A byte tömbök más típusú objektumokkal, például struktúrákkal és uniókkal való kezelésének támogatása.
- Az „alignof” operátor használatának támogatása nem teljes tömbökre (amelyeket méret megadás nélkül deklaráltak, például: „int a[]”).
- Új szintaxis került hozzáadásra a nyolcas, tizenhatós és univerzális escape karakterekhez. A „\u”, „\x” és „\nnn” helyett a „\u{}”, „\o{}” és „\x{}” szekvenciák javasoltak, ahol tetszőleges számú számjegy megadható.
- Beépített függvények: „__builtin_stdc_rotate_left” és „__builtin_stdc_rotate_right”.
- Nulla hosszúságú műveletek engedélyezése NULL mutatókkal (például: „sizeof(*p)”).
- A C++ frontend számára a C++26 jövőbeli szabványához fejlesztett lehetőségek valósultak meg:
- Változó argumentumú „friend” operátor („friend Ts…”).
- A „constexpr” kulcsszó használatának lehetősége az „új” operátor egyik variációjával (placement new) az objektum előre lefoglalt memóriában történő elhelyezésére a fordítás során.
- Hibaüzenet megjelenítése nem teljes típusra mutató mutató törlésekor.
- Elavultnak nyilvánították a változó paraméterek definiálásának szintaxisát a precedens nélküli három ponttal (például, amikor «void e(int…)» helyett «void e(int, …)» van megadva).
- Paramétercsomag indexelése sablonokban.
- Attribútumok strukturált kötéshez;
- A szintaxis „= delete(„ok”);”;
- A „@”, „$” és „`” karakterek bevezetése az alap karakterkészletbe.
- Makrók modulok deklarálására vonatkozó használata tilos.
- A strukturált kötés alkalmazásának lehetősége if és switch operátorokban.
- A tömbök közvetlen összehasonlításának támogatása megszűnt (például: „int arr1[5]; int arr2[5]; bool same = arr1 == arr2”).
- A „#embed” mechanizmus a bináris erőforrások beágyazására.
- Elavultnak nyilvánították az is_trivial sablonosztályt.
- C++23 képességek kerültek hozzáadásra:
- Bizonyos „export” direktívák alkalmazásának tilalma, és az „export {}” használatának engedélyezése.
- Ideiglenes objektumok életciklusának meghosszabbítása a tartományokat bejáró „for” ciklusokban.
- A libstdc++ könyvtárban kísérleti modulok támogatása valósult meg: std és std.compat.
- A C és C++ kódokban a „{0}” inicializáló használata a unionoknál már nem garantálja az összes tartalom törlését, hanem a union első elemének nullázásához vezet. Az összes union ürítéséhez a „{}” kifejezést kell használni, amely a C23 specifikációban van megadva, vagy a „-fzero-init-padding-bits=unions” opciót kell megadni a régi viselkedés helyreállításához.
- A „musttail” attribútum támogatása ( [[gnu::musttail]] és [[clang::musttail]] ) valósult meg a garantált tail call-okhoz. Az attribútum a return kifejezésekre vonatkozik, ahol a jelenlegi függvény rekurzív hívását végzik, és garantálja, hogy egy ilyen hívás tail recursio-t használ, amely nem igényel további memóriafoglalást a veremben (kizárva a memória kimerülésének kockázatát rendkívül nagy hívások száma esetén).
- Megvalósult a flag_enum attribútum támogatása ([[gnu::flag_enum]] és [[clang::flag_enum]]), amely enumokhoz alkalmazható, jelezve, hogy a tartalom bitműveletekben használatos (kizárja a figyelmeztetések megjelenését a «-Wswitch» módban).
- Hozzáadva a «counted_by» attribútum támogatása, amellyel egy rugalmas tömböt tartalmazó struktúrában megadható a mező, amely az elemek számát határozza meg. Az attribútum a határok átlépésének ellenőrzésének hatékonyságának növelésére használható.
- Funkciókhoz hozzáadva a «nonnull_if_nonzero» attribútum, amely meghatározza, hogy bizonyos pointer paraméterek null értéket kaphatnak, csak akkor, ha egy másik paraméter nulla.
- Megengedett az «asm (….)» kiterjesztett assembler beillesztések használata funkciókon kívül. Az assembler beillesztésekben megengedett a memória felülírása a verem vörös zónájában (a verem tetején található területen).
- A C++ kódok fordítása felgyorsult a sablonok jobb hash-elésének köszönhetően.
- Új optimalizációk kerültek bevezetésre. Megvalósult a ciklusok vektorizálásának támogatása, amelyekben korai kilépést végző kód található (például break vagy return hívás útján), még akkor is, ha az ilyen ciklusok dinamikusan allokált tömböket vagy puffereket manipulálnak, amelyek mérete a fordítási időszakban nem ismert. Az «-O2» opció használata esetén egyes könnyen vektorizálható ciklusok vektorizálása engedélyezve van, amelyek esetében hiányoznak a ciklusok számának információi (tripcount).
- Hozzáadva az inkrementális optimalizálási mód a linkelési szakaszhoz (LTO, Link-Time Optimization), amely jelentősen csökkenti a rekonstrukciós időt LTO használata esetén, ha a kódban apróbb módosításokat végeznek (egy funkció szerkesztése). Az inkrementális mód aktiválásához ajánlott az «-flto-incremental» opció.
- Javították a nagyon nagy bemeneti fájlok fordítását. Megvalósult a 4096-nál nagyobb oszlopszámok nyomkövetése. Növelték a hibák és figyelmeztetések helymeghatározásának pontosságát a nagyon nagy fájlokban.
- Javították a diagnosztikai jelentések láthatóságát. Például a problémák előfordulási helyének kiemelése «⚠️» jellel, a C++ sablonok hibáinál a kimenet elrendezésének megváltoztatása, javaslatok hozzáadása a C23 szabványra való egyszerűbb áttérés érdekében, a színséma átdolgozása. Lehetőség van diagnosztikai információk kiadására Sarif formátumban (-fdiagnostics-format=sarif-file).
- Megvalósult a libgdiagnostics könyvtár, amely lehetővé teszi, hogy integrálja a GCC diagnosztikai üzenetekkel kapcsolatos funkcióit a projektjeibe (például használhatja a hivatkozási, kiemelési és javítási javaslatok eszközeit).
- Hozzáadva a „-Wtrailing-whitespace” és „-Wleading-whitespace” figyelmeztetések, az utolsó karakterek közötti felesleges szóközök és az első helyeken található fölösleges szóközök észlelésére.
- Hozzáadva a „-Wheader-guard” figyelmeztetés, amely tájékoztat a fejlécek védő makróiban lévő problémákról, amelyek megakadályozzák a fejlécek többszörös betöltését.
- A D nyelv frontendje frissítve lett a 2.111.0 verzióra.
- A Fortran nyelv frontendje támogatást kapott a hozzátartozó előjel nélküli egész számok számára.
- A COBOL nyelvhez tartozó fordító - gcobol - támogatást kapott az x86-64 és AArch64 platformokhoz, és nem tervezik 32 bites rendszerek használatára. A fordító megvalósítja az ISO/IEC 1989:2023 specifikációt és a NIST CCVS/85 tesztjeinek nagy részét átmegy.
- Folyamatban van az OpenMP 5.0, 5.1, 5.2 és 6.0 (Open Multi-Processing) szabványok megvalósítása, amelyek API-kat és párhuzamos programozási módszerek alkalmazási módjait határozzák meg többmagos és hibrid (CPU+GPU/DSP) rendszerekben, közös memóriával és SIMD blokkokkal. Hozzáadva a meta direktívák és a tile, unroll, interop és dispatch konstrukciók támogatása. Bizonyos AMD és NVIDIA GPU-khoz hozzáadva a egységesített megosztott memória támogatása (az „requires” direktívában a unified_shared_memory megadásával kapcsolható be). Hozzáadva a „self_maps” kifejezés támogatása.
- Az AArch64 architektúrájú backendhez hozzáadták a MinGW platform támogatását (aarch64-w64-mingw32). Több mint 20 ARM8 kiterjesztés valósult meg, és javult az ACLE (Arm C Language Extensions) kiterjesztés támogatása. Számos javítás történt a kódgenerátorban. CPU támogatás hozzáadva:
- 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)
- Az AMD Radeon GPU-k (GCN) kódgenerálás backendje megvalósította a libstdc++ könyvtár támogatását, és hozzáadta a tesztelési kód generálásának kísérleti támogatását a gfx9-generic, gfx10-3-generic és gfx11-generic eszközsorozatokhoz.
- Az x86 architektúrához készült háttérszoftverbe beépítették az Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS architekturális utasításkészletek támogatását. Hozzáadták az Intel Diamond Rapids és Xeon Phi CPU támogatást.
- Bővítették a háttérszoftverek lehetőségeit a LoongArch és AVR platformok számára.
- Eltávolították a nios2 célarchitektúra támogatását, amely a Nios II processzorokban használt. Az ABI ILP32 (-mabi=ilp32) támogatása az AArch64 portban elavultnak nyilvánították és a következő jelentős kiadásban eltávolítják.
Forrás: opennet.ru
