Po roku prac udostępniono bezpłatny kompilator GCC GCC 15.1. Jest to pierwsza główna wersja w nowej gałęzi GCC 15.x. Zgodnie ze schematem numeracji wydań, w trakcie rozwoju używano wersji 15.0, a na krótko przed wydaniem GCC 15.1 rozwidliła się gałąź GCC 16.0, która stanie się podstawą kolejnego głównego wydania GCC 16.1.
Główne zmiany:
- Podczas kompilowania programów w języku C domyślnie używany jest standard C23 (Podsumowanie zmian) z rozszerzeniami GNU („-std=gnu23”). Wcześniej domyślnie używany był standard C17 (-std=gnu17). Zmiana ta może potencjalnie powodować problemy podczas kompilacji istniejących projektów ze względu na uwzględnienie stałej nullptr, typu _BitInt(n) oraz słów kluczowych bool, true i false, co może powodować konflikty z podobnie nazwanymi identyfikatorami zdefiniowanymi w aplikacjach.
- Zaimplementowano następujące możliwości standardu C23:
- Dyrektywa „#embed” jest przeznaczona do osadzania zasobów binarnych w kodzie.
- Atrybut „unsequenced” oznacza, że wynik nie zależy od kolejności wykonania.
- Atrybut „reproducible” oznacza, że funkcja zawsze zwraca ten sam wynik przy użyciu tych samych danych wejściowych, tzn. nie zależy od innych czynników.
- Zaimplementowano elementy przyszłego standardu C2Y (-std=c2y i -std=gnu2y):
- Możliwość deklarowania zmiennych w instrukcji „if”, takiej jak „if (int x = get ()) {...}”.
- Obsługa pętli nazewnictwa, umożliwiająca odwoływanie się do nich w kodzie. zewnętrzny: dla (int i = 0; i < IK; ++ i) { przełącznik (i) { przypadek 1: przerwa; // przechodzi do CONT1 case 2: break outer; // przechodzi do CONT2 } // CONT1 } // CONT2
- Obsługa określania zakresów wartości całkowitych w wyrażeniach case, takich jak „case 1...10:”.
- Przyrostki „i” i „j” oznaczają część urojoną w liczbach zespolonych.
- Możliwość stosowania operatorów „++” i „—” z liczbami zespolonymi.
- Konstrukcja „_Generic(type, expr1, expr2, …)” umożliwiająca wybór wyrażenia na podstawie typu operandu.
- Obsługa dostępu do tablic bajtów w taki sam sposób jak do innych typów obiektów, np. struktur i uni.
- Obsługa stosowania operatora „alignof” do niekompletnych tablic (zadeklarowanych bez określania rozmiaru, np. „int a[]”).
- Dodano nową składnię dla sekwencji ucieczki znaków ósemkowych, szesnastkowych i uniwersalnych. Zamiast „\u”, „\x” i „\nnn” zaproponowano sekwencje „\u{}”, „\o{}” i „\x{}”, w których można określić dowolną liczbę cyfr.
- Wbudowane funkcje „__builtin_stdc_rotate_left” i „__builtin_stdc_rotate_right”.
- Dozwolone są operacje zerowej długości na wskaźnikach NULL (np. „sizeof(*p)”).
- Interfejs użytkownika języka C++ implementuje funkcje, które są rozwijane na potrzeby przyszłego standardu C++26:
- Operator wariacyjny „przyjaciel” („przyjaciel Ts...”).
- Możliwość użycia słowa kluczowego constexpr z odmianą operatora new (placement new) w celu umieszczenia obiektu w pamięci przydzielonej wcześniej w czasie kompilacji.
- Wyjście błędu podczas usuwania wskaźnika do niekompletnego typu.
- Składnia definiowania parametrów zmiennych z wielokropkiem bez przecinka poprzedzającego (na przykład podczas określania „void e(int…)” zamiast „void e(int, …)”) została wycofana.
- Indeksowanie pakietu parametrów w szablonach.
- Atrybuty dla powiązań strukturalnych;
- Składnia '= delete("powód");
- Dołączenie znaków „@”, „$” i „`” do podstawowego zestawu znaków.
- Używanie makr do deklarowania modułów jest zabronione.
- Możliwość wykorzystania powiązania strukturalnego jako warunku w instrukcjach if i switch.
- Zakończono obsługę bezpośredniego porównywania tablic (np. „int arr1[5]; int arr2[5]; bool same = arr1 == arr2”).
- Mechanizm „#embed” służący do osadzania zasobów binarnych.
- Klasa szablonu is_trivial została uznana za przestarzałą.
- Dodano funkcje C++23:
- Zabroń stosowania niektórych zastosowań dyrektywy „export” i zezwól na stosowanie „export {}”.
- Obsługa wydłużania czasu życia obiektów tymczasowych w pętlach for iterujących po zakresach.
- Biblioteka libstdc++ implementuje eksperymentalną obsługę modułów std i std.compat.
- Użycie inicjatora "{0}" dla unii w kodzie C i C++ nie gwarantuje już wyczyszczenia całej zawartości, lecz zamiast tego powoduje wyzerowanie pierwszego elementu unii. Aby wyczyścić całą unię, użyj wyrażenia „{}” zdefiniowanego w specyfikacji C23 lub określ opcję „-fzero-init-padding-bits=unions”, aby przywrócić stare zachowanie.
- Wprowadzono obsługę atrybutu „musttail” ([[gnu::musttail]] i [[clang::musttail]]) w celu gwarantowanego wywołania końcowego. Atrybut ten ma zastosowanie do poleceń return, które wykonują rekurencyjne wywołanie bieżącej funkcji i zapewnia, że takie wywołanie użyje rekurencji ogonowej, która nie przydziela dodatkowej pamięci na stosie (eliminując ryzyko wyczerpania pamięci przy bardzo dużej liczbie wywołań).
- Wprowadzono obsługę atrybutu flag_enum ([[gnu::flag_enum]] i [[clang::flag_enum]]) stosowanego do wyliczeń w celu wskazania, że zawartość jest używana w operacjach bitowych (zapobiega to pojawianiu się ostrzeżeń w trybie -Wswitch).
- Dodano obsługę atrybutu „counted_by”, którego można użyć do określenia pola w strukturze z elastyczną tablicą, która określa liczbę elementów. Atrybut ten można wykorzystać do zwiększenia efektywności sprawdzania przepełnienia bufora.
- Dodano atrybut „nonnull_if_nonzero” do funkcji, który określa, że niektóre parametry funkcji ze wskaźnikami mogą być NULL tylko wtedy, gdy inny parametr jest równy zero.
- Dozwolone jest rozszerzone wstawianie asemblera „asm(….)” poza funkcje. W przypadku insertów asemblera dozwolone jest nadpisywanie pamięci w czerwonej strefie stosu (obszar na szczycie stosu).
- Kompilacja kodu C++ jest szybsza dzięki ulepszonemu hashowaniu szablonów.
- Dodano nowe optymalizacje. Wprowadzono obsługę pętli wektorowych zawierających kod umożliwiający wcześniejsze wyjście (na przykład poprzez wywołanie break lub return), nawet jeśli takie pętle manipulują dynamicznie przydzielanymi tablicami lub buforami, których rozmiar nie jest znany w momencie kompilacji. Gdy określona jest opcja -O2, włączana jest wektoryzacja niektórych pętli, które można łatwo wektoryzować, dla których nie są dostępne informacje o liczbie podróży.
- Dodano tryb optymalizacji przyrostowej na etapie łączenia (LTO, Link-Time Optimization), który znacznie skraca czas ponownej kompilacji podczas korzystania z LTO w sytuacjach, w których wprowadzono drobne zmiany w kodzie (edytowano jedną funkcję). Aby włączyć tryb przyrostowy, proponowana jest opcja „-flto-incremental”.
- Ulepszona kompilacja bardzo dużych plików wejściowych. Wprowadzono śledzenie numerów kolumn większych niż 4096. Poprawiono dokładność wskazywania lokalizacji błędów i ostrzeżeń w bardzo dużych plikach.
- Lepsza widoczność raportów podczas diagnozowania problemów. Na przykład lokalizacja problemu została wyróżniona symbolem „⚠️”, zmieniono układ wyników dla błędów w szablonach C++, dodano wskazówki ułatwiające przejście do standardu C23, a także przeprojektowano schemat kolorów. Dodano możliwość wyprowadzania diagnostyki w formacie Sarif (-fdiagnostics-format=sarif-file).
- Zaimplementowano bibliotekę libgdiagnostics, która umożliwia integrację możliwości GCC związanych z projektowaniem komunikatów diagnostycznych z projektami (można na przykład używać cytowania, wyróżniania i wskazówek dotyczących korekt).
- Dodano ostrzeżenia „-Wtrailing-whitespace” i „-Wleading-whitespace” w celu wykrywania resztkowych odstępów na końcu wierszy i dodatkowych odstępów na początku wierszy.
- Dodano ostrzeżenie „-Wheader-guard” w celu zgłaszania problemów w makrach ochrony nagłówka, które uniemożliwiają ponowne dołączenie pliku nagłówkowego.
- Interfejs użytkownika języka D został zaktualizowany do wersji 2.111.0.
- Do interfejsu użytkownika Fortran dodano obsługę liczb całkowitych bez znaku.
- Pakiet zawiera kompilator języka COBOL, gcobol, który obsługuje platformy x86-64 i AArch64 i nie jest przeznaczony do użytku w systemach 32-bitowych. Kompilator implementuje specyfikację ISO/IEC 1989:2023 i zalicza większość testów NIST CCVS/85.
- Kontynuowano wdrażanie standardów OpenMP 5.0, 5.1, 5.2 i 6.0 (Open Multi-Processing), definiujących API i metody stosowania metod programowania równoległego w systemach wielordzeniowych i hybrydowych (CPU+GPU/DSP) ze współdzieloną pamięcią i jednostkami wektoryzacji (SIMD). Dodano obsługę metadyrektyw oraz konstrukcji kafelków, rozwijania, współdziałania i wysyłania. W przypadku niektórych procesorów graficznych AMD i NVIDIA dodano obsługę ujednoliconej pamięci współdzielonej (można ją włączyć, określając unified_shared_memory w dyrektywie „requires”). Dodano obsługę wyrażenia „self_maps”.
- Zaplecze architektury AArch64 zostało zaktualizowane w celu zapewnienia obsługi platformy MinGW (aarch64-w64-mingw32). Zaimplementowano ponad 20 rozszerzeń ARM8 i ulepszono obsługę rozszerzenia ACLE (Arm C Language Extensions). W generatorze kodu wprowadzono liczne udoskonalenia. Dodano obsługę procesora:
- Apple A12 (apple-a12)
- Apple M1 (apple-m1)
- Apple M2 (apple-m2)
- Apple M3 (apple-m3)
- Ramię Cortex-A520AE (cortex-a520ae)
- Ramię Cortex-A720AE (cortex-a720ae)
- Ramię Cortex-A725 (cortex-a725)
- Ramię Cortex-R82AE (cortex-r82ae)
- Ramię Cortex-X925 (cortex-x925)
- Uzbrój Neoverse N3 (neoverse-n3)
- Uzbrój Neoverse V3 (neoverse-v3)
- Ramię Neoverse V3AE (neoverse-v3ae)
- FUJITSU-MONAKA (fujitsu-monaka)
- Łaska NVIDIA
- NVIDIA Olympus (olympus)
- Qualcomm Oryon-1 (Oryon-1)
- Zaktualizowano zaplecze generowania kodu dla procesora graficznego AMD Radeon GPU (GCN) w celu zapewnienia obsługi biblioteki libstdc++, a także dodano eksperymentalną obsługę generowania kodu dla serii urządzeń gfx9-generic, gfx10-3-generic i gfx11-generic.
- Zaplecze x86 obsługuje teraz rozszerzenia architektury zestawu instrukcji Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Dodano obsługę procesorów Intel Diamond Rapids i Xeon Phi.
- Rozszerzone możliwości zaplecza dla platform LoongArch i AVR.
- Usunięto wsparcie dla docelowej architektury nios2 używanej w procesorach Nios II. Obsługa ILP32 ABI (-mabi=ilp32) w porcie AArch64 została wycofana i zostanie usunięta w następnej głównej wersji.
Źródło: opennet.ru
