Egy év fejlesztés után megjelent az ingyenes GCC fordítócsomag, a GCC 15.1, amely az első jelentős kiadás az új GCC 15.x ágban. A kiadások számozási séma szerint a fejlesztés során a 15.0-s verziót használták, nem sokkal a GCC 15.1 megjelenése előtt pedig már a GCC 16.0 egy ága is elágazódott, amely a következő nagy kiadás, a GCC 16.1 alapját fogja képezni.
Nagy változások:
- A C programok fordításakor alapértelmezés szerint a C23 szabványt (Change Summary) használják GNU kiterjesztéssel ("-std=gnu23"). Korábban a C17 szabványt használták alapértelmezés szerint (-std=gnu17). A változtatás problémákat okozhat a meglévő projektek felépítésekor a nullptr állandó, a _BitInt(n) típus, valamint a bool, true és false kulcsszavak miatt, amelyek ütközhetnek az alkalmazásokban meghatározott hasonló nevű azonosítókkal.
- A C23 szabvány alábbi képességei kerültek bevezetésre:
- A „#embed” direktíva bináris erőforrások kódba való beá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 azt jelzi, hogy a függvény mindig ugyanazt az eredményt adja vissza ugyanazon bemenet mellett, azaz nem függ más tényezőktől.
- A jövőbeni C2Y szabvány elemeit implementálták (-std=c2y és -std=gnu2y):
- Változók deklarálása „if” utasításban, például „if (int x = get ()) {...}”.
- A hurkok elnevezésének támogatása a kódban való hivatkozáshoz. külső: for (int i = 0; i < IK; ++ i) { switch (i) { case 1: break; // ugrás a CONT1-re 2. eset: break outer; // ugrás a CONT2-re } // CONT1 } // CONT2
- Támogatja az egész értékek tartományának megadását kis- és nagybetűs kifejezésekben, például "1...10: eset".
- Az „i” és „j” utótagok a képzetes részt jelölik komplex számokban.
- Lehetőség a "++" és "-" operátorok használatára komplex számokkal.
- A "_Generic(type, expr1, expr2, …)" konstrukció egy kifejezés kiválasztásához az operandus típusa alapján.
- Támogatás a bájttömbök eléréséhez, mint más objektumtípusokhoz, például struktúrákhoz és uniókhoz.
- Az "alignof" operátor hiányos tömbökre történő alkalmazásának támogatása (a méret megadása nélkül deklarált tömbök esetében, például "int a[]").
- Új szintaxis hozzáadva az oktális, hexadecimális és univerzális karakteres escape-szekvenciákhoz. A „\u”, „\x” és „\nnn” helyett a „\u{}”, „\o{}” és „\x{}” sorozatok javasoltak, amelyekben tetszőleges számú számjegy megadható.
- Beépített "__builtin_stdc_rotate_left" és "__builtin_stdc_rotate_right" függvények.
- A NULL mutatók nulla hosszúságú műveletei megengedettek (pl. "sizeof(*p)").
- A C++ nyelv frontendje olyan funkciókat valósít meg, amelyeket a jövőbeni C++26 szabványhoz fejlesztenek:
- Változatos operátor "barát" ("barát Ts...").
- Lehetőség a constexpr kulcsszó használatára az új operátor egy változatával (placement new) egy objektum előre lefoglalt memóriába történő elhelyezéséhez fordítási időben.
- Hiba jelenik meg egy hiányos típusra mutató mutató törlésekor.
- A változó paraméterek vessző nélküli ellipszissel történő meghatározásának szintaxisa (például amikor a "void e(int…)" értéket adja meg a "void e(int, …)" helyett) elavult.
- Paramétercsomag indexelése sablonokban.
- Strukturált kötések attribútumai;
- Szintaxis '= delete("ok")';
- A „@”, „$” és „`” beillesztése az alapkarakterkészletbe.
- A makrók használata modulok deklarálására tilos.
- Strukturált kötés feltételként való használatának képessége if és switch utasításokban.
- A közvetlen tömb-összehasonlítás támogatása (pl. "int arr1[5]; int arr2[5]; bool same = arr1 == arr2") megszűnt.
- A "#embed" mechanizmus bináris erőforrások beágyazásához.
- Az is_trivial sablonosztály elavult.
- Hozzáadott C++23 funkciók:
- Tiltsa le az "export" direktíva néhány használatát, és engedélyezze az "export {}" használatát.
- Támogatás az ideiglenes objektumok élettartamának meghosszabbításához a tartományokon át ismétlődő ciklusokban.
- A libstdc++ könyvtár az std és std.compat modulok kísérleti támogatását valósítja meg.
- A „{0}” inicializáló használata a C és C++ kódokban lévő uniókhoz már nem garantálja, hogy az összes tartalom törlődik, hanem az unió első elemének nullázását eredményezi. A teljes unió törléséhez használja a C23 specifikációban meghatározott "{}" kifejezést, vagy adja meg a "-fzero-init-padding-bits=unions" beállítást a régi viselkedés visszaállításához.
- A "musttail" attribútum ([[gnu::musttail]] és [[clang::musttail]]) támogatása a garantált farokhívásokhoz. Az attribútum azokra a return utasításokra vonatkozik, amelyek rekurzív meghívást adnak az aktuális függvényhez, és biztosítja, hogy egy ilyen hívás farokrekurziót használjon, ami nem foglal le további memóriát a veremben (kiküszöböli annak kockázatát, hogy nagyon sok hívás esetén kifogyjon a memória).
- A flag_enum attribútum ([[gnu::flag_enum]] és [[clang::flag_enum]]) megvalósítása a felsorolásokra alkalmazott támogatással jelzi, hogy a tartalom bitenkénti műveletekben használatos (megakadályozza a figyelmeztetéseket -Wswitch módban).
- Támogatás hozzáadva a "counted_by" attribútumhoz, amellyel rugalmas tömbbel lehet megadni egy mezőt egy szerkezetben, amely meghatározza az elemek számát. Az attribútum felhasználható a puffertúlcsordulás-ellenőrzések hatékonyságának javítására.
- A függvényekhez hozzáadtuk a "nonnull_if_nonzero" attribútumot, amely meghatározza, hogy egyes függvényparaméterek mutatókkal csak akkor lehetnek NULL értékűek, ha egy másik paraméter nulla.
- Az "asm(….)" külső függvények beépítése megengedett. Az assembler beillesztéseknél megengedett a memória felülírása a verem piros zónájában (a verem tetején lévő terület).
- A továbbfejlesztett sablonkivonatnak köszönhetően a C++ kód fordítása gyorsabb.
- Új optimalizációk hozzáadva. Támogatták a korai kilépéshez kódot tartalmazó hurkok vektorizálását (például break vagy return híváson keresztül), még akkor is, ha az ilyen hurkok olyan dinamikusan lefoglalt tömböket vagy puffereket manipulálnak, amelyek mérete a fordításkor ismeretlen. Ha az -O2 opció meg van adva, akkor egyes könnyen vektorizálható hurkok vektorizálása engedélyezve van, amelyekhez nem áll rendelkezésre útszámláló információ.
- Hozzáadott növekményes optimalizálási mód a linkelési szakaszban (LTO, Link-Time Optimization), amely jelentősen csökkenti az újrafordítási időt LTO használatakor olyan helyzetekben, amikor kisebb változtatásokat hajtottak végre a kódon (egy funkciót szerkesztettek). A növekményes mód engedélyezéséhez a „-flto-incremental” opció javasolt.
- Nagyon nagy bemeneti fájlok továbbfejlesztett fordítása. 4096-nál nagyobb oszlopszámok nyomon követése. A hibák és figyelmeztetések helyének pontosabb jelzése nagyon nagy fájlokban.
- A jelentések jobb láthatósága a problémák diagnosztizálása során. Például a probléma helye a „⚠️” szimbólummal van kiemelve, a C++ sablonok hibáira vonatkozó kimenet elrendezése megváltozott, a C23 szabványra való áttérés egyszerűsítésére tippeket adtak hozzá, és a színséma is átalakult. Hozzáadtuk a diagnosztika Sarif formátumban történő kimenetének lehetőségét (-fdiagnostics-format=sarif-file).
- Megvalósult a libgdiagnostics könyvtár, amely lehetővé teszi a diagnosztikai üzenetek tervezésével kapcsolatos GCC-képességek integrálását a projektekbe (például használhat idézési, kiemelési és javítási tippeket).
- "-Wtrailing-whitespace" és "-Wleading-whitespace" figyelmeztetések hozzáadva a maradék szóköz észleléséhez a sorok végén és extra szóközök észleléséhez a sorok elején.
- "-Wheader-guard" figyelmeztetés hozzáadva a fejlécvédő makrók problémáinak jelentéséhez, amelyek megakadályozzák a fejlécfájl újbóli felvételét.
- A D nyelv kezelőfelülete a 2.111.0 verzióra frissült.
- Az előjel nélküli egész számok támogatása hozzáadásra került a Fortran kezelőfelületéhez.
- A csomag tartalmaz egy fordítót a COBOL nyelvhez, a gcobolt, amely támogatja az x86-64 és AArch64 platformokat, és nem 32 bites rendszereken való használatra készült. A fordító végrehajtja az ISO/IEC 1989:2023 specifikációt, és megfelel a legtöbb NIST CCVS/85 tesztnek.
- Folytatódtak az OpenMP 5.0, 5.1, 5.2 és 6.0 (Open Multi-Processing) szabványok megvalósítása, amelyek meghatározzák az API-t és a párhuzamos programozási módszerek alkalmazásának módszereit többmagos és hibrid (CPU+GPU/DSP) rendszereken osztott memóriával és vektorizációs egységekkel (SIMD). Támogatás hozzáadva a metadirektívákhoz és a mozaik, a kibontás, az interop és a kiküldési konstrukciókhoz. Egyes AMD és NVIDIA GPU-k esetében hozzáadásra került az egységes megosztott memória támogatása (az unified_shared_memory megadásával engedélyezhető a "requires" direktívában). Támogatás hozzáadva a "self_maps" kifejezéshez.
- Az AArch64 architektúra háttérprogramja frissítve lett, hogy támogassa a MinGW platformot (aarch64-w64-mingw32). Több mint 20 ARM8 bővítmény került bevezetésre, és az ACLE (Arm C Language Extensions) bővítmény támogatása továbbfejlesztett. Számos fejlesztés történt a kódgenerátoron. Hozzáadott CPU támogatás:
- Apple A12 (apple-a12)
- Apple M1 (apple-m1)
- Apple M2 (apple-m2)
- Apple M3 (apple-m3)
- Kar Cortex-A520AE (cortex-a520ae)
- Kar Cortex-A720AE (cortex-a720ae)
- Kar Cortex-A725 (cortex-a725)
- Kar Cortex-R82AE (cortex-r82ae)
- Kar Cortex-X925 (cortex-x925)
- Kar Neoverse N3 (neoverse-n3)
- Arm Neoverse V3 (neoverse-v3)
- Arm Neoverse V3AE (neoverse-v3ae)
- FUJITSU-MONAKA (fujitsu-monaka)
- NVIDIA Grace
- NVIDIA Olympus (olympus)
- Qualcomm Oryon-1 (Oryon-1)
- Az AMD Radeon GPU (GCN) kódgeneráló háttérrendszer frissítve lett, hogy támogassa a libstdc++ könyvtárat, és kísérleti kódgenerálási támogatást adtunk a gfx9-generic, gfx10-3-generic és gfx11-generic eszközsorozathoz.
- Az x86-os háttérrendszer mostantól támogatja az Intel utasításkészlet architektúra-kiterjesztéseit: AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Támogatás hozzáadva az Intel Diamond Rapids és Xeon Phi CPU-khoz.
- Kibővített háttérszolgáltatások LoongArch és AVR platformokhoz.
- Eltávolítottuk a Nios II processzorokban használt nios2 célarchitektúra támogatását. Az ILP32 ABI (-mabi=ilp32) támogatása az AArch64 portban elavult, és a következő nagyobb kiadásban megszűnik.
Forrás: opennet.ru
