Dopo un anno di sviluppo pubblicato uscita del set di compilatori libero GCC 16.1, la prima uscita significativa della nuova serie GCC 16.x. In conformità con lo schema di numerazione delle versioni, la versione 16.0 è stata utilizzata durante lo sviluppo, e poco prima dell'uscita di GCC 16.1 si è già ramificata la serie GCC 17.0, sulla base della quale sarà formato il prossimo rilascio significativo GCC 17.1.
Principali cambiamenti:
- La modalità predefinita per il linguaggio C++ è stata cambiata per utilizzare lo standard C++20 (dialetto GNU C++20, -std=gnu++20) anziché il precedente proposto C++17. L'implementazione di C++20 nella libreria standard è stata dichiarata stabile.
- È stato incluso un front-end sperimentale ga68 per la compilazione di programmi nel linguaggio di programmazione Algol 68.
- È stata aggiunta la possibilità di output di informazioni diagnostiche nel formato HTML. È stata ampliata la documentazione sullo stato di esecuzione del programma, inclusa nell'output della diagnostica in formato SARIF, basato su JSON (il supporto per «-fdiagnostics-format=json» è stato interrotto).
- Sono state ampliate le ottimizzazioni in fase di collegamento (LTO, Link-Time Optimization). È stata aggiunta l'opzione «-flto-toplevel-asm-heuristics», che include una euristica per migliorare l'ottimizzazione del codice con inserimenti in assembler. La tecnica di devirtualizzazione speculativa (-fdevirtualize-speculatively) non è più limitata alla trasformazione dei metodi virtuali e può essere applicata alla trasformazione in chiamate dirette di qualsiasi chiamata indiretta a funzioni, ad esempio, chiamate tramite puntatori.
- È stato implementato il supporto per la vettorizzazione dei cicli, per i quali durante la compilazione non è noto il numero di iterazioni. È stata aumentata l'efficienza nella gestione delle uscite anticipate dai cicli (ad esempio, tramite break).
- È stato aggiunto il supporto sperimentale molte opportunità del nuovo standard recentemente approvato C++26. Ad esempio, sono stati implementati:
- Riflessione (Reflection, «-freflection»), che consente di monitorare e modificare gli elementi del programma durante la fase di compilazione. Sono stati aggiunti nuovi operatori «^^ (open-std.org)» per ottenere metainformazioni sulla struttura grammaticale e «[:…:]» per eseguire la trasformazione inversa. Per la trasformazione e l'elaborazione delle informazioni ottenute durante l'ispezione è stata proposta la libreria std::meta e sono disponibili opportunità come i calcoli con costanti.
- Programmazione contrattuale (Contratti), che consente di definire specifiche formali delle interfacce utilizzando tre nuovi operatori: pre (precondizione), post (postcondizione) e contract_assert (verifica dell'affermazione). L'operatore «pre» definisce le condizioni preliminari che devono essere soddisfatte prima della chiamata (verifica dei dati in input); «post» — le condizioni che devono essere rispettate dopo l'esecuzione (requisiti sui dati di output); contract_assert — 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), nella fase di compilazione in stile ciclo convenzionale. Durante l'esecuzione di «template for» il corpo del ciclo viene espanso per ogni elemento e ogni iterazione è gestita in un'area di visibilità separata, in cui l'elemento della sequenza su cui il ciclo itera è una costante per ogni iterazione e può essere utilizzato in espressioni costanti (constexpr). Nel contesto della riflessione, «template for» può essere applicato per attraversare le proprietà delle classi o delle enumerazioni.
- La libreria std::simd per il parallelismo nell'esecuzione delle operazioni sui dati utilizzando set di istruzioni SIMD, come AVX-512 e NEON, con l'uso del sistema di tipi standard 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 highlightsFromPoint() la specifica della codifica dei caratteri nei messaggi diagnostici.
- È stata ampliata la compatibilità con lo standard C23 (opennet.ru), ad esempio, è stata implementata la possibilità di utilizzare l'attributo «counted_by» per verificare la correttezza dell'uso dei puntatori.
- Proseguita l'implementazione degli standard OpenMP 5.0, 5.1, 5.2 e 6.0 (Open Multi-Processing), che definiscono API e modalità di applicazione dei metodi di 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 il trasferimento 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 del tipo «_BitInt (N)» per definire numeri interi con un numero specificato di bit.
Fonte: linux.org.ru
