Wydanie zestawu kompilatorów GCC 15

Po roku pracy opublikowano wydanie wolnego zestawu kompilatorów GCC 15.1, pierwsze istotne wydanie w nowej gałęzi GCC 15.x. Zgodnie z schematem numeracji wydań, wersja 15.0 była używana w procesie rozwoju, a krótko przed wydaniem GCC 15.1 już odgałęziła się wersja GCC 16.0, na podstawie której zostanie opracowane następne istotne wydanie GCC 16.1.

Główne zmiany:

  • Podczas kompilacji programów w języku C domyślnie wykorzystywany jest standard C23 (przegląd zmian) z rozszerzeniami GNU („-std=gnu23”). Wcześniej domyślnie używany był standard C17 — „-std=gnu17”). Zmiana ta może potencjalnie prowadzić do problemów przy budowie istniejących projektów z powodu wprowadzenia stałej nullptr, typu _BitInt(n) oraz słów kluczowych bool, true i false, które mogą kolidować z zadanymi w aplikacjach identyfikatorami o tych samych nazwach.
  • Zrealizowano możliwości standardu C23:
    • Dyrektywa „#embed”, przeznaczona do osadzania w kodzie zasobów binarnych.
    • Atrybut „unsequenced”, sygnalizujący, że wynik nie zależy od kolejności wykonania.
    • Atrybut „reproducible”, wskazujący, że funkcja zawsze zwraca ten sam wynik dla tych samych danych wejściowych, tzn. nie zależy od innych czynników.
  • Zrealizowano elementy przyszłego standardu C2Y (-std=c2y i -std=gnu2y):
    • Możliwość deklarowania zmiennych w operatorze „if”, na przykład „if (int x = get()) {…}”.
    • Wsparcie dla nadawania nazw pętlom, aby można było się do nich odnosić w kodzie. outer: for (int i = 0; i < IK; ++i) { switch (i) { case 1: break; // jumps to CONT1 case 2: break outer; // jumps to CONT2 } // CONT1 } // CONT2
    • Wsparcie dla wskazywania zakresów wartości całkowitych w wyrażeniach „case”, na przykład „case 1 … 10:”.
    • Sufiksy „i” i „j” oznaczające część urojona w liczbach zespolonych.
    • Możliwość używania operatorów „++” i „—” z liczbami zespolonymi.
    • Konstrukcja „_Generic(type, expr1, expr2, …)” do wyboru wyrażenia w oparciu o typ operandu.
    • Wsparcie dla odniesienia do tablic bajtowych jako innych typów obiektów, takich jak struktury i unie.
    • Wsparcie dla zastosowania operatora „alignof” do niepełnych tablic (deklarowanych bez podawania rozmiaru, na przykład „int a[]”).
    • Dodano nowy składnia dla ósemkowych, szesnastkowych i uniwersalnych sekwencji escape dla znaków. Zamiast „\u”, „\x” i „\nnn” zaproponowano sekwencje „\u{}”, „\o{}” i „\x{}”, w których można podać dowolną liczbę cyfr.
    • Wbudowane funkcje „__builtin_stdc_rotate_left” i „__builtin_stdc_rotate_right”.
    • Dozwolone operacje z zerową długością na wskaźnikach NULL (na przykład „sizeof(*p)”).
  • W frontendzie dla języka C++ zrealizowano możliwości rozwijane dla przyszłego standardu C++26:
    • Operator wariantowy „friend” („friend Ts…”).
    • Możliwość użycia słowa kluczowego „constexpr” z rodzajem operatora „new” (placement new) do umieszczania obiektu w z góry przydzielonej pamięci podczas kompilacji.
    • Wyświetlenie błędu przy usuwaniu wskaźnika na niepełny typ.
    • Została uznana za przestarzałą składnia definiowania parametrów wariancyjnych z wielokropkiem bez poprzedzającego przecinka (na przykład, gdy określono „void e(int…)” zamiast „void e(int, …)”).
    • Indeksowanie pakietu parametrów w szablonach.
    • Atrybuty dla strukturalnych powiązań;
    • Składnia „= delete(„powód”);
    • Włączenie „@”, „$” i „`” do podstawowego zestawu znaków.
    • Zabroniono używania makr do deklarowania modułów.
    • Możliwość zastosowania strukturalnego powiązania w warunkach operatorów if i switch.
    • Zaprzestano wsparcia bezpośredniego porównania tablic (np. „int arr1[5]; int arr2[5]; bool same = arr1 == arr2”).
    • Mechanizm „#embed” do wbudowywania zasobów binarnych.
    • Została uznana za przestarzałą szablonowa klasa is_trivial.
  • Dodano możliwości C++23:
    • Zakaz niektórych zastosowań dyrektywy „export” oraz zezwolenie na użycie „export {}”.
    • Wsparcie przedłużania czasu życia obiektów tymczasowych w pętlach „for”, iterujących po zakresach.
  • W bibliotece libstdc++ wprowadzono eksperymentalne wsparcie modułów std i std.compat.
  • Użycie inicjalizatora „{0}” dla unii w kodzie w C i C++ nie gwarantuje teraz czyszczenia całej zawartości, a prowadzi do zerowania pierwszego elementu unii. Aby oczyścić całą unię, należy użyć wyrażenia „{}”, określonego w specyfikacji C23, lub wskazać opcję „-fzero-init-padding-bits=unions”, aby przywrócić starą funkcjonalność.
  • Wsparcie dla atrybutu „musttail” ([[gnu::musttail]] i [[clang::musttail]]) dla gwarantowanych wywołań ogonowych. Atrybut stosuje się do wyrażeń return, w których dokonuje się rekurencyjnego wywołania bieżącej funkcji, i gwarantuje, że takie wywołanie wykorzysta rekursję ogonową, przy której nie przydziela się dodatkowej pamięci na stosie (eliminując ryzyko wyczerpania pamięci przy bardzo dużej liczbie wywołań).
  • Wprowadzono wsparcie dla atrybutu flag_enum ([[gnu::flag_enum]] i [[clang::flag_enum]]), stosowanego w enumeracjach w celu wskazania, że zawartość jest wykorzystywana w operacjach bitowych (wyklucza wydawanie ostrzeżeń w trybie „-Wswitch”).
  • Dodano wsparcie dla atrybutu „counted_by”, który umożliwia wskazanie pola w strukturze z elastyczną tablicą określającego liczbę elementów. Atrybut może być używany w celu zwiększenia efektywności kontroli wyjść poza bufor.
  • Dla funkcji dodano atrybut „nonnull_if_nonzero”, który określa, że niektóre parametry funkcji z wskaźnikami mogą przyjmować wartość NULL tylko, jeśli inny parametr ma wartość zero.
  • Dozwolone jest używanie rozszerzonych wstawek asemblera „asm (….)” poza funkcjami. W wstawkach asemblera dozwolone jest nadpisywanie pamięci w czerwonej strefie stosu (obszar na szczycie stosu).
  • Kompilacja kodu C++ została przyspieszona dzięki ulepszonym metodom haszowania szablonów.
  • Dodano nowe optymalizacje. Wprowadzono wsparcie dla wektoryzacji pętli, w których znajduje się kod dla wcześniejszego wyjścia (na przykład przez wywołanie break lub return), nawet jeśli takie pętle manipulują dynamicznie przydzielonymi tablicami lub buforami, których rozmiar nie jest znany na etapie kompilacji. Wskazanie opcji „-O2” włącza wektoryzację niektórych łatwych do wektoryzacji pętli, dla których brakuje informacji o liczbie iteracji (tripcount).
  • Dodano tryb inkrementalnej optymalizacji na etapie łączenia (LTO, Link-Time Optimization), znacznie skracający czas rekompilacji w sytuacjach, gdy wprowadzono niewielkie zmiany w kodzie (zmodyfikowano jedną funkcję). Aby włączyć tryb inkrementalny, zaproponowano opcję „-flto-incremental”.
  • Udoskonalono kompilację bardzo dużych plików wejściowych. Wprowadzono śledzenie numerów kolumn przekraczających 4096. Podniesiono dokładność wskazywania miejsca wystąpienia błędów i ostrzeżeń w bardzo dużych plikach.
  • Zwiększona czytelność raportów podczas diagnozowania problemów. Na przykład zapewniono zaznaczenie miejsca wystąpienia problemu symbolem „⚠️”, zmieniono układ wyjścia w przypadku błędów w szablonach C++, dodano wskazówki ułatwiające przejście na standard C23, zmieniono schemat kolorów. Dodano możliwość wyjścia diagnostyki w formacie Sarif (-fdiagnostics-format=sarif-file).
  • Zrealizowano bibliotekę libgdiagnostics, która umożliwia integrację funkcji GCC związanych z tworzeniem komunikatów diagnostycznych w projektach (na przykład można wykorzystać narzędzia do cytowania, podświetlania i sugestii dotyczących poprawek).
  • Dodano ostrzeżenia «-Wtrailing-whitespace» i «-Wleading-whitespace» w celu wykrywania pozostałych spacji na końcu linii oraz zbędnych spacji na początku linii.
  • Dodano ostrzeżenie «-Wheader-guard» informujące o problemach w makrach ochrony plików nagłówkowych zapobiegających ponownemu włączeniu pliku nagłówkowego.
  • Frontend dla języka D został zaktualizowany do wersji 2.111.0.
  • Frontend dla języka Fortran zyskał wsparcie dla liczb całkowitych bez znaku.
  • Do zestawu dołączono kompilator dla języka COBOL — gcobol, wspierający platformy x86-64 i AArch64, nieprzeznaczony do użytku na systemach 32-bitowych. Kompilator realizuje specyfikację ISO/IEC 1989:2023 i przechodzi większość testów NIST CCVS/85.
  • Kontynuowany jest rozwój standardów OpenMP 5.0, 5.1, 5.2 i 6.0 (Open Multi-Processing), które definiują API i metody stosowania programowania równoległego na systemach wielordzeniowych i hybrydowych (CPU+GPU/DSP) z pamięcią współdzieloną oraz jednostkami wektorowymi (SIMD). Dodano wsparcie dla metanorm i konstrukcji tile, unroll, interop i dispatch. Dla niektórych GPU AMD i NVIDIA dodano obsługę zunifikowanej pamięci współdzielonej (włączanej przez wskazanie unified_shared_memory w dyrektywie «requires»). Dodano obsługę wyrażenia «self_maps».
  • W backendzie dla architektury AArch64 dodano wsparcie dla platformy MinGW (aarch64-w64-mingw32). Zrealizowano ponad 20 rozszerzeń ARM8 i ulepszono wsparcie dla rozszerzenia ACLE (Arm C Language Extensions). Wprowadzono liczne ulepszenia w generatorze kodu. Dodano wsparcie dla CPU:
    • Apple A12 (apple-a12)
    • Apple M1 (apple-m1)
    • Apple M2 (apple-m2)
    • Apple M3 (apple-m3)
    • Arm Cortex-A520AE (cortex-a520ae)
    • Arm Cortex-A720AE (cortex-a720ae)
    • Arm Cortex-A725 (cortex-a725)
    • Arm Cortex-R82AE (cortex-r82ae)
    • Arm Cortex-X925 (cortex-x925)
    • Arm Neoverse N3 (neoverse-n3)
    • Arm Neoverse V3 (neoverse-v3)
    • Arm Neoverse V3AE (neoverse-v3ae)
    • FUJITSU-MONAKA (fujitsu-monaka)
    • NVIDIA Grace (grace)
    • NVIDIA Olympus (olympus)
    • Qualcomm Oryon-1 (oryon-1)
  • W backendzie generacji kodu dla GPU AMD Radeon (GCN) wprowadzono wsparcie dla biblioteki libstdc++ oraz dodano eksperymentalne wsparcie dla generacji kodu dla serii urządzeń gfx9-generic, gfx10-3-generic i gfx11-generic.
  • W backendzie architektury x86 dodano wsparcie dla rozszerzeń zestawu instrukcji Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Dodano wsparcie dla procesorów Intel Diamond Rapids i Xeon Phi.
  • Rozszerzono możliwości backendów dla platform LoongArch i AVR.
  • Usunięto wsparcie dla architektury docelowej nios2, stosowanej w procesorach Nios II. Oznaczono jako przestarzałą, a wsparcie dla ABI ILP32 (-mabi=ilp32) w portowaniu na AArch64 zostanie usunięte w następnym istotnym wydaniu.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster