A GCC 15 fordítócsomag kiadása

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

Hozzászólás