Na een jaar van ontwikkeling is de vrije verzameling van compilers GCC 15.1 uitgebracht, de eerste significante release in de nieuwe tak GCC 15.x. Volgens het release-nummeringssysteem werd versie 15.0 gebruikt tijdens de ontwikkelingsfase, en kort voor de uitgave van GCC 15.1 is de tak GCC 16.0 al afgesplitst, waarop de volgende significante release GCC 16.1 zal worden gebaseerd.
Belangrijkste wijzigingen:
- Bij het compileren van programma's in de programmeertaal C is standaard de C23-standaard (overzicht van wijzigingen) ingeschakeld met GNU-uitbreidingen (‘-std=gnu23’). Eerder werd de C17-standaard als standaard gebruikt — ‘-std=gnu17’). Deze wijziging kan mogelijk problemen veroorzaken bij het bouwen van bestaande projecten vanwege de toevoeging van de constante nullptr, het type _BitInt(n) en de sleutelwoorden bool, true en false, die in conflict kunnen komen met de in de applicaties opgegeven identiek genaamde identificatoren.
- De mogelijkheden van de C23-standaard zijn geïmplementeerd:
- De richtlijn ‘#embed’, bedoeld om binaire bronnen in de code in te voegen.
- De eigenschap ‘unsequenced’, die aangeeft dat het resultaat niet afhangt van de volgorde van uitvoering.
- De eigenschap ‘reproducible’, die aangeeft dat de functie altijd hetzelfde resultaat teruggeeft bij gelijke ingang, dwz niet afhankelijk is van andere factoren.
- Elementen van de toekomstige C2Y-standaard zijn geïmplementeerd (-std=c2y en -std=gnu2y):
- De mogelijkheid om variabelen in de ‘if’-operator te declareren, bijvoorbeeld, ‘if (int x = get ()) {…}’.
- Ondersteuning voor het toekennen van namen aan lussen zodat er in de code naar kan worden verwezen. outer: for (int i = 0; i < IK; ++ i) { switch (i) { case 1: break; // springt naar CONT1 case 2: break outer; // springt naar CONT2 } // CONT1 } // CONT2
- Ondersteuning voor het specificeren van bereiken van gehele getallen in ‘case’-uitspraken, bijvoorbeeld, ‘case 1 … 10:’.
- De suffixen ‘i’ en ‘j’ om de imaginaire component in complexe getallen aan te duiden.
- De mogelijkheid om de operators ‘++’ en ‘—’ te gebruiken met complexe getallen.
- De constructie ‘_Generic(type, expr1, expr2, …)’ om een expressie te kiezen op basis van het type van de operand.
- Ondersteuning voor het aanspreken van byte-arrays als andere typen objecten, zoals structuren en unies.
- Ondersteuning voor het toepassen van de operator ‘alignof’ op onvolledige arrays (gedeclareerd zonder formaat, bijvoorbeeld, ‘int a[]’).
- Er is een nieuwe syntaxis toegevoegd voor octale, hexadecimale en universele escape-sequenties voor tekens. In plaats van «\u», «\x» en «\nnn» zijn de sequenties «\u{}», «\o{}» en «\x{}» voorgesteld, waarin een willekeurig aantal cijfers kan worden opgegeven.
- Ingebouwde functies «__builtin_stdc_rotate_left» en «__builtin_stdc_rotate_right».
- Operaties met nul lengte zijn toegestaan op NULL-pointers (bijvoorbeeld «sizeof(*p)»).
- In de frontend voor de programmeertaal C++ zijn mogelijkheden geïmplementeerd die zijn ontwikkeld voor de toekomstige standaard C++26:
- Variadische operator «friend» («friend Ts…»).
- De mogelijkheid om het sleutelwoord «constexpr» te gebruiken met een variant van de operator «new» (placement new) om een object tijdens de compilatie in vooraf toegewezen geheugen te plaatsen.
- Foutmelding bij het verwijderen van een pointer naar een onvolledig type.
- De syntaxis voor het definiëren van variabele parameters met een ellipsis zonder voorafgaande komma is deprecated (bijvoorbeeld wanneer 'void e(int...)' in plaats van 'void e(int, ...)' wordt opgegeven).
- Indexering van parameterpakketten in templates.
- Attributen voor gestructureerde bindings;
- Syntaxis ‘= delete(«reden»)’;
- Inbegrepen zijn «@», «$» en «`» in het basistekenrepertoire.
- Het gebruik van macro's voor het declareren van modules is verboden.
- De mogelijkheid om gestructureerde binding te gebruiken als voorwaarde in de if- en switch-statements.
- Ondersteuning voor directe vergelijking van arrays is stopgezet (bijvoorbeeld «int arr1[5]; int arr2[5]; bool same = arr1 == arr2»).
- Mechanisme «#embed» voor het inbedden van binaire bronnen.
- De sjabloonklaas is_trivial is verouderd verklaard.
- Nieuwe mogelijkheden van C++23 zijn toegevoegd:
- Verbod op bepaalde toepassingen van de directive «export» en toestemming voor het gebruik van «export {}».
- Ondersteuning voor het verlengen van de levensduur van tijdelijke objecten in for-lussen die door bereiken itereren.
- In de libstdc++-bibliotheek is experimentele ondersteuning voor modules std en std.compat geïmplementeerd.
- Het gebruik van de initializer «{0}» voor unies in C- en C++-code garandeert nu niet meer dat de hele inhoud wordt gewist, maar resulteert in het nulstellen van het eerste element van de unie. Voor het wissen van de gehele unie moet de expressie «{}» worden gebruikt, zoals gedefinieerd in de specificatie C23, of de optie «-fzero-init-padding-bits=unions» worden opgegeven om het oude gedrag te herstellen.
- Ondersteuning voor het attribuut «musttail» ([[gnu::musttail]] en [[clang::musttail]]) is geïmplementeerd voor gegarandeerde tail-calls. Het attribuut wordt toegepast op return-expressies waarin een recursieve aanroep van de huidige functie plaatsvindt, en garandeert dat een dergelijke aanroep tail-recursie gebruikt, waardoor er geen extra geheugen in de stack wordt toegewezen (dit sluit het risico uit van geheugenuitputting bij een zeer groot aantal aanroepen).
- Ondersteuning voor het attribuut flag_enum ([[gnu::flag_enum]] en [[clang::flag_enum]]) is geïmplementeerd, dat wordt toegepast op enumeraties om aan te geven dat de inhoud wordt gebruikt in bitbewerkingen (sluit waarschuwingen uit in de modus '-Wswitch').
- Ondersteuning voor het attribuut 'counted_by' is toegevoegd, waarmee een veld in een structuur met een flexibele array kan worden aangegeven dat het aantal elementen definieert. Het attribuut kan worden gebruikt om de efficiëntie van out-of-bounds controles te vergroten.
- Voor functies is het attribuut 'nonnull_if_nonzero' toegevoegd, dat bepaalt dat sommige functieparameters met pointers de waarde NULL alleen mogen aannemen als een andere parameter gelijk is aan nul.
- Uitgebreide assembly-invoegingen 'asm (...)' mogen nu buiten functies worden gebruikt. In de assembly-invoegingen is het toegestaan om geheugen in de rode zone van de stack (het gebied aan de bovenkant van de stack) te overschrijven.
- De compilatie van C++-code is versneld door verbeterde hashing van sjablonen.
- Nieuwe optimalisaties zijn toegevoegd. Ondersteuning voor het vectoriseren van lussen waarin zich code voor voortijdig verlaten bevindt (bijvoorbeeld via een break of return), zelfs als dergelijke lussen dynamisch toegewezen arrays of buffers manipuleren waarvan de grootte niet op compileertijd bekend is. Bij het opgeven van de optie '-O2' is de vectorisatie ingeschakeld voor enkele makkelijk te vectoriseren lussen waarvoor geen informatie over het aantal iteraties (tripcount) beschikbaar is.
- Een incrementele optimalisatiemodus tijdens het koppelen (LTO, Link-Time Optimization) is toegevoegd, die de hercompilatie-tijd aanzienlijk verkort bij het gebruik van LTO in situaties waarbij minimale wijzigingen in de code zijn aangebracht (één functie is bewerkt). Voor het inschakelen van de incrementele modus is de optie '-flto-incremental' voorgesteld.
- De compilatie van zeer grote invoerbestanden is verbeterd. Tracking van kolomnummers die groter zijn dan 4096 is gerealiseerd. De nauwkeurigheid van het aangeven van de locatie van fouten en waarschuwingen in zeer grote bestanden is verhoogd.
- De helderheid van rapporten bij het diagnosticeren van problemen is verbeterd. Bijvoorbeeld, de locatie van het probleem wordt gemarkeerd met het symbool '⚠️', de lay-out van de uitvoer bij fouten in C++-sjablonen is gewijzigd, er zijn tips toegevoegd om over te schakelen naar standaard C23, en het kleurenschema is herzien. Er is een mogelijkheid toegevoegd om diagnostiek in het Sarif-formaat uit te voeren (-fdiagnostics-format=sarif-file).
- De libgdiagnostics-bibliotheek is geïmplementeerd, waarmee je de GCC-mogelijkheden voor het formatteren van diagnostische berichten in je projecten kunt integreren (bijvoorbeeld, je kunt citatiemechanismen, syntaxhighlighting en suggesties voor correctie gebruiken).
- Waarschuwingen ‘-Wtrailing-whitespace’ en ‘-Wleading-whitespace’ zijn toegevoegd voor het detecteren van resterende spaties aan het einde van regels en overtollige spaties aan het begin van regels.
- De waarschuwing ‘-Wheader-guard’ is toegevoegd om te informeren over problemen met de include guards in headerbestanden die herhaalde inclusie van headerbestanden voorkomen.
- De frontend voor de D-taal is bijgewerkt naar versie 2.111.0.
- De frontend voor de Fortran-taal ondersteunt nu ongetekende gehele getallen.
- De compiler voor de COBOL-taal – gcobol – is opgenomen, die ondersteuning biedt voor de x86-64 en AArch64 platformen en niet bedoeld is voor gebruik op 32-bit systemen. De compiler implementeert de ISO/IEC 1989:2023 specificatie en doorstaat het merendeel van de NIST CCVS/85 tests.
- De implementatie van de OpenMP 5.0, 5.1, 5.2 en 6.0 normen (Open Multi-Processing), die API's en methoden voor parallel programmeren op multi-core en hybride (CPU+GPU/DSP) systemen met gedeeld geheugen en vectorisatie-eenheden (SIMD) definiëren, is voortgezet. Ondersteuning voor metadata-directieven en constructs zoals tile, unroll, interop en dispatch is toegevoegd. Voor sommige AMD en NVIDIA GPU's is ondersteuning voor unificeerbare gedeelde geheugen toegevoegd (geactiveerd via de unified_shared_memory optie in de ‘requires’ directief). Ondersteuning voor de expressie ‘self_maps’ is toegevoegd.
- In de backend voor de AArch64-architectuur is ondersteuning voor het MinGW-platform (aarch64-w64-mingw32) toegevoegd. Meer dan 20 ARM8-extensies zijn geïmplementeerd en de ondersteuning voor de ACLE (Arm C Language Extensions) extensie is verbeterd. Er zijn talloze verbeteringen aangebracht in de codegenerator. Ondersteuning voor CPU is toegevoegd:
- 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)
- In de backend voor codegeneratie voor AMD Radeon GPU's (GCN) is ondersteuning voor de libstdc++-bibliotheek geïmplementeerd en is experimentele ondersteuning voor codegeneratie voor de gfx9-generic, gfx10-3-generic en gfx11-generic apparaten toegevoegd.
- De backend voor de x86-architectuur heeft ondersteuning gekregen voor de extensies van de Intel AVX10.2-instructieset, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Ondersteuning voor de Intel Diamond Rapids- en Xeon Phi-CPU's is toegevoegd.
- De mogelijkheden van backends voor de LoongArch- en AVR-platforms zijn uitgebreid.
- Ondersteuning voor de doelfarchitectuur nios2, die wordt gebruikt in Nios II-processors, is verwijderd. De ABI ILP32 (-mabi=ilp32) ondersteuning in de AArch64-port is aangekondigd als verouderd en zal in de volgende belangrijke release worden verwijderd.
Bron: opennet.ru
