Dopo un anno di sviluppo, è stata rilasciata la suite gratuita del compilatore GCC GCC 15.1, la prima importante versione della nuova serie GCC 15.x. In base allo schema di numerazione delle versioni, durante lo sviluppo è stata utilizzata la versione 15.0 e, poco prima del rilascio di GCC 15.1, era già stato creato un ramo di GCC 16.0, che costituirà la base della prossima versione principale, GCC 16.1.
Principali modifiche:
- Durante la compilazione di programmi C, per impostazione predefinita viene utilizzato lo standard C23 (Change Summary) con estensioni GNU ("-std=gnu23"). In precedenza, per impostazione predefinita veniva utilizzato lo standard C17 (-std=gnu17). La modifica potrebbe potenzialmente causare problemi durante la creazione di progetti esistenti a causa dell'inclusione della costante nullptr, del tipo _BitInt(n) e delle parole chiave bool, true e false, che potrebbero entrare in conflitto con identificatori con nomi simili definiti nelle applicazioni.
- Sono state implementate le seguenti funzionalità dello standard C23:
- La direttiva "#embed" è progettata per incorporare risorse binarie nel codice.
- L'attributo "non sequenziato", che indica che il risultato non dipende dall'ordine di esecuzione.
- L'attributo "riproducibile" indica che la funzione restituisce sempre lo stesso risultato dato lo stesso input, ovvero non dipende da altri fattori.
- Sono stati implementati elementi del futuro standard C2Y (-std=c2y e -std=gnu2y):
- Possibilità di dichiarare variabili in un'istruzione "if", come "if (int x = get ()) {...}".
- Supporto per la denominazione dei cicli per farvi riferimento nel codice. esterno: for (int i = 0; i < IK; ++ i) { switch (i) { caso 1: break; // salta a CONT1 caso 2: break external; // salta a CONT2 } // CONT1 } // CONT2
- Supporto per la specifica di intervalli di valori interi nelle espressioni case, ad esempio "case 1...10:".
- I suffissi "i" e "j" per indicare la parte immaginaria nei numeri complessi.
- Possibilità di utilizzare gli operatori "++" e "—" con numeri complessi.
- La struttura "_Generic(type, expr1, expr2, …)" per selezionare un'espressione in base al tipo di operando.
- Supporto per l'accesso ad array di byte come altri tipi di oggetti, come strutture e unioni.
- Supporto per l'applicazione dell'operatore "alignof" ad array incompleti (quelli dichiarati senza specificare una dimensione, come "int a[]").
- Aggiunta nuova sintassi per sequenze di escape di caratteri ottali, esadecimali e universali. Al posto di “\u”, “\x” e “\nnn”, vengono proposte le sequenze “\u{}”, “\o{}” e “\x{}”, nelle quali è possibile specificare un numero qualsiasi di cifre.
- Funzioni integrate "__builtin_stdc_rotate_left" e "__builtin_stdc_rotate_right".
- Sono consentite operazioni di lunghezza zero sui puntatori NULL (ad esempio "sizeof(*p)").
- L'interfaccia utente per il linguaggio C++ implementa funzionalità in fase di sviluppo per il futuro standard C++26:
- Operatore variazionale "amico" ("amico Ts...").
- La possibilità di utilizzare la parola chiave constexpr con una variante dell'operatore new (placement new) per posizionare un oggetto nella memoria preallocata in fase di compilazione.
- Errore durante l'eliminazione di un puntatore a un tipo incompleto.
- La sintassi per definire parametri variadici con puntini di sospensione senza virgola precedente (ad esempio, quando si specifica "void e(int…)" invece di "void e(int, …)") è stata deprecata.
- Indizzazione di un pacchetto di parametri nei modelli.
- Attributi per associazioni strutturate;
- Sintassi '= delete("motivo")';
- Inclusione di "@", "$" e "`" nel set di caratteri base.
- L'uso di macro per dichiarare moduli è vietato.
- Possibilità di utilizzare il binding strutturato come condizione nelle istruzioni if e switch.
- Il supporto per il confronto diretto degli array (ad esempio "int arr1[5]; int arr2[5]; bool same = arr1 == arr2") è stato interrotto.
- Il meccanismo "#embed" per incorporare risorse binarie.
- La classe template is_trivial è stata deprecata.
- Funzionalità C++23 aggiunte:
- Vietare alcuni utilizzi della direttiva "export" e consentire l'uso di "export {}".
- Supporto per l'estensione della durata di vita degli oggetti temporanei nei cicli for che iterano su intervalli.
- La libreria libstdc++ implementa il supporto sperimentale per i moduli std e std.compat.
- L'utilizzo dell'inizializzatore "{0}" per le unioni nel codice C e C++ non garantisce più che tutti i contenuti vengano cancellati, ma comporta invece l'azzeramento del primo elemento dell'unione. Per cancellare l'intera unione, utilizzare l'espressione "{}" definita nella specifica C23 oppure specificare l'opzione "-fzero-init-padding-bits=unions" per ripristinare il comportamento precedente.
- Implementato il supporto per l'attributo "musttail" ([[gnu::musttail]] e [[clang::musttail]]) per chiamate tail garantite. L'attributo si applica alle istruzioni return che effettuano una chiamata ricorsiva alla funzione corrente e garantisce che tale chiamata utilizzi la ricorsione di coda, che non alloca memoria aggiuntiva sullo stack (eliminando il rischio di esaurire la memoria con un numero molto elevato di chiamate).
- Implementato il supporto per l'attributo flag_enum ([[gnu::flag_enum]] e [[clang::flag_enum]]) applicato alle enumerazioni per indicare che il contenuto viene utilizzato nelle operazioni bit a bit (impedisce gli avvisi in modalità -Wswitch).
- Aggiunto supporto per l'attributo "counted_by", che può essere utilizzato per specificare un campo in una struttura con un array flessibile che determina il numero di elementi. L'attributo può essere utilizzato per migliorare l'efficienza dei controlli del buffer overflow.
- Aggiunto l'attributo "nonnull_if_nonzero" alle funzioni, che specifica che alcuni parametri di funzione con puntatori possono essere NULL solo se un altro parametro è zero.
- È consentito l'inserimento inline di "asm(….)" all'esterno delle funzioni tramite assembler esteso. Negli inserimenti in assembler è consentito sovrascrivere la memoria nella zona rossa dello stack (l'area in cima allo stack).
- La compilazione del codice C++ è più rapida grazie al miglioramento dell'hashing dei template.
- Aggiunte nuove ottimizzazioni. È stato implementato il supporto per i cicli di vettorizzazione che contengono codice per un'uscita anticipata (ad esempio, tramite una chiamata break o return), anche se tali cicli manipolano array o buffer allocati dinamicamente la cui dimensione è sconosciuta al momento della compilazione. Quando viene specificata l'opzione -O2, viene abilitata la vettorizzazione di alcuni loop facilmente vettorizzabili per i quali non sono disponibili informazioni sul conteggio dei viaggi.
- Aggiunta la modalità di ottimizzazione incrementale nella fase di collegamento (LTO, Link-Time Optimization), che riduce significativamente il tempo di ricompilazione quando si utilizza LTO in situazioni in cui sono state apportate piccole modifiche al codice (è stata modificata una funzione). Per abilitare la modalità incrementale, viene proposta l'opzione "-flto-incremental".
- Migliorata la compilazione di file di input di grandi dimensioni. Implementato il tracciamento dei numeri di colonna superiori a 4096. Migliorata la precisione nell'indicazione della posizione di errori e avvisi in file di grandi dimensioni.
- Visibilità migliorata dei report durante la diagnosi dei problemi. Ad esempio, la posizione del problema è evidenziata con il simbolo "⚠️", è stato modificato il layout dell'output per gli errori nei template C++, sono stati aggiunti suggerimenti per semplificare la transizione allo standard C23 e la combinazione di colori è stata riprogettata. Aggiunta la possibilità di generare dati diagnostici in formato Sarif (-fdiagnostics-format=sarif-file).
- È stata implementata la libreria libgdiagnostics, che consente di integrare nei progetti le funzionalità GCC correlate alla progettazione di messaggi diagnostici (ad esempio, è possibile utilizzare citazioni, evidenziazioni e suggerimenti di correzione).
- Aggiunti gli avvisi "-Wtrailing-whitespace" e "-Wleading-whitespace" per rilevare spazi residui alla fine delle righe e spazi extra all'inizio delle righe.
- Aggiunto l'avviso "-Wheader-guard" per segnalare problemi nelle macro di protezione dell'intestazione che impediscono la reinclusione di un file di intestazione.
- L'interfaccia per il linguaggio D è stata aggiornata alla versione 2.111.0.
- È stato aggiunto il supporto per gli interi senza segno al frontend Fortran.
- Il pacchetto include un compilatore per il linguaggio COBOL, gcobol, che supporta le piattaforme x86-64 e AArch64 e non è progettato per l'uso su sistemi a 32 bit. Il compilatore implementa la specifica ISO/IEC 1989:2023 e supera la maggior parte dei test NIST CCVS/85.
- È proseguita l'implementazione degli standard OpenMP 5.0, 5.1, 5.2 e 6.0 (Open Multi-Processing), che definiscono le API e i metodi per l'applicazione di metodi di programmazione parallela su sistemi multi-core e ibridi (CPU+GPU/DSP) con memoria condivisa e unità di vettorizzazione (SIMD). Aggiunto supporto per metadirettive e costrutti tile, unroll, interop e dispatch. Per alcune GPU AMD e NVIDIA è stato aggiunto il supporto per la memoria condivisa unificata (abilitato specificando unified_shared_memory nella direttiva "requires"). Aggiunto supporto per l'espressione "self_maps".
- Il backend per l'architettura AArch64 è stato aggiornato per supportare la piattaforma MinGW (aarch64-w64-mingw32). Sono state implementate più di 20 estensioni ARM8 ed è stato migliorato il supporto per l'estensione ACLE (Arm C Language Extensions). Sono stati apportati numerosi miglioramenti al generatore di codice. Aggiunto supporto 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)
- Braccio Neoverse N3 (neoverse-n3)
- Arm Neoverse V3 (neoverse-v3)
- Braccio Neoverse V3AE (neoverse-v3ae)
- FUJITSU-MONAKA (fujitsu-monaka)
- NVIDIA Grace
- NVIDIA Olympus (Olympus)
- Qualcomm Oryon-1 (Oryon-1)
- Il backend di generazione del codice AMD Radeon GPU (GCN) è stato aggiornato per supportare la libreria libstdc++ ed è stato aggiunto il supporto alla generazione di codice sperimentale per le serie di dispositivi gfx9-generic, gfx10-3-generic e gfx11-generic.
- Il backend x86 ora supporta le estensioni dell'architettura del set di istruzioni Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Aggiunto supporto per CPU Intel Diamond Rapids e Xeon Phi.
- Funzionalità backend espanse per le piattaforme LoongArch e AVR.
- Rimosso il supporto per l'architettura target nios2 utilizzata nei processori Nios II. Il supporto per l'ABI ILP32 (-mabi=ilp32) nella porta AArch64 è stato deprecato e verrà rimosso nella prossima versione principale.
Fonte: opennet.ru
