Efter ett Ärs utveckling har den kostnadsfria GCC-kompilatorsviten GCC 15.1 slÀppts, den första stora utgÄvan i den nya GCC 15.x-grenen. Enligt versionsnumreringsschemat anvÀndes version 15.0 under utvecklingen, och strax före utgivningen av GCC 15.1 hade en gren av GCC 16.0 redan splittrats, vilket kommer att ligga till grund för nÀsta stora utgÄva, GCC 16.1.
HuvudÀndringar:
- Vid kompilering av C-program anvĂ€nds C23-standarden (Change Summary) med GNU-tillĂ€gg ("-std=gnu23") som standard. Tidigare anvĂ€ndes C17-standarden som standard (-std=gnu17). Ăndringen kan potentiellt orsaka problem nĂ€r man bygger befintliga projekt pĂ„ grund av inkluderingen av nullptr-konstanten, typen _BitInt(n) och nyckelorden bool, true och false, vilket kan komma i konflikt med liknande namngivna identifierare som definieras i applikationer.
- Följande funktioner i C23-standarden har implementerats:
- Direktivet "#embed" Àr utformat för att bÀdda in binÀra resurser i kod.
- Attributet "unsequenced", vilket indikerar att resultatet inte beror pÄ exekveringsordningen.
- Attributet "reproducerbar" indikerar att funktionen alltid returnerar samma resultat med samma input, d.v.s. inte beror pÄ andra faktorer.
- Delar av den framtida C2Y-standarden har implementerats (-std=c2y och -std=gnu2y):
- Möjlighet att deklarera variabler i en "if"-sats, till exempel "if (int x = get ()) {...}".
- Stöd för att namnge loopar för att referera till dem i kod. yttre: för (int i = 0; i < IK; ++ i) { switch (i) { fall 1: break; // hoppar till CONT1 fall 2: break yttre; // hoppar till CONT2 } // CONT1 } // CONT2
- Stöd för att ange intervall av heltalsvÀrden i kasusuttryck, som "fall 1...10:".
- Suffixen "i" och "j" för att beteckna den imaginÀra delen i komplexa tal.
- Möjlighet att anvĂ€nda operatorerna "++" och "â" med komplexa tal.
- Konstruktionen "_Generic(type, expr1, expr2, âŠ)" för att vĂ€lja ett uttryck baserat pĂ„ operandtypen.
- Stöd för Ätkomst av byte-arrayer som andra objekttyper, sÄsom strukturer och fackföreningar.
- Stöd för att tillÀmpa operatorn "alignof" pÄ ofullstÀndiga arrayer (de som deklareras utan att ange en storlek, till exempel "int a[]").
- Lagt till ny syntax för oktala, hexadecimala och universella tecken escape-sekvenser. IstÀllet för "\u", "\x" och "\nnn" föreslÄs sekvenserna "\u{}", "\o{}" och "\x{}", dÀr valfritt antal siffror kan anges.
- Inbyggda funktioner "__builtin_stdc_rotate_left" och "__builtin_stdc_rotate_right".
- NolllÀngdsoperationer pÄ NULL-pekare Àr tillÄtna (t.ex. "sizeof(*p)").
- Frontend för C++-sprÄket implementerar funktioner som utvecklas för den framtida C++26-standarden:
- Variationsoperator "vÀn" ("vÀn Ts...").
- Möjligheten att anvÀnda nyckelordet constexpr med en variant av new-operatorn (placement new) för att placera ett objekt i förallokerat minne vid kompileringstid.
- Felutmatning vid borttagning av en pekare till en ofullstÀndig typ.
- Syntaxen för att definiera variadiska parametrar med en ellips utan föregÄende kommatecken (till exempel nÀr du anger "void e(int...)" istÀllet för "void e(int, ...)") har förÄldrats.
- Indexering av ett parameterpaket i mallar.
- Attribut för strukturerade bindningar;
- Syntax '= delete("orsak"');
- Inkludering av "@", "$" och "`" i den grundlÀggande teckenuppsÀttningen.
- Det Àr förbjudet att anvÀnda makron för att deklarera moduler.
- Möjlighet att anvÀnda strukturerad bindning som ett villkor i if- och switch-satser.
- Stöd för direkt arrayjÀmförelse (t.ex. "int arr1[5]; int arr2[5]; bool same = arr1 == arr2") har upphört.
- "#embed"-mekanismen för inbÀddning av binÀra resurser.
- Mallklassen is_trivial har fasats ut.
- Lade till C++23-funktioner:
- TillÄt viss anvÀndning av "export"-direktivet och tillÄt anvÀndning av "export {}".
- Stöd för att förlÀnga livslÀngden för tillfÀlliga objekt för loopar som itererar över intervall.
- Biblioteket libstdc++ implementerar experimentellt stöd för modulerna std och std.compat.
- Att anvÀnda "{0}"-initieraren för fackföreningar i C- och C++-kod garanterar inte lÀngre att allt innehÄll rensas, utan resulterar istÀllet i att det första elementet i föreningen nollstÀlls. För att rensa hela unionen, anvÀnd "{}"-uttrycket som definierats i C23-specifikationen, eller ange alternativet "-fzero-init-padding-bits=unions" för att ÄterstÀlla det gamla beteendet.
- Implementerat stöd för "musttail"-attributet ([[gnu::musttail]] och [[clang::musttail]]) för garanterade svansanrop. Attributet gÀller för retursatser som gör ett rekursivt anrop till den aktuella funktionen, och sÀkerstÀller att ett sÄdant anrop kommer att anvÀnda svansrekursion, vilket inte allokerar ytterligare minne pÄ stacken (eliminerar risken att minnet tar slut med ett mycket stort antal anrop).
- Implementerat stöd för attributet flag_enum ([[gnu::flag_enum]] och [[clang::flag_enum]]) tillÀmpat pÄ upprÀkningar för att indikera att innehÄllet anvÀnds i bitvisa operationer (förhindrar varningar i -Wswitch-lÀge).
- Lade till stöd för attributet "counted_by", som kan anvÀndas för att specificera ett fÀlt i en struktur med en flexibel array som bestÀmmer antalet element. Attributet kan anvÀndas för att förbÀttra effektiviteten i kontroller av buffertspill.
- Lade till attributet "nonnull_if_nonzero" till funktioner, vilket anger att vissa funktionsparametrar med pekare kan vara NULL endast om en annan parameter Àr noll.
- Utökade assembler-införande "asm(âŠ.)" externa funktioner Ă€r tillĂ„tna. I assembler-inlĂ€gg Ă€r det tillĂ„tet att skriva över minne i den röda zonen av stacken (omrĂ„det överst i stacken).
- Kompileringen av C++-kod gÄr snabbare tack vare förbÀttrad mallhashning.
- Lade till nya optimeringar. Stöd har implementerats för vektoriseringsslingor som innehÄller kod för tidig exit (till exempel via ett paus- eller returanrop), Àven om sÄdana loopar manipulerar dynamiskt allokerade arrayer eller buffertar vars storlek Àr okÀnd vid kompileringstidpunkten. NÀr alternativet -O2 Àr specificerat, aktiveras vektorisering av nÄgra lÀtt vektoriserbara slingor för vilka tripcountinformation inte Àr tillgÀnglig.
- Lade till inkrementellt optimeringslÀge vid lÀnkningsstadiet (LTO, Link-Time Optimization), vilket avsevÀrt minskar omkompileringstiden vid anvÀndning av LTO i situationer dÀr mindre Àndringar har gjorts i koden (en funktion har redigerats). För att aktivera inkrementellt lÀge, föreslÄs alternativet "-flto-inkrementell".
- FörbÀttrad kompilering av mycket stora indatafiler. Implementerad spÄrning av kolumnnummer större Àn 4096. FörbÀttrad noggrannhet för att ange platsen för fel och varningar i mycket stora filer.
- FörbĂ€ttrad synlighet för rapporter vid diagnos av problem. Till exempel Ă€r platsen för problemet markerad med "â ïž"-symbolen, layouten för utdata för fel i C++-mallar har Ă€ndrats, tips har lagts till för att förenkla övergĂ„ngen till C23-standarden och fĂ€rgschemat har gjorts om. Lade till möjligheten att mata ut diagnostik i Sarif-format (-fdiagnostics-format=sarif-fil).
- Biblioteket libgdiagnostics har implementerats, vilket gör att du kan integrera GCC-funktioner relaterade till utformningen av diagnostiska meddelanden i dina projekt (du kan till exempel anvÀnda citat, markering och korrigeringstips).
- Lade till varningar "-Wtrailing-whitespace" och "-Wleading-whitespace" för att upptÀcka kvarvarande blanksteg i slutet av rader och extra blanksteg i början av rader.
- Lade till "-Wheader-guard" varning för att rapportera problem i header guard makron som förhindrar en header fil frÄn att inkluderas igen.
- Frontend för D-sprÄket har uppdaterats till version 2.111.0.
- Stöd för osignerade heltal har lagts till i Fortran-grÀnssnittet.
- Paketet innehÄller en kompilator för COBOL-sprÄket, gcobol, som stöder plattformarna x86-64 och AArch64 och Àr inte designad för anvÀndning pÄ 32-bitarssystem. Kompilatorn implementerar ISO/IEC 1989:2023-specifikationen och klarar de flesta NIST CCVS/85-testerna.
- Implementeringen av OpenMP 5.0, 5.1, 5.2 och 6.0 (Open Multi-Processing) standarder, som definierar API och metoder för att tillÀmpa parallella programmeringsmetoder pÄ flerkÀrniga och hybridsystem (CPU+GPU/DSP) med delat minne och vektoriseringsenheter (SIMD), har fortsatt. Lade till stöd för metadirektiv och tile, unroll, interop och dispatch konstruktioner. För vissa AMD- och NVIDIA GPU:er har stöd för enhetligt delat minne lagts till (aktiverat genom att ange unified_shared_memory i "requires"-direktivet). Lade till stöd för uttrycket "self_maps".
- Backend för AArch64-arkitekturen har uppdaterats för att stödja MinGW-plattformen (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. MÄnga förbÀttringar har gjorts av kodgeneratorn. Tillagt CPU-stöd:
- 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
- NVIDIA Olympus (olympus)
- Qualcomm Oryon-1 (Oryon-1)
- AMD Radeon GPU (GCN) kodgenereringsbackend har uppdaterats för att stödja libstdc++-biblioteket och experimentell kodgenerering har lagts till för enhetsserierna gfx9-generic, gfx10-3-generic och gfx11-generic.
- x86-backend stöder nu Intels instruktionsuppsÀttningsarkitekturtillÀgg AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Tillagt stöd för Intel Diamond Rapids och Xeon Phi-processorer.
- Utökade backend-funktioner för LoongArch- och AVR-plattformar.
- Borttaget stöd för nios2-mÄlarkitekturen som anvÀnds i Nios II-processorer. Stöd för ILP32 ABI (-mabi=ilp32) i AArch64-porten har fasats ut och kommer att tas bort i nÀsta större version.
KĂ€lla: opennet.ru
