GCC 16

GCC 16

Dopo un anno di sviluppo pubblicato rilascio di un set di compilatori libero GCC 16.1, primo rilascio significativo nella nuova serie GCC 16.x. In accordo con lo schema di numerazione delle versioni, la versione 16.0 è stata utilizzata durante lo sviluppo, e poco prima del rilascio di GCC 16.1 già si era ramificata la serie GCC 17.0, da cui sarà formato il prossimo rilascio significativo 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 compilare programmmi nel linguaggio di programmazione Algol 68.
  • È stata aggiunta la possibilità di generare informazioni diagnostiche in formato HTML. Le informazioni sull'esecuzione del programma sono state ampliate e incluse nell'uscita della diagnostica in formato SARIF, basato su JSON (il supporto per «-fdiagnostics-format=json» è stato interrotto).
  • Ottimizzazioni ampliate nella fase di collegamento (LTO, Link-Time Optimization). È stata aggiunta l'opzione «-flto-toplevel-asm-heuristics», che include euristiche per migliorare l'ottimizzazione del codice con inserimenti in assembly. La tecnica di devirtualizzazione speculativa (-fdevirtualize-speculatively) ora non è limitata alla trasformazione di metodi virtuali e può essere applicata alla conversione in chiamate dirette di qualsiasi chiamata indiretta di funzioni, ad esempio, 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).
  • Supporto sperimentale aggiunto molti possibilità standard recentemente approvato C++26. Ad esempio, sono state implementate:
    • Riflessione (Reflection, «-freflection»), che consente di tracciare e modificare gli elementi del programma in fase di compilazione. Sono stati aggiunti nuovi operatori «^^ (open-std.org)» per ottenere meta-informazioni 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 possibilità come calcoli con costanti.
    • Programmazione contrattuale (Contracts), 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» stabilisce le condizioni preliminari che devono essere soddisfatte prima della chiamata (verifica dei dati di input); «post» le condizioni che devono essere rispettate dopo l'esecuzione (requisiti sui dati di output); contract_assert stabilisce le condizioni per il sollevamento delle eccezioni. Questa funzionalità sarà disponibile in GCC 16.
    • L'operatore «template for» per iterare sugli elementi, come pacchetti di parametri, oggetti simili a tuple e risultati di riflessione (metaoggetti), nella fase di compilazione in stile ciclo normale. Quando viene eseguito «template for», il corpo del ciclo viene espanso per ogni elemento e ogni iterazione viene elaborata in uno spazio di visibilità separato, dove l'elemento della sequenza su cui si itera è costante per ogni iterazione e può partecipare a espressioni costanti (constexpr). Nel contesto della riflessione, «template for» può essere utilizzato per scorrere le proprietà delle classi o delle 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à correlate allo standard C++23, come esplicito gestione del ciclo di vita degli oggetti e supporto indicazioni sulla codifica dei caratteri dei messaggi diagnostici.
  • Supporto esteso per 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.
  • Continuato implementazione degli standard OpenMP 5.0, 5.1, 5.2 e 6.0 (Open Multi-Processing), che definiscono le API e i modi di applicare i metodi di programmazione parallela su sistemi multi-core e ibridi (CPU+GPU/DSP) con memoria condivisa e blocchi di vettorizzazione (SIMD). Migliorato 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 per il tipo "_BitInt (N)" per definire numeri interi con un numero specificato di bit.

Fonte: linux.org.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster