Efter et års udvikling udgivet udgave af det frie compiler-sæt GCC 16.1, den første betydelige udgivelse i den nye GCC 16.x gren. I overensstemmelse med udgivelsesnumre, blev version 16.0 brugt under udviklingen, og kort før udgivelsen af GCC 16.1 blev der allerede lavet en gren GCC 17.0, på basis af hvilken den næste betydelige udgivelse, GCC 17.1, vil blive dannet.
Vigtige Optimeringer:
- Standardtilstand for C++-sproget er blevet ændret til at bruge standarden C++20 (-dialekt GNU C++20, -std=gnu++20) i stedet for den tidligere foreslåede C++17. Implementeringen af C++20 i standardbiblioteket er erklæret stabil.
- Der er inkluderet en eksperimentel frontend ga68 til at kompilere programmer i programmeringssproget Algol 68.
- Muligheden for at udskrive diagnostisk information i HTML-format er tilføjet. Information om programudførelsen er udvidet og inkluderet i diagnosen i formatet SARIF, baseret på JSON (understøttelsen af «-fdiagnostics-format=json» er ophørt).
- Optimeringer i linking-trinnet (LTO, Link-Time Optimization) er blevet udvidet. Der er tilføjet en mulighed «-flto-toplevel-asm-heuristics», der inkluderer heuristik til at forbedre kodeoptimeringen med assemblerindskud. Den spekulative devirtueliseringsteknik (-fdevirtualize-speculatively) er nu ikke begrænset til transformationer af virtuelle metoder og kan anvendes, når der konverteres til direkte kald af enhver form for indirekte funktionskald, f.eks. kald via pointere.
- Der er implementeret understøttelse af vektorisering af løkker, hvor antallet af iterationer er ukendt under kompilering. Effektiviteten af behandlingen af tidlige udgange fra løkken (f.eks. via break) er blevet forbedret.
- Experimental support has been added. mange funktioner af den nyligt godkendte standard C++26. For eksempel er der implementeret:
- Refleksion (Reflection, «-freflection»), som gør det muligt at spore og ændre programmets elementer under kompilering. Nye operatorer er tilføjet: «^^ (open-std.org)» til at få meta-information om grammatiske konstruktioner og «[:…:]» til at udføre den omvendte transformation. Til transformation og behandling af de informationer, der er indhentet under inspektion, er der foreslået et bibliotek std::meta, og der er tilgængelige funktioner for beregninger med konstanter.
- Kontraktprogrammering (Contracts), der muliggør definition af formelle specifikationer for interfaces ved hjælp af tre nye operatorer: pre (forudsætning), post (efterbetingelse) og contract_assert (påstandskontrol). Operatoren „pre“ angiver de forudsætninger, der skal opfyldes før kaldet (validering af inputdata); „post“ angiver de betingelser, der skal overholdes efter udførelsen (krav til outputdata); contract_assert angiver betingelser for undtagelseshåndtering. Muligheden vil blive tilgængelig i GCC 16.
- Operatoren „template for“ til iteration over elementer såsom parametrapakker, der ligner tupler, objekter og refleksionens resultater (meta-objekter) under kompilering, i stil med en almindelig løkke. Under udførelsen af „template for“ bliver løkkens indhold åbnet for hvert element, og hver iteration håndteres i et separat synsfelt, hvor det element, som løkken itererer over, er en konstant for hver iteration og kan deltage i konstantudtryk (constexpr). I refleksionssammenhæng kan „template for“ anvendes til at gennemgå klasse- eller enum-egenskaber.
- Biblioteket std::simd til parallel udførelse af operationer på data ved hjælp af SIMD-instruktionssæt såsom AVX-512 og NEON, med brug af C++ standard type system.
- Bibliotekerne std::inplace_vector, std::optional<T&>, std::copyable_function, std::function_ref, std::indirect, std::polymorphic og std::owner_equal.
- Mulighederne relateret til C++23 standarden er implementeret, såsom eksplicit livscyklusstyring af objekter og understøttelse af angivelse af tegnkodning for diagnostiske beskeder.
- Støtten til standarden C23 (opennet.ru), eksempelvis er muligheden for at anvende attributten „counted_by“ blevet implementeret til at kontrollere korrekt brug af pegere.
- Fortsat implementering af standarder OpenMP 5.0, 5.1, 5.2 og 6.0 (Open Multi-Processing), der definerer API'er og anvendelsesmåder for metoder til parallel programmering på multi-core og hybride (CPU+GPU/DSP) systemer med delt hukommelse og SIMD-vektorisering blokke. simulering af farveblindhed er gennemført. Simuleringen af protanopisk, deuteranopisk og tritanopisk implementering af specifikationer for parallel programmering OpenACC 3.0, 3.3 og 3.4, der definerer midler til offloading operationer til GPU'er og specialiserede processorer såsom NVIDIA PTX.
- Der er tilføjet støtte til AMD-processorer baseret på Zen6 mikroarkitektur (-march=znver6), samt Intel-processorer Wildcat Lake (-march=wildcatlake) og Nova Lake (-march=novalake) i backenden til x86-arkitekturen.
- I backend for kodegenerering til GPU AMD Radeon (GCN) er der implementeret understøttelse af AMD Instinct MI300 (gfx942) accelerators.
- For RISC-V, ARM, S/390 og LoongArch arkitekturer er der implementeret støtte for typen «_BitInt (N)» til at definere heltal med et angivet antal bit.
Kilde: linux.org.ru
