Dopo un anno di sviluppo, è stato pubblicato il rilascio della suite di compilatori open source GCC 16.1, il primo importante rilascio della nuova serie GCC 16.x. Secondo lo schema di numerazione delle versioni, la versione 16.0 è stata utilizzata durante lo sviluppo, e poco prima del rilascio di GCC 16.1 è stata già ramificata la serie GCC 17.0, sulla quale sarà costruito il prossimo importante rilascio GCC 17.1.
Principali modifiche:
- La modalità predefinita per il linguaggio C++ è stata cambiata per utilizzare lo standard C++20 (dialetto GNU C++20, -std=gnu++20) invece del precedentemente proposto C++17. L'implementazione di C++20 nella libreria standard è stata dichiarata stabile.
- È stato incluso un frontend sperimentale ga68 per la compilazione di programmi in Algol 68.
- È stata aggiunta la possibilità di emettere informazioni diagnostiche in formato HTML. Sono state ampliate le informazioni sul progresso dell'esecuzione del programma, incluse nell'output della diagnosi in formato SARIF, basato su JSON (il supporto per «-fdiagnostics-format=json» è stato dismesso).
- Sono state ampliate le ottimizzazioni in fase di collegamento (LTO, Link-Time Optimization). È stata aggiunta l'opzione «-flto-toplevel-asm-heuristics», che include un'euristica per migliorare l'ottimizzazione del codice con inserti in assembler. La tecnica di devirtualizzazione speculativa (-fdevirtualize-speculatively) non è più limitata alla trasformazione dei metodi virtuali e può essere applicata nella trasformazione in chiamate dirette di qualsiasi chiamata indiretta a funzioni, come le chiamate tramite puntatori.
- È stato implementato il supporto per la vettorizzazione dei cicli per i quali il numero di iterazioni è sconosciuto in fase di compilazione. È stata migliorata l'efficacia della gestione delle uscite anticipate dai cicli (ad esempio, tramite break).
- È stato aggiunto il supporto sperimentale per molte funzionalità del recentemente approvato standard C++26. Ad esempio, sono state implementate:
- Riflessione (Reflection, «-freflection»), che consente di monitorare e modificare gli elementi del programma durante la fase di compilazione. Sono stati aggiunti nuovi operatori «^^» per ottenere meta-informazioni sulla struttura grammaticale e «[:…:]» per eseguire una trasformazione inversa. Per la trasformazione e l'elaborazione delle informazioni ottenute tramite l'ispezione è stata proposta la libreria std::meta, che offre funzionalità come calcoli con costanti.
- Programmazione contrattuale (Contracts), che consente di definire specifiche formali per le interfacce utilizzando tre nuovi operatori: pre (precondizione), post (postcondizione) e contract_assert (verifica dell'asserzione). L'operatore «pre» definisce le condizioni preliminari che devono essere soddisfatte prima della chiamata (verifica dei dati in ingresso); «post» specifica le condizioni che devono essere rispettate dopo l'esecuzione (requisiti per i dati in uscita); contract_assert stabilisce le condizioni per l'insorgere di eccezioni. Questa funzionalità sarà disponibile in GCC 16.
- L'operatore «template for» per iterare su elementi come pacchetti di parametri, oggetti simili a tuple e risultati di riflessione (metaogetti), durante la fase di compilazione in uno stile di ciclo tradizionale. Durante l'esecuzione di «template for», il corpo del ciclo viene espanso per ogni elemento e ogni iterazione è trattata in un'area di visibilità separata, in cui l'elemento della sequenza su cui si itera è una costante per ogni iterazione e può partecipare a espressioni costanti (constexpr). Nel contesto della riflessione, «template for» può essere utilizzato per esplorare le proprietà di classi o enumerazioni.
- La libreria std::simd per parallelizzare l'esecuzione delle operazioni sui dati utilizzando set di istruzioni SIMD, come AVX-512 e NEON, con il sistema di tipi standard di C++.
- Le librerie std::inplace_vector, std::optional<T&>, std::copyable_function, std::function_ref, std::indirect, std::polymorphic e std::owner_equal.
- Sono state implementate funzionalità relative allo standard C++23, come la gestione esplicita del ciclo di vita degli oggetti e il supporto per la specifica della codifica dei caratteri nei messaggi diagnostici.
- Supporto esteso per lo standard C23, ad esempio, è stata implementata la possibilità di utilizzare l'attributo "counted_by" per verificare la correttezza dell'uso dei puntatori.
- Continua l'implementazione degli standard OpenMP 5.0, 5.1, 5.2 e 6.0 (Open Multi-Processing), che definiscono l'API e i metodi per applicare programmazione parallela su sistemi multi-core e ibridi (CPU+GPU/DSP) con memoria condivisa e blocchi di vettorizzazione (SIMD). Migliorata l'implementazione delle specifiche di programmazione parallela OpenACC 3.0, 3.3 e 3.4, che definiscono strumenti per lo scarico delle operazioni (offloading) su GPU e processori specializzati, come NVIDIA PTX.
- Nel backend per l'architettura x86 è stata aggiunta la supporto per i processori AMD basati sull'architettura Zen6 (-march=znver6), così come per i processori Intel Wildcat Lake (-march=wildcatlake) e Nova Lake (-march=novalake).
- Nel backend di generazione del codice per GPU AMD Radeon (GCN) è stata implementata la supporto per gli acceleratori AMD Instinct MI300 (gfx942).
- Per le architetture RISC-V, ARM, S/390 e LoongArch è stata implementata la supporto per il tipo "_BitInt (N)" per definire numeri interi con un numero specificato di bit.
Fonte: opennet.ru
