Efter ett Är av utveckling har den fria kompilatoruppsÀttningen GCC 15.1 slÀppts, den första betydande utgÄvan i den nya GCC 15.x-grenen. Enligt versionsnummersteorin anvÀndes version 15.0 under utvecklingen, och kort innan GCC 15.1:s lansering hade gren GCC 16.0 redan skapats, pÄ vilken nÀsta betydande release GCC 16.1 kommer att baseras.
Huvudsakliga förÀndringar:
- Vid kompilering av program pĂ„ C-sprĂ„ket anvĂ€nds standarden C23 som standard (Ă€ndringar översikt) med GNU-förlĂ€ngningar ("-std=gnu23"). Tidigare anvĂ€ndes standarden C17 som standard â "-std=gnu17". Ăndringen kan potentiellt orsaka problem vid byggandet av befintliga projekt pĂ„ grund av inkluderingen av konstanten nullptr, typen _BitInt(n) och nyckelorden bool, true och false som kan krocka med identifierare med samma namn angivna i applikationerna.
- Funktioner frÄn C23-standarden har implementerats:
- Direktivet "#embed" som anvÀnds för att bÀdda in binÀrresurser i koden.
- Attributet "unsequenced", som signalerar att resultatet inte beror pÄ exekveringsordningen.
- Attributet "reproducible", som anger att funktionen alltid returnerar samma resultat vid samma indatan, dvs. inte beror pÄ andra faktorer.
- Element frÄn den kommande standarden C2Y (-std=c2y och -std=gnu2y) har implementerats:
- Möjligheten att deklarera variabler inuti "if"-satsen, till exempel "if (int x = get ()) {âŠ}".
- Stöd för att namnge loopar sÄ att de kan refereras till i koden. outer: for (int i = 0; i < IK; ++ i) { switch (i) { case 1: break; // hoppar till CONT1 case 2: break outer; // hoppar till CONT2 } // CONT1 } // CONT2
- Stöd för att ange intervall av heltal i "case"-uttryck, till exempel "case 1 ⊠10:".
- Suffixen "i" och "j" för att indikera den imaginÀra delen i komplexa tal.
- Möjligheten att anvĂ€nda operatörerna "++" och "â" med komplexa tal.
- Konstruktionen "_Generic(type, expr1, expr2, âŠ)" för att vĂ€lja uttryck baserat pĂ„ operandens typ.
- Stöd för att referera till byte-arrayer som andra typer av objekt, sÄsom strukturer och unioner.
- Stöd för att tillÀmpa operatören "alignof" pÄ ofullstÀndiga arrayer (deklarerade utan storleksangivelse, t.ex. "int a[]").
- Ny syntax för oktala, hexadecimala och universella escape-sekvenser för tecken har lagts till. IstÀllet för «\u», «\x» och «\nnn» erbjuds sekvenserna «\u{}», «\o{}» och «\x{}», som lÄter dig ange ett valfritt antal siffror.
- Inbyggda funktioner «__builtin_stdc_rotate_left» och «__builtin_stdc_rotate_right».
- Operationer med nollÀngd tillÄts pÄ NULL-pekare (t.ex. «sizeof(*p)»).
- I frontend för C++-sprÄket har funktioner utvecklats för den framtida standarden C++26:
- Variabeloperatören «friend» («friend TsâŠÂ»).
- Möjligheten att anvÀnda nyckelordet «constexpr» med sorten av operatorn «new» (placement new) för att placera ett objekt i förhand tilldelad minne under kompilering.
- Felmeddelande vid borttagning av en pekare till en ofullstÀndig typ.
- Syntaxen för att definiera variabla parametrar med tre prickar utan föregĂ„ende kommatecken har förklarats som förĂ„ldrad (till exempel nĂ€r det anges «void e(intâŠ)» istĂ€llet för «void e(int, âŠ)»).
- Indexering av parameterpaket i mallar.
- Attribut för strukturerade bindningar;
- Syntax â= delete(«orsak»)â;
- Inkludering av «@», «$» och «`» i den basala uppsÀttningen av tecken.
- AnvÀndning av makron för att deklarera moduler Àr förbjudet.
- Möjlighet att anvÀnda strukturerad bindning som condition i if- och switch-uttalanden.
- Stöd för direkt jÀmförelse av arrayer har upphört (t.ex. «int arr1[5]; int arr2[5]; bool same = arr1 == arr2»).
- Mekanism «#embed» för att inkludera binÀra resurser.
- Den mallklass is_trivial har förklarats som förÄldrad.
- Funktioner för C++23 har lagts till:
- Förbud mot vissa anvÀndningar av direktivet «export» och tillÄtelse att anvÀnda «export {}».
- Stöd för att förlÀnga livslÀngden för temporÀra objekt i «for»-loopar som itererar över omrÄden.
- I libstdc++-biblioteket har experimentellt stöd för moduler std och std.compat införts.
- AnvÀndning av initialiseraren «{0}» för unioner i C- och C++-kod garanterar nu inte rensning av hela innehÄllet, utan sÀtter bara den första unionselementet till noll. För att rensa hela unionen bör uttrycket «{}» anvÀndas, vilket definieras i C23-specifikationen, eller ange alternativet «-fzero-init-padding-bits=unions» för att ÄterfÄ det gamla beteendet.
- Stöd för attributet «musttail» ([[gnu::musttail]] och [[clang::musttail]]) har införts för garanterade svansanrop. Attributet tillÀmpas pÄ return-uttryck dÀr en rekursiv anrop av den aktuella funktionen görs, och garanterar att sÄdana anrop kommer att anvÀnda svansrekursion, vilket inte allokerar ytterligare minne pÄ stacken (minimerar risken för minnesutarmning vid ett mycket stort antal anrop).
- Stöd för attributet flag_enum ([[gnu::flag_enum]] och [[clang::flag_enum]]) har implementerats, vilket tillÀmpas pÄ upprÀkningar för att indikera att innehÄllet anvÀnds i bitoperationer (exkluderar varningsutskrift i lÀget "-Wswitch").
- Stöd för attributet "counted_by" har lagts till, som gör att man kan ange ett fÀlt i en struktur med en flexibel array som definierar antalet element. Attributet kan anvÀndas för att öka effektiviteten i grÀnskontrollera.
- För funktioner har attributet "nonnull_if_nonzero" lagts till, vilket anger att vissa funktionsparameter med pekare kan vara NULL, endast om en annan parameter Àr noll.
- AnvĂ€ndning av utökade assemblerinsĂ€ttningar "asm (âŠ.)" utanför funktioner har tillĂ„tits. I assemblerinsĂ€ttningar Ă€r det tillĂ„tet att skriva över minnet i den röda zonen av stacken (omrĂ„det högst upp pĂ„ stacken).
- Kompilering av C++-kod har accelererats tack vare förbÀttrad hashning av mallar.
- Nya optimeringar har lagts till. Stöd för vektorisering av loopar dÀr det finns kod för för tidig utgÄng (t.ex. genom anrop av break eller return), Àven om sÄdana loopar manipulerar dynamiskt allokerade arrayer eller buffertar vars storlek Àr okÀnd vid kompilering. Vektorisering av vissa lÀtt vektorisering loopar Àr aktiverad med alternativet "-O2", dÀr information om antalet iterationer (tripcount) saknas.
- Ett lÀge för inkrementell optimering vid lÀnkning (LTO, Link-Time Optimization) har lagts till, vilket avsevÀrt minskar tiden för omkompilering vid anvÀndning av LTO i situationer dÀr smÄ förÀndringar har gjorts i koden (en funktion har redigerats). För att aktivera det inkrementella lÀget föreslÄs alternativet "-flto-incremental".
- Kompileringen av mycket stora ingÄngsfiler har förbÀttrats. SpÄrning av kolumnnummer som överskrider 4096 har implementerats. Noggrannheten i att ange platsen för fel och varningar i mycket stora filer har ökat.
- Tydligheten i rapporter vid diagnostisering av problem har ökat. Till exempel Ă€r platsen för problemet framhĂ€vd med symbolen "â ïž", utformningen av utskriften har Ă€ndrats vid fel i C++-mallar, tips har lagts till för att förenkla övergĂ„ngen till standarden C23, och fĂ€rgschemat har omarbetats. Möjlighet till diagnosutskrift i formatet Sarif (-fdiagnostics-format=sarif-file) har lagts till.
- Biblioteket libgdiagnostics har implementerats, vilket gör det möjligt att integrera GCC:s funktioner för formatering av diagnosmeddelanden i sina projekt (till exempel kan man anvÀnda verktyg för citat, syntaxmarkering och felrÀttningstips).
- Varningarna "-Wtrailing-whitespace" och "-Wleading-whitespace" har lagts till för att identifiera kvarvarande mellanslag i slutet av rader och överflödiga mellanslag i början av rader.
- Varningen "-Wheader-guard" har lagts till för att informera om problem med makron för skydd av headerfiler som förhindrar att samma headerfil inkluderas flera gÄnger.
- Frontend för sprÄk D har uppdaterats till version 2.111.0.
- Frontend för sprÄk Fortran har lagt till stöd för osignerade heltal.
- Kompilatorn för sprÄket COBOL - gcobol, har inkluderats, och stödjer plattformar x86-64 och AArch64, och Àr inte avsedd för anvÀndning pÄ 32-bitars system. Kompilatorn implementerar specifikationen ISO/IEC 1989:2023 och klarar de flesta testerna NIST CCVS/85.
- Implementeringen av standarderna OpenMP 5.0, 5.1, 5.2 och 6.0 (Open Multi-Processing), som definierar API och metoder för tillÀmpning av parallell programmering pÄ flerprocessor- och hybrid (CPU+GPU/DSP) system med delad minne och vektorisering (SIMD), har fortsatt. Stöd för metadirektiv och konstruktioner som tile, unroll, interop och dispatch har lagts till. För vissa AMD- och NVIDIA-GPU:er har stöd för enhetligt delat minne lagts till (aktiveras genom att ange unified_shared_memory i direktivet "requires"). Stöd för uttrycket "self_maps" har lagts till.
- Backend för arkitekturen AArch64 har fÄtt stöd för plattformen MinGW (aarch64-w64-mingw32). Mer Àn 20 ARM8-tillÀgg har implementerats och stödet för tillÀgget ACLE (Arm C Language Extensions) har förbÀttrats. Flera förbÀttringar har lagts till i kodgeneratorn. Stöd har lagts till för CPU:
- 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)
- Backend för kodgenerering för GPU AMD Radeon (GCN) har implementerat stöd för biblioteket libstdc++ och lagt till experimentellt stöd för kodgenerering för enheter i serierna gfx9-generic, gfx10-3-generic och gfx11-generic.
- Backend för x86-arkitekturen har fÄtt stöd för utvidgningar av Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Stöd har lagts till för Intel Diamond Rapids och Xeon Phi CPU:er.
- Möjligheterna för backend har utökats för LoongArch- och AVR-plattformar.
- Stödet för mÄlarkitekturen nios2, som anvÀnds i Nios II-processorer, har tagits bort. Stödet för ABI ILP32 (-mabi=ilp32) i AArch64-porten har förklarats som förÄldrat och kommer att tas bort i nÀsta större version.
KĂ€lla: opennet.ru
