Dopo un anno di sviluppo, è stata pubblicata la versione del pacchetto di compilatori open source GCC 15.1, il primo rilascio significativo nella nuova serie GCC 15.x. Secondo lo schema di numerazione delle versioni, la versione 15.0 è stata utilizzata durante lo sviluppo, e poco prima del rilascio di GCC 15.1 è già stata biforcata la serie GCC 16.0, dalla quale sarà formato il prossimo rilascio significativo GCC 16.1.
Variazioni principali:
- Nella compilazione di programmi in C, per impostazione predefinita è utilizzato lo standard C23 (riepilogo delle modifiche) con estensioni GNU («-std=gnu23»). In precedenza, per impostazione predefinita, veniva utilizzato lo standard C17 — «-std=gnu17». Questa modifica potrebbe potenzialmente causare problemi nella costruzione di progetti esistenti a causa dell'inclusione della costante nullptr, del tipo _BitInt(n) e delle parole chiave bool, true e false, che potrebbero confliggere con identificatori omonimi definiti nelle applicazioni.
- Sono state implementate le funzionalità dello standard C23:
- La direttiva «#embed», destinata a incorporare risorse binarie nel codice.
- L'attributo «unsequenced», che segnala che il risultato non dipende dall'ordine di esecuzione.
- L'attributo «reproducible», che indica che la funzione restituisce sempre lo stesso risultato con gli stessi dati in ingresso, cioè non dipende da altri fattori.
- Sono stati implementati elementi del futuro standard C2Y (-std=c2y e -std=gnu2y):
- Possibilità di dichiarare variabili nell'operatore «if», per esempio, «if (int x = get ()) {…}».
- Supporto per dare nomi ai cicli in modo da riferirsi a essi nel codice. outer: for (int i = 0; i < IK; ++ i) { switch (i) { case 1: break; // salta a CONT1 case 2: break outer; // salta a CONT2 } // CONT1 } // CONT2
- Supporto per indicare intervalli di valori interi nelle espressioni «case», per esempio, «case 1 … 10:».
- Suffissi «i» e «j» per indicare la parte immaginaria nei numeri complessi.
- Possibilità di utilizzare gli operatori «++» e «—» con i numeri complessi.
- Costruzione «_Generic(type, expr1, expr2, …)» per selezionare un'espressione in base al tipo dell'operando.
- Supporto per accedere a array di byte come ad altri tipi di oggetti, come strutture e unioni.
- Supporto per applicare l'operatore «alignof» a array incompleti (dichiarati senza indicazione della dimensione, per esempio, «int a[]»).
- Aggiunta una nuova sintassi per sequenze di escape di caratteri ottali, esadecimali e universali. Invece di «\u», «\x» e «\nnn», sono proposte le sequenze «\u{}», «\o{}» e «\x{}», in cui è possibile specificare un numero arbitrario di cifre.
- Funzioni incorporate «__builtin_stdc_rotate_left» e «__builtin_stdc_rotate_right».
- Sono consentite operazioni di lunghezza zero su puntatori NULL (ad esempio, «sizeof(*p)»).
- Nel frontend per il linguaggio C++ sono state implementate funzionalità sviluppate per il futuro standard C++26:
- Operatore variadico «friend» («friend Ts…»).
- Possibilità di utilizzare la parola chiave «constexpr» con una variante dell'operatore «new» (placement new) per posizionare un oggetto in memoria precedentemente allocata durante la compilazione.
- Uscita di errore quando si tenta di cancellare un puntatore a un tipo incompleto.
- Dichiarata obsoleta la sintassi per la definizione di parametri variabili con tre puntini senza una virgola precedente (ad esempio, quando si specifica «void e(int…)» invece di «void e(int, …)».
- Indicizzazione del pacchetto di parametri nei modelli.
- Attributi per legami strutturati;
- Sintassi ‘= delete(«motivo»)’;
- Inclusione di «@», «$» e «`» nel set di caratteri di base.
- Vietato l'uso di macro per dichiarare moduli.
- Possibilità di applicare legami strutturati (structured binding) come condizione negli operatori if e switch.
- Interrotta la supporto per il confronto diretto degli array (ad esempio, «int arr1[5]; int arr2[5]; bool same = arr1 == arr2»).
- Meccanismo «#embed» per l'inclusione di risorse binarie.
- Dichiarato obsoleto la classe template is_trivial.
- Aggiunte le funzionalità di C++23:
- Divieto di alcuni usi della direttiva «export» e autorizzazione all'uso di «export {}».
- Supporto per l'estensione della vita degli oggetti temporanei nei cicli «for» che iterano su intervalli.
- Nella libreria libstdc++ è stato implementato il supporto sperimentale per i moduli std e std.compat.
- L'uso dell'inizializzatore «{0}» per le unioni nel codice C e C++ non garantisce più la pulizia di tutto il contenuto, portando invece a un azzeramento del primo elemento dell'unione. Per pulire l'intera unione, utilizzare l'espressione «{}» definita nella specifica C23 o 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 espressioni return in cui viene effettuata una chiamata ricorsiva alla funzione corrente e garantisce che tale chiamata utilizzi la ricorsione tail, senza allocare memoria aggiuntiva nello stack (escludendo il rischio di esaurimento della memoria in caso di un numero molto elevato di chiamate).
- È stato implementato il supporto per l'attributo flag_enum ([[gnu::flag_enum]] e [[clang::flag_enum]]), utilizzato nelle enumerazioni per indicare che il contenuto viene utilizzato in operazioni bit a bit (esclude la generazione di avvisi in modalità «-Wswitch»).
- È stato aggiunto il supporto per l'attributo «counted_by», che consente di specificare un campo in una struttura con un array flessibile che definisce il numero di elementi. L'attributo può essere utilizzato per aumentare l'efficienza dei controlli fuori limite.
- Per le funzioni è stato aggiunto l'attributo «nonnull_if_nonzero», che definisce che alcuni parametri di funzione con puntatori possono assumere il valore NULL solo se un altro parametro è pari a zero.
- È consentito utilizzare inserimenti assembler estesi «asm (….)» al di fuori delle funzioni. Negli inserimenti assembler è consentito riscrivere la memoria nella zona rossa dello stack (area in cima allo stack).
- La compilazione del codice C++ è stata accelerata grazie a un miglioramento dell'hashing dei template.
- Sono state aggiunte nuove ottimizzazioni. È stato implementato il supporto per la vettorizzazione dei cicli che contengono codice per l'uscita anticipata (ad esempio, tramite la chiamata break o return), anche se tali cicli manipolano array o buffer allocati dinamicamente, le cui dimensioni non sono note al momento della compilazione. Quando viene specificata l'opzione «-O2», è attivata la vettorizzazione di alcuni cicli facilmente vettorizzabili per i quali non ci sono informazioni sul numero di iterazioni (tripcount).
- È stata aggiunta la modalità di ottimizzazione incrementale al momento del linking (LTO, Link-Time Optimization), che riduce notevolmente il tempo di ricompilazione quando si effettua piccole modifiche al codice (modificata una funzione). Per attivare la modalità incrementale, è proposta l'opzione «-flto-incremental».
- È stato migliorato il processo di compilazione dei file di input molto grandi. È stata implementata la tracciabilità dei numeri di colonna superiori a 4096. È stata aumentata la precisione nell'indicazione delle posizioni degli errori e degli avvisi in file molto grandi.
- È stata aumentata la chiarezza dei rapporti durante la diagnosi dei problemi. Ad esempio, è stato garantito l'evidenziamento del punto in cui si verifica il problema con il simbolo «⚠️», è stata modificata la disposizione dell'output in caso di errori nei template C++, sono stati aggiunti suggerimenti per facilitare la transizione allo standard C23, ed è stata riprogettata la schemata dei colori. È stata aggiunta la possibilità di esportare le diagnosi in formato Sarif (-fdiagnostics-format=sarif-file).
- È stata implementata la libreria libgdiagnostics, che consente di integrare nei propri progetti le funzionalità di GCC relative alla formattazione dei messaggi di diagnosi (ad esempio, è possibile utilizzare strumenti di citazione, evidenziazione e suggerimenti per la correzione).
- Sono stati aggiunti gli avvisi «-Wtrailing-whitespace» e «-Wleading-whitespace» per rilevare gli spazi residui alla fine delle righe e gli spazi eccessivi all'inizio delle righe.
- È stato aggiunto l'avviso «-Wheader-guard» per segnalare problemi nei macro di protezione dei file di intestazione, che impediscono la reinclusione dei file di intestazione.
- Il front-end per il linguaggio D è stato aggiornato alla versione 2.111.0.
- Nel front-end per il linguaggio Fortran è stata aggiunta la supporto per interi senza segno.
- È stato incluso il 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.
- Continua 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 delle tecniche di programmazione parallela su sistemi multicore e ibridi (CPU+GPU/DSP) con memoria condivisa e blocchi di vettorizzazione (SIMD). È stata aggiunta la supporto per le metadirettive e le strutture tile, unroll, interop e dispatch. Per alcune GPU AMD e NVIDIA è stata aggiunta la supporto per la memoria condivisa unificata (abilitata tramite l'indicazione unified_shared_memory nella direttiva «requires»). È stata aggiunta la supporto per l'espressione «self_maps».
- Nel backend per l'architettura AArch64 è stata aggiunta la supporto per la piattaforma MinGW (aarch64-w64-mingw32). Sono state implementate più di 20 estensioni ARM8 e migliorata la supporto per l'estensione ACLE (Arm C Language Extensions). Sono stati apportati numerosi miglioramenti al generatore di codice. È stata aggiunta la supporto per 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)
- 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)
- Nel backend di generazione del codice per GPU AMD Radeon (GCN) è stata implementata la supporto per la libreria libstdc++ ed è stata aggiunta la supporto sperimentale per la generazione del codice per le serie di dispositivi gfx9-generic, gfx10-3-generic e gfx11-generic.
- Nel backend per l'architettura x86 è stata aggiunta la supporto per le estensioni dell'architettura del set di istruzioni Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. È stato aggiunto il supporto per le CPU Intel Diamond Rapids e Xeon Phi.
- Ampliate le funzionalità dei backend per le piattaforme LoongArch e AVR.
- Rimossa la supporto per l'architettura target nios2, utilizzata nei processori Nios II. È stata dichiarata obsoleta e il supporto per ABI ILP32 (-mabi=ilp32) nel porting per AArch64 sarà rimosso nella prossima versione significativa.
Fonte: opennet.ru
