Dopu un annu di sviluppu, a suite di compilatore GCC gratuitu GCC 15.1 hè stata liberata, a prima liberazione maiò in a nova filiera GCC 15.x. Sicondu u schema di numerazione di liberazione, a versione 15.0 hè stata aduprata durante u sviluppu, è pocu prima di a liberazione di GCC 15.1, un ramu di GCC 16.0 era digià statu bifurcatu, chì formarà a basa di a prossima versione maiò, GCC 16.1.
I cambiamenti principali:
- Quandu compilate i prugrammi C, u standard C23 (Change Summary) cù estensioni GNU ("-std=gnu23") hè utilizatu per difettu. Nanzu, u standard C17 era usatu per difettu (-std = gnu17). U cambiamentu puderia causà prublemi quandu custruiscenu prughjetti esistenti per l'inclusione di a constante nullptr, u tipu _BitInt (n) è e parolle chjave bool, true è false, chì puderanu cunflittu cù identificatori di nomi simili definiti in applicazioni.
- E seguenti capacità di u standard C23 sò state implementate:
- A direttiva "#embed" hè pensata per incrustà risorse binari in u codice.
- L'attributu "unsequenced", chì indica chì u risultatu ùn dipende micca di l'ordine di esicuzzioni.
- L'attributu "reproducible" indica chì a funzione torna sempre u stessu risultatu datu u stessu input, vale à dì ùn dipende micca di altri fattori.
- Elementi di u futuru standard C2Y sò stati implementati (-std=c2y è -std=gnu2y):
- Capacità di dichjarà variabili in una dichjarazione "se", cum'è "if (int x = get ()) {...}".
- Supportu per i loops di nomi per riferite à elli in u codice. esterno: per (int i = 0; i < IK; ++ i) { switch (i) { casu 1: ruttura; // salta à CONT1 casu 2: rumpi fora; // salta à CONT2 } // CONT1 } // CONT2
- Supportu per specificà intervalli di valori interi in espressioni di casu, cum'è "casu 1...10:".
- I suffissi "i" è "j" per denotà a parte imaginaria in numeri cumplessi.
- A pussibilità di utilizà l'operatori "++" è "—" cù numeri cumplessi.
- A custruzzione "_Generic(type, expr1, expr2, ...)" per selezziunà una espressione basatu annantu à u tipu d'operandu.
- Supportu per accede à e matrici di byte cum'è altri tipi d'uggetti, cum'è strutture è unioni.
- Supportu per applicà l'operatore "alignof" à arrays incompleti (quelli dichjarati senza specificà una dimensione, cum'è "int a[]").
- Aggiunta una nova sintassi per e sequenze di escape di caratteri ottali, esadecimali è universali. Invece di "\u", "\x" è "\nnn", sò pruposti e sequenze "\u{}", "\o{}" è "\x{}", in quale pò esse specificatu ogni numeru di cifre.
- Funzioni integrate "__builtin_stdc_rotate_left" è "__builtin_stdc_rotate_right".
- L'operazioni di lunghezza zero nantu à i puntatori NULL sò permesse (per esempiu "sizeof(*p)").
- U frontend per a lingua C++ implementa funzioni chì sò sviluppate per u futuru standard C++ 26:
- Operatore variativu "amicu" ("amicu Ts...").
- A capacità d'utilizà a chjave constexpr cù una variazione di u novu operatore (piazzamentu novu) per mette un ughjettu in memoria pre-assignata à tempu di compilazione.
- Errore di output quandu sguassate un puntatore à un tipu incompletu.
- A sintassi per a definizione di parametri variadici cù un ellipsi senza una virgola precedente (per esempiu, quandu si specifica "void e(int...)" invece di "void e(int, ...)") hè stata deprecata.
- Indexazione di un pacchettu di parametri in mudelli.
- Attributi per ligami strutturati;
- Sintassi '= delete("ragiuni"');
- Inclusione di "@", "$" è "`" in u set di caratteri di basa.
- L'usu di macros per dichjarà moduli hè pruibitu.
- Capacità d'utilizà ubligatoriu strutturatu cum'è una cundizione in dichjarazioni if and switch.
- U supportu per a comparazione diretta di array (per esempiu "int arr1[5]; int arr2[5]; bool same = arr1 == arr2") hè stata interrotta.
- U mecanismu "#embed" per incrustà risorse binari.
- A classe di mudellu is_trivial hè stata deprecata.
- Funzioni C++ 23 aghjunte:
- Disallow certi usi di a direttiva "export" è permette l'usu di "export {}".
- Supportu per allargà a vita di l'uggetti tempuranee in i loops chì iteranu in intervalli.
- A libreria libstdc++ implementa un supportu sperimentale per i moduli std è std.compat.
- Aduprà l'inizializazione "{0}" per i sindicati in u codice C è C++ ùn guarantisci più chì tutti i cuntenuti sò sbulicati, ma invece risultati in u primu elementu di l'unione hè zero. Per sguassà tutta l'unione, utilizate l'espressione "{}" definita in a specificazione C23, o specificate l'opzione "-fzero-init-padding-bits=unions" per restaurà u vechju cumpurtamentu.
- Supportu implementatu per l'attributu "musttail" ([[gnu::musttail]] è [[clang::musttail]]) per i chjami di coda garantiti. L'attributu s'applica à e dichjarazioni di ritornu chì facenu una chjama recursiva à a funzione attuale, è assicura chì una tale chjamata utilizerà a ricursione di a cuda, chì ùn attribuisce micca memoria supplementu nantu à a pila (eliminendu u risicu di esce da memoria cù un gran numaru di chjama).
- U supportu implementatu per l'attributu flag_enum ([[gnu::flag_enum]] è [[clang::flag_enum]]) appiicatu à l'enumerazioni per indicà chì i cuntenuti sò usati in operazioni di bit (impedisce avvirtimenti in u modu -Wswitch).
- Aghjunghje supportu per l'attributu "counted_by", chì pò esse usatu per specificà un campu in una struttura cù un array flexible chì determina u numeru di elementi. L'attributu pò esse usatu per migliurà l'efficienza di i cuntrolli di u buffer overflow.
- L'attributu "nonnull_if_nonzero" aghjuntu à e funzioni, chì specifica chì certi paràmetri di funzione cù punters ponu esse NULL solu se un altru paràmetru hè zero.
- L'assemblatore esteso inline "asm (...)" funzioni esterne hè permessu. In l'inserzioni di assembler, hè permessu di sovrascrive a memoria in a zona rossa di a pila (l'area in a cima di a pila).
- A compilazione di u codice C ++ hè più veloce grazia à l'hashing di u mudellu migliuratu.
- Aghjunghjite novi ottimisazioni. U supportu hè statu implementatu per i loops di vettorizazione chì cuntenenu codice per a uscita anticipata (per esempiu, via una pausa o una chjama di ritornu), ancu s'ellu tali loops manipulanu arrays o buffers dinamicamente attribuiti chì a dimensione hè scunnisciuta in tempu di compilazione. Quandu l'opzione -O2 hè specificata, a vectorizazione di certi loops facilmente vectorizable per i quali l'infurmazione di tripcount ùn hè micca dispunibule hè attivata.
- Aggiuntu un modu di ottimisazione incrementale in u stadiu di ligame (LTO, Link-Time Optimization), chì riduce significativamente u tempu di recompilazione quandu si usa LTO in situazioni induve sò stati fatti cambiamenti minori à u codice (una funzione hè stata editata). Per attivà u modu incrementale, l'opzione "-flto-incremental" hè pruposta.
- Cumpilazione mejorata di schedarii di input assai grande. Implementatu u seguimentu di i numeri di colonna più grande di 4096. A precisione mejorata di indicà u locu di l'errori è avvirtimenti in schedarii assai grande.
- Visibilità mejorata di i rapporti quandu diagnostica i prublemi. Per esempiu, u locu di u prublema hè evidenziatu cù u simbulu "⚠️", u layout di l'output per l'errore in i mudelli C++ hè statu cambiatu, i suggerimenti sò stati aghjunti per simplificà a transizione à u standard C23, è u schema di culore hè statu riprogettatu. Aggiunta a capacità di produzzione di diagnostichi in u formatu Sarif (-fdiagnostics-format=sarif-file).
- A libreria libgdiagnostics hè stata implementata, chì vi permette di integrà e capacità di GCC in relazione à u disignu di missaghji di diagnostichi in i vostri prughjetti (per esempiu, pudete aduprà citazione, evidenziazione è suggerimenti di correzione).
- Aghjunghjite "-Wtrailing-whitespace" è "-Wleading-whitespace" avvirtimenti per detectà spazi bianchi residuali à a fine di e linee è spazi bianchi extra à l'iniziu di e linee.
- Aggiuntu "-Wheader-guard" avvisu per signalà i prublemi in i macros di guardia di l'intestazione chì impediscenu un schedariu di header da esse inclusu di novu.
- U frontend per a lingua D hè stata aghjurnata à a versione 2.111.0.
- U supportu per interi senza firmatu hè statu aghjuntu à u frontend di Fortran.
- U pacchettu include un compilatore per a lingua COBOL, gcobol, chì sustene e plataforme x86-64 è AArch64 è ùn hè micca pensatu per l'usu in sistemi 32-bit. U compilatore implementa a specificazione ISO / IEC 1989: 2023 è passa a maiò parte di e teste NIST CCVS / 85.
- L'implementazione di i standard OpenMP 5.0, 5.1, 5.2 è 6.0 (Open Multi-Processing), chì definiscenu l'API è i metudi per applicà metudi di prugrammazione parallela in sistemi multi-core è hibridi (CPU + GPU / DSP) cù unità di memoria è vectorization (SIMD) spartuti, hè stata cuntinuata. Aggiuntu supportu per metadirettivi è tile, unroll, interop è custruzzioni di dispatch. Per alcune GPU AMD è NVIDIA, u supportu per a memoria spartuta unificata hè stata aghjunta (attivata da specificà unified_shared_memory in a direttiva "requires"). Aghjunghje supportu per l'espressione "self_maps".
- U backend per l'architettura AArch64 hè stata aghjurnata per sustene a piattaforma MinGW (aarch64-w64-mingw32). Più di 20 estensioni ARM8 sò state implementate è u supportu per l'estensione ACLE (Arm C Language Extensions) hè statu migliuratu. Numerosi miglioramenti sò stati fatti à u generatore di codice. Supportu CPU aghjuntu:
- 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)
- U backend di generazione di codice AMD Radeon GPU (GCN) hè statu aghjurnatu per sustene a libreria libstdc++ è u supportu di generazione di codice sperimentale hè statu aghjuntu per a serie di dispositivi gfx9-generic, gfx10-3-generic è gfx11-generic.
- U backend x86 supporta avà l'estensioni di l'architettura di set di istruzioni Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Supportu aghjuntu per i CPU Intel Diamond Rapids è Xeon Phi.
- Capacità di backend ampliate per e piattaforme LoongArch è AVR.
- Eliminatu u supportu per l'architettura di destinazione nios2 utilizata in i processori Nios II. U supportu per l'ILP32 ABI (-mabi = ilp32) in u portu AArch64 hè statu deprecatu è serà sguassatu in a prossima versione maiò.
Source: opennet.ru
