După un an de dezvoltare publicat lansarea unei serii de compilatoare GCC 16.1, prima lansare semnificativă din noua ramură GCC 16.x. În conformitate cu schema de numerotare a lansărilor, versiunea 16.0 a fost utilizată în procesul de dezvoltare, iar cu puțin înainte de lansarea GCC 16.1, s-a ramificat deja ramura GCC 17.0, pe baza căreia va fi formată următoarea lansare semnificativă, GCC 17.1.
Principalele modificări:
- Modul implicit pentru limbajul C++ a fost schimbat pentru a utiliza standardul C++20 (-std=gnu++20, dialect GNU C++20) în locul celui anterior propus C++17.Implementarea C++20 în biblioteca standard a fost declarată stabilă.
- A fost inclus un frontend experimental ga68 pentru compilarea programelor în limbajul de programare Algol 68.
- A fost adăugată posibilitatea de a genera informații de diagnosticare în format HTML. Informațiile privind progresul execuției programului au fost extinse, incluzându-se la generația de diagnostic în format SARIF, bazat pe JSON (suportul pentru „-fdiagnostics-format=json” a fost abandonat).
- Optimizările în etapa de legare (LTO, Link-Time Optimization) au fost extinse. A fost adăugată opțiunea „-flto-toplevel-asm-heuristics”, care introduce o euristică pentru îmbunătățirea optimizării codului cu inserții de asamblare. Tehnica de devirtualizare speculativă (-fdevirtualize-speculatively) nu mai este limitată la conversia metodelor virtuale și poate fi aplicată la conversia în apeluri directe ale oricăror apeluri indirecte de funcții, de exemplu, apeluri prin pointere.
- S-a implementat suportul pentru vectorizarea buclelor, pentru care numărul de iterații nu este cunoscut la etapa de compilare. Eficiența gestionării ieșirilor anticipat din buclă (de exemplu, prin break) a fost îmbunătățită.
- Suport experimental adăugat multor posibilitățile standard recent aprobat C++26. De exemplu, au fost implementate:
- Reflecția (Reflection, „-freflection”), care permite urmărirea și modificarea elementelor programului în timpul compilării. Au fost adăugate noi operatori „^^ (open-std.org)” pentru obținerea metainformațiilor despre construcția gramaticală și „[:…:]” pentru a efectua conversia inversă. Pentru conversia și prelucrarea informațiilor obținute în timpul inspectării, a fost propusă biblioteca std::meta și sunt disponibile funcționalități precum calculele cu constante.
- Programarea prin contracte (Contracts), care permite definirea specificațiilor formale ale interfețelor folosind trei noi operatori: pre (precondiție), post (postcondiție) și contract_assert (verificarea afirmației). Operatorul „pre” definește condițiile preliminare care trebuie îndeplinite înainte de apel (verificarea datelor de intrare); „post” - condițiile care trebuie respectate după executare (cerințe pentru datele de ieșire); contract_assert - condițiile de generare a excepțiilor. Această posibilitate va fi disponibilă în GCC 16.
- Operatorul „template for” pentru iterația elementelor, cum ar fi pachetele de parametri, obiectele asemănătoare tuplurilor și rezultatele reflecției (metaobiecte), în etapa de compilare într-un stil de tipul unui ciclu obișnuit. Când se execută „template for”, corpul ciclului este desfășurat pentru fiecare element, iar fiecare iterație este tratată într-un spațiu de vizibilitate separat, în care elementul secvenței peste care se iterează este o constantă pentru fiecare iterație și poate participa în expresii constante (constexpr). În contextul reflecției, „template for” poate fi utilizat pentru a parcurge proprietățile claselor sau ale enumerărilor.
- Biblioteca std::simd pentru paralelizarea execuției operațiunilor asupra datelor folosind seturi de instrucțiuni SIMD, precum AVX-512 și NEON, utilizând sistemul standard de tipuri C++.
- Bibliotecile std::inplace_vector, std::optional, std::copyable_function, std::function_ref, std::indirect, std::polymorphic și std::owner_equal.
- Au fost implementate funcționalități legate de standardul C++23, cum ar fi managementul explicit al duratei de viață a obiectelor și suport pentru specificarea codificării caracterelor în mesajele de diagnostic.
- S-a extins suportul pentru standardul C23 (opennet.ro), de exemplu, a fost implementată posibilitatea de a utiliza atributul „counted_by” pentru a verifica corectitudinea utilizării pointerilor.
- Continuarea implementarea standardelor OpenMP 5.0, 5.1, 5.2 și 6.0 (Open Multi-Processing), care definesc API-urile și metodele de aplicare a tehnicilor de programare paralelă pe sisteme multicore și hibride (CPU+GPU/DSP) cu memorie comună și blocuri de vectorizare (SIMD). A fost îmbunătățită implementarea specificațiilor de programare paralelă OpenACC 3.0, 3.3 și 3.4, care definesc instrumente pentru externalizarea operațiunilor (offloading) pe GPU-uri și procesoare specializate, cum ar fi NVIDIA PTX.
- În backend-ul pentru arhitectura x86 a fost adăugată suport pentru procesoare AMD bazate pe microarhitectura Zen6 (-march=znver6), precum și pentru procesoare Intel Wildcat Lake (-march=wildcatlake) și Nova Lake (-march=novalake).
- În backend-ul generării de cod pentru GPU AMD Radeon (GCN) a fost implementat suport pentru acceleratoarele AMD Instinct MI300 (gfx942).
- Pentru arhitecturile RISC-V, ARM, S/390 și LoongArch a fost implementat suport pentru tipul „_BitInt (N)” pentru definirea numerelor întregi cu un număr specificat de biți.
Sursa: linux.org.ru
