A GCC 15 fordítókészlet kiadása

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

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster