Efter et års udvikling er udgivet version 15.1 af det frie sæt af compilere GCC, den første betydelige udgave i den nye GCC 15.x-gren. I henhold til versionsnumreringsskemaet blev version 15.0 brugt under udviklingen, og kort før udgivelsen af GCC 15.1 blev GCC 16.0-grenen allerede oprettet, som vil danne grundlaget for den næste betydelige udgivelse, GCC 16.1.
Vigtige ændringer:
- Når programmer skrives i C, bruges standard S23 som standard (ændringsoversigt) med GNU-udvidelser (‘-std=gnu23’). Tidligere blev standard C17 brugt som standard (‘-std=gnu17’). Ændringen kan potentielt forårsage problemer ved kompilering af eksisterende projekter på grund af inkluderingen af konstanten nullptr, typen _BitInt(n) og nøgleordene bool, true og false, som kan komme i konflikt med appens identificerende navne.
- Mulighederne i standard C23 er implementeret:
- Direktivet ‘#embed’, der er beregnet til at indlejre binære ressourcer i koden.
- Attributten ‘unsequenced’, der signalerer, at resultatet ikke afhænger af udførelsesrækkefølgen.
- Attributten ‘reproducible’, der angiver, at funktionen altid returnerer det samme resultat ved ens inddata, dvs. ikke afhænger af andre faktorer.
- Elementer fra den kommende standard C2Y (-std=c2y og -std=gnu2y) er implementeret:
- Muligheden for at erklære variable i ‘if’-sætningen, for eksempel ‘if (int x = get ()) {…}’.
- Understøttelse af navngivning af løkker, så der kan henvises til dem i koden. outer: for (int i = 0; i < IK; ++i) { switch (i) { case 1: break; // hopper til CONT1 case 2: break outer; // hopper til CONT2 } // CONT1 } // CONT2
- Understøttelse af angivelse af interval af heltal i ‘case’-udtryk, for eksempel ‘case 1 … 10:’.
- Suffikserne ‘i’ og ‘j’ til at angive den imaginære del af komplekse tal.
- Muligheden for at anvende operatorerne ‘++’ og ‘--’ med komplekse tal.
- Konstruktionen ‘_Generic(type, expr1, expr2, …)’ til at vælge et udtryk baseret på operandens type.
- Understøttelse af adgangen til bytearrays som andre typer objekter, såsom strukturer og unioner.
- Understøttelse af at anvende operatoren ‘alignof’ på ufuldstændige arrays (erklæret uden størrelsesangivelse, for eksempel ‘int a[]’).
- Der er tilføjet ny syntaks til oktale, hexadecimale og universelle escape-sekvenser for tegn. I stedet for «\u», «\x» og «\nnn» er der foreslået sekvenserne «\u{}», «\o{}» og «\x{}», hvor et vilkårligt antal cifre kan angives.
- Indbyggede funktioner «__builtin_stdc_rotate_left» og «__builtin_stdc_rotate_right».
- Operationer med nul-længde er tilladt på NULL-pegere (f.eks. «sizeof(*p)»).
- Frontendmuligheder for C++ er implementeret, hvilket udvikles til den fremtidige standard C++26:
- Variabel operator «friend» («friend Ts…»).
- Mulighed for at anvende nøgleordet «constexpr» med en variant af operatoren «new» (placement new) til at placere et objekt i forudallokeret hukommelse under kompilering.
- Fejlmeddelelse ved sletning af pointer til en ufuldstændig type.
- Syntaksen til deklaration af variabelparametre med ellipsis uden forudgående komma (f.eks. når der angives „void e(int…)“ i stedet for „void e(int, …)“) er erklæret forældet.
- Indeksering af parameterpakker i skabeloner.
- Attributter til strukturerede bindinger;
- Syntaks ‘= delete(«årsag»)’;
- Inkludering af «@», «$» og «`» i den grundlæggende tegnsæt.
- Brug af makroer til at erklære moduler er forbudt.
- Mulighed for at anvende struktureret binding som betingelse i if- og switch-sætninger.
- Understøttelse af direkte sammenligning af arrays er ophørt (f.eks. «int arr1[5]; int arr2[5]; bool same = arr1 == arr2»).
- Mechanismen «#embed» til indlejring af binære ressourcer.
- Den skabelonklasse is_trivial er erklæret forældet.
- C++23-funktioner er tilføjet:
- Forbud mod visse anvendelser af direktivet «export» og tilladelse til at bruge «export {}».
- Understøttelse af forøgelse af levetid for midlertidige objekter i for-løkker, der itererer over intervaller.
- Eksperimentel støtte til std- og std.compat-moduler er implementeret i libstdc++-biblioteket.
- Brug af initialisatoren «{0}» for unioner i C- og C++-kode garanterer ikke længere nulstilling af hele indholdet, men resulterer i nulstilling af det første element i unionen. For at nulstille hele unionen skal udtrykket «{}», defineret i C23-specifikationen, anvendes, eller indstillingen «-fzero-init-padding-bits=unions» skal angives for at genskabe den gamle adfærd.
- Understøttelse af attributten «musttail» ([[gnu::musttail]] og [[clang::musttail]]) er implementeret for garanterede haleopkald. Attributten anvendes på return-udtryk, hvor der foretages et rekursivt opkald af den nuværende funktion, og sikrer, at et sådant opkald benytter hale-rekursion, hvor der ikke tildeles yderligere hukommelse på stakken (som udelukker risikoen for opbrugning af hukommelse ved et meget stort antal opkald).
- Implementeret understøttelse af flag_enum attributten ([[gnu::flag_enum]] og [[clang::flag_enum]]), som anvendes på enumerationer for at indikere, at indholdet bruges i bitoperationer (ekskluderer advarselsudgang i "-Wswitch" tilstand).
- Tilføjet understøttelse af attributten "counted_by", som kan anvendes til at angive et felt i en struktur med et fleksibelt array, der definerer antallet af elementer. Attributten kan bruges til at forbedre effektiviteten af buffer-grænseoverskridelseschecks.
- For funktioner er attributten "nonnull_if_nonzero" tilføjet, som definerer, at visse funktionsparametre med pegepinde kun kan acceptere NULL-værdien, hvis en anden parameter er nul.
- Det er tilladt at bruge udvidede assemblerindsætninger "asm(….)" uden for funktioner. I assemblerindsætninger er det tilladt at overskrive hukommelsen i den røde zone på stakken (området på toppen af stakken).
- Kompilering af C++-kode er blevet hurtigere takket være forbedret hashning af skabeloner.
- Nye optimeringer er tilføjet. Understøttelse af vektorisering af løkker, der indeholder kode til tidlige udgange (f.eks. via et break eller return), selvom sådanne løkker manipulerer dynamisk tildelte arrays eller buffere, hvis størrelse er ukendt på kompileringstidspunktet. Når man angiver indstillingen "-O2", er vektorisering af nogle let vektorisérbare løkker aktiveret, for hvilke information om antallet af iterationer (tripcount) mangler.
- Der er tilføjet en inkrementel optimeringsmode under linking (LTO, Link-Time Optimization), der væsentligt forkorter genkompileringstiden ved brug af LTO i situationer, hvor der er foretaget små ændringer i koden (f.eks. redigeret én funktion). Den inkrementelle tilstand kan aktiveres med indstillingen "-flto-incremental".
- Kompileringen af meget store inputfiler er forbedret. Understøttelse af sporing af kolonnenumre, der overstiger 4096, er blevet implementeret. Præcisionen af placeringen af fejl og advarsler i meget store filer er forbedret.
- Rapporter for diagnosticering af problemer er blevet mere overskuelige. For eksempel er der sikret fremhævelse af problemets oprindelse med symbolet "⚠️", layoutet for output ved fejl i C++-skabeloner er ændret, der er tilføjet tips til at lette overgangen til standarden C23, og farveskemaet er blevet redesignet. Muligheden for at udskrive diagnostik i Sarif-format (-fdiagnostics-format=sarif-file) er blevet tilføjet.
- Biblioteket libgdiagnostics er implementeret, hvilket muliggør integration af GCC's funktioner relateret til diagnosticering (for eksempel kan man bruge citatværktøjer, fremhævelse og fejlrettelsesforslag).
- Advarslerne «-Wtrailing-whitespace» og «-Wleading-whitespace» er tilføjet for at identificere resterende mellemrum i slutningen af linjer og overflødige mellemrum i begyndelsen af linjer.
- Advarslen «-Wheader-guard» er tilføjet for at informere om problemer med beskyttelsesmakroer i headerfiler, der forhindrer genindlæsning af headerfiler.
- Frontend til sprog D er blevet opdateret til version 2.111.0.
- Frontend til Fortran-sprog har fået support til usignerede heltal.
- Kompilatoren til COBOL-sprog — gcobol er inkluderet, som understøtter platforme x86-64 og AArch64, og er ikke beregnet til brug på 32-bit systemer. Kompilatoren implementerer specifikationen ISO/IEC 1989:2023 og klarer størstedelen af NIST CCVS/85 testene.
- Implementeringen af standarderne OpenMP 5.0, 5.1, 5.2 og 6.0 (Open Multi-Processing), der definerer API og metoder til brug af parallelt programmering på mangekerne- og hybride (CPU+GPU/DSP) systemer med delt hukommelse og vektoriseringsblokke (SIMD), fortsættes. Support til metadirektiver og konstruktioner som tile, unroll, interop og dispatch er tilføjet. Til nogle AMD- og NVIDIA-GPU'er er support for unified shared memory tilføjet (aktiveres ved at angive unified_shared_memory i direktivet «requires»). Support for udtrykket «self_maps» er tilføjet.
- Backend for arkitekturen AArch64 har fået support til platformen MinGW (aarch64-w64-mingw32). Mere end 20 ARM8-udvidelser er implementeret, og supporten for ACLE (Arm C Language Extensions) er forbedret. Der er foretaget mange forbedringer i kodegeneratoren. Support for CPU er tilføjet:
- 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)
- I backend til kodegenerering for GPU AMD Radeon (GCN) er supporten for biblioteket libstdc++ implementeret, og der er tilføjet eksperimentel support til kodegenerering for enheder gfx9-generic, gfx10-3-generic og gfx11-generic.
- Backend til x86-arkitekturen har fået tilføjet support for Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Support for CPU Intel Diamond Rapids og Xeon Phi er blevet tilføjet.
- Backend-funktionaliteten for LoongArch- og AVR-platforme er blevet udvidet.
- Supporten for målarcitekturen nios2, anvendt i Nios II-processorer, er blevet fjernet. Den er erklæret forældet og vil blive fjernet i den næste store udgivelse, mens support for ABI ILP32 (-mabi=ilp32) i porten til AArch64 også er blevet erklæret forældet.
Kilde: opennet.ru
