Po roku prac rozwojowych opublikowano wydanie swobodnego zestawu kompilatorów GCC 16.1, pierwsze znaczące wydanie w nowej gałęzi GCC 16.x. Zgodnie z schematem numeracji wydań, wersja 16.0 była używana w procesie rozwoju, a niedługo przed wydaniem GCC 16.1 już odgałęziła się gałąź GCC 17.0, na podstawie której utworzony zostanie następny znaczący release GCC 17.1.
Podstawowe zmiany:
- Tryb domyślny dla języka C++ został zmieniony na wykorzystanie standardu C++20 (dialekt GNU C++20, -std=gnu++20) zamiast wcześniej proponowanego C++17. Implementacja C++20 w standardowej bibliotece została uznana za stabilną.
- W skład włączono eksperymentalny frontend ga68 do kompilacji programów w języku Algol 68 (Algol 68).
- Dodano możliwość wyprowadzania informacji diagnostycznej w formacie HTML. Rozszerzono informacji o postępie wykonania programu, zawierającej się w diagnostyce w formacie SARIF, opartym na JSON (wsparcie dla „-fdiagnostics-format=json” zostało zakończone).
- Rozszerzono optymalizacje na etapie linkowania (LTO, Link-Time Optimization). Dodano opcję „-flto-toplevel-asm-heuristics”, włączającą heurystykę dla poprawy optymalizacji kodu z wstawkami assemblerowymi. Technika spekulatywnej dewirtualizacji (-fdevirtualize-speculatively) nie jest już ograniczona do transformacji metod wirtualnych i może być stosowana podczas transformacji wprost do wywołań jakichkolwiek pośrednich wywołań funkcji, np. wywołań przez wskaźniki.
- Zrealizowano wsparcie dla wektoryzacji pętli, dla których na etapie kompilacji nieznana jest liczba iteracji. Zwiększono efektywność obsługi wcześniejszych wyjść z pętli (np. przez break).
- Dodano eksperymentalne wsparcie wielu możliwości niedawno zatwierdzonego standardu C++26. Na przykład zrealizowano:
- Refleksja (Reflection, „-freflection”), umożliwiająca śledzenie i modyfikowanie elementów programu na etapie kompilacji. Dodano nowe operatory „^^ (open-std.org)” do uzyskiwania metainformacji o konstrukcjach gramatycznych i „[:…:]” do wykonywania odwrotnej transformacji. Do transformacji i przetwarzania informacji uzyskanych podczas inspekcji zaproponowano bibliotekę std::meta, a dostępne są takie możliwości, jak obliczenia z konstanta.
- Programowanie kontraktowe (Umowy), które umożliwia określenie formalnych specyfikacji interfejsów za pomocą trzech nowych operatorów: pre (warunek wstępny), post (warunek końcowy) i contract_assert (sprawdzanie asercji). Operator „pre” definiuje warunki, które muszą być spełnione przed wywołaniem (weryfikacja danych wejściowych); „post” — warunki, które muszą być spełnione po wykonaniu (wymagania dotyczące danych wyjściowych); contract_assert — warunki wystąpienia wyjątków. Funkcjonalność ta pojawi się w GCC 16.
- Operator „template for” do iteracji po elementach, takich jak pakiety parametrów, obiekty przypominające krotki i wyniki refleksji (metaobiekty), na etapie kompilacji w stylu zwykłej pętli. Podczas wykonywania „template for” ciało pętli jest rozwijane dla każdego elementu, a każda iteracja jest przetwarzana w oddzielnym obszarze widzenia, w którym element sekwencji, po której iteruje pętla, jest stałą dla każdej iteracji i może brać udział w wyrażeniach stałoprzekazanych (constexpr). W kontekście refleksji „template for” może być stosowany do przeszukiwania właściwości klas lub wyliczeń.
- Biblioteka std::simd do równoległego wykonywania operacji na danych za pomocą zestawów instrukcji SIMD, takich jak AVX-512 i NEON, z wykorzystaniem standardowego systemu typów C++.
- Biblioteki std::inplace_vector, std::optional<T&>, std::copyable_function, std::function_ref, std::indirect, std::polymorphic i std::owner_equal.
- Zrealizowane zostały możliwości związane ze standardem C++23, takie jak jawne zarządzanie czasem życia obiektów oraz wsparcie określenia kodowania znaków komunikatów diagnostycznych.
- Rozszerzona została obsługa standardu C23 (opennet.ru), na przykład zrealizowano możliwość użycia atrybutu „counted_by” do weryfikacji prawidłowego użycia wskaźników.
- Kontynuowano realizacja standardów OpenMP 5.0, 5.1, 5.2 i 6.0 (Open Multi-Processing), które definiują API i metody stosowania technik programowania równoległego w systemach wielordzeniowych i hybrydowych (CPU+GPU/DSP) z wspólną pamięcią i blokami wektoryzacji (SIMD). Ulepszono wdrożenie specyfikacji programowania równoległego OpenACC 3.0, 3.3 i 3.4, które definiują narzędzia do przenoszenia operacji (offloading) na GPU i wyspecjalizowane procesory, takie jak NVIDIA PTX.
- Do backendu dla architektury x86 dodano wsparcie dla procesorów AMD opartych na mikroarchitekturze Zen6 (-march=znver6), a także procesorów Intel Wildcat Lake (-march=wildcatlake) i Nova Lake (-march=novalake).
- W backendzie generacji kodu dla GPU AMD Radeon (GCN) zaimplementowano wsparcie dla akceleratorów AMD Instinct MI300 (gfx942).
- Dla architektur RISC-V, ARM, S/390 i LoongArch zaimplementowano wsparcie dla typu „_BitInt (N)” do określania liczb całkowitych z określoną liczbą bitów.
Źródło: linux.org.ru
