Izdavašćeg kompleta kompajlera GCC 15

Nakon godine razvoja objavljen je izdanja slobodnog kompleta kompajlera GCC 15.1, prvo značajno izdanja u novoj grani GCC 15.x. U skladu sa shemom numerisanja izdanja, verzija 15.0 korišćena je u procesu razvoja, a nedugo pre izlaska GCC 15.1 već je odvojena grana GCC 16.0, na osnovu koje će biti formirano sledeće značajno izdanje GCC 16.1.

Glavne spremembe:

  • Prilikom kompajliranja programa na jeziku C podrazumevano se koristi standard C23 (pregled promena) sa GNU ekstenzijama ("-std=gnu23"). Ranije se podrazumevao standard C17 — "-std=gnu17". Promena može potencijalno uzrokovati probleme prilikom izgradnje postojećih projekata zbog uključivanja konstante nullptr, tipa _BitInt(n) i ključnih reči bool, true i false, koji mogu doći u sukob sa zadatim imenima u aplikacijama.
  • Implementirane su mogućnosti standarda C23:
    • Direktiva "#embed", namenjena za ugrađivanje u kod binarnih resursa.
    • Atribut "unsequenced", koji signalizira da rezultat ne zavisi od reda izvršavanja.
    • Atribut "reproducible", koji ukazuje da funkcija uvek vraća isti rezultat pri istim ulaznim podacima, tj. ne zavisi od drugih faktora.
  • Implementirani su elementi budućeg standarda C2Y (-std=c2y i -std=gnu2y):
    • Mogućnost deklarisanja promenljivih unutar operatora "if", na primer, "if (int x = get ()) {…}".
    • Podrška za imenovanje petlji kako bi se na njih moglo referisati u kodu. 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
    • Podrška za navođenje opsega celih vrednosti u izrazima "case", na primer, "case 1 … 10:".
    • Sufiksi "i" i "j" za označavanje imaginarne komponente u kompleksnim brojevima.
    • Mogućnost korišćenja operatora "++" i "—" sa kompleksnim brojevima.
    • Konstrukcija "_Generic(type, expr1, expr2, …)" za izbor izraza na osnovu tipa operanda.
    • Podrška za pristup bajtovnim nizovima kao drugim tipovima objekata, poput struktura i unija.
    • Podrška za primenu operatora "alignof" na nepotpunim nizovima (deklarisanim bez navođenja veličine, na primer, "int a[]").
    • Dodana je nova sintaksa za osmoljne, hexadecimalne in univerzalne escape-sekvence znakov. Namesto «\u», «\x» in «\nnn» so predlagane sekvence «\u{}», «\o{}» in «\x{}», pri čemer lahko navedete poljubno število številk.
    • Vgrajeni funkciji «__builtin_stdc_rotate_left» in «__builtin_stdc_rotate_right».
    • Dopustitev operacij z nulami dolžin na NULL kazalcih (na primer, «sizeof(*p)»).
  • V sprednjem delu za jezik C++ so uvedene možnosti, ki se razvijajo za prihodnji standard C++26:
    • Variabilni operator «friend» («friend Ts…»).
    • Možnost uporabe ključne besede «constexpr» skupaj z različico operatorja «new» (placement new) za postavitev objekta v vnaprej dodeljeno pomnilnik med prevajanjem.
    • Izpis napake pri brisanju kazalca na nepopoln tip.
    • Razglašena je zastarela sintaksa za določitev variabilnih parametrov z trojno piko brez predhodne vejice (na primer, ko je navedeno «void e(int…)» namesto «void e(int, …)»).
    • Indeksiranje paketa parametrov v predlogah.
    • Atributi za strukturirane povezave;
    • Sintaksa ‘= delete(«razlog»)’;
    • Vključitev «@», «$» in «`» v osnovni nabor znakov.
    • Zabranjena uporaba makrov za razglasitev modulov.
    • Možnost uporabe strukturiranega povezovanja (structured binding) kot pogoja v operatorjih if in switch.
    • Prekinjena je podpora za neposredno primerjanje polj (na primer, «int arr1[5]; int arr2[5]; bool same = arr1 == arr2»).
    • Mehanizem «#embed» za vključevalne binarne vire.
    • Razglašena je zastarela templatska klasa is_trivial.
  • Dodane so zmožnosti C++23:
    • Prepoved nekaterih uporabe direktive «export» in dovoljenje za uporabo «export {}».
    • Podpora za podaljšanje življenjske dobe začasnih objektov v «for» zankah, ki prehajajo skozi obseg.
  • V knjižnici libstdc++ je bila izvedena eksperimentalna podpora za module std in std.compat.
  • Uporaba inicializatorja «{0}» za unije v C in C++ kodi zdaj ne zagotavlja čiščenja vsebine, ampak privede do ničeljenja prvega elementa unije. Za čiščenje celotne unije je treba uporabiti izraz «{}», določen v specifikaciji C23, ali pa navesti možnost «-fzero-init-padding-bits=unions» za obnovitev starega obnašanja.
  • Поддержка атрибута «musttail» ([[gnu::musttail]] и [[clang::musttail]]) для гарантированных хвостовых вызовов реализована. Этот атрибут применяется к выражениям return, при которых выполняется рекурсивный вызов текущей функции, и обеспечивает использование хвостовой рекурсии, что исключает выделение дополнительной памяти в стеке (снижая риск исчерпания памяти при большом количестве вызовов).
  • Реализована поддержка атрибута flag_enum ([[gnu::flag_enum]] и [[clang::flag_enum]]), который применяется к перечислениям, чтобы указать, что содержимое используется в битовых операциях (это исключает предупреждения в режиме «-Wswitch»).
  • Добавлена поддержка атрибута «counted_by», позволяющего указывать поле в структуре с гибким массивом, которое определяет количество элементов. Этот атрибут может использоваться для повышения эффективности проверок выхода за границы буфера.
  • Для функций добавлен атрибут «nonnull_if_nonzero», который определяет, что некоторые параметры функции с указателями могут принимать значение NULL только если другой параметр равен нулю.
  • Разрешено использовать расширенные ассемблерные вставки «asm (….)» вне функций. В ассемблерных вставках теперь допускается перезаписывать память в красной зоне стека (область на вершине стека).
  • Компиляция кода на C++ стала быстрее благодаря улучшенному хэшированию шаблонов.
  • Добавлены новые оптимизации. Реализована поддержка векторизации циклов, в которых присутствует код для преждевременного выхода (например, через вызов break или return), даже если такие циклы манипулируют динамически выделяемыми массивами или буферами, размер которых неизвестен на этапе компиляции. При использовании опции «-O2» включена векторизация некоторых циклов, легко поддающихся векторизации, когда информация о количестве итераций (tripcount) отсутствует.
  • Добавлен режим инкрементальной оптимизации на этапе связывания (LTO, Link-Time Optimization), который существенно сокращает время перекомпиляции при использовании LTO в ситуациях, когда в код внесены незначительные изменения (например, отредактирована одна функция). Для активации инкрементального режима предложена опция «-flto-incremental».
  • Izboljšana je bila kompilacija zelo velikih vhodnih datotek. Uvedeno je sledenje številkam stolpcev, ki presegajo 4096. Povečana je natančnost označevanja lokacij napak in opozoril v zelo velikih datotekah.
  • Povečana je preglednost poročil pri diagnostiki težav. Na primer, zagotovljeno je označevanje mesta nastanka težave s simbolom „⚠️“, spremenjena je postavitev izhoda pri napakah v predlogah C++, dodane so namige za poenostavitev prehoda na standard C23, prenovljen je bil barvni sistem. Dodana je možnost izhoda diagnostike v formatu Sarif (-fdiagnostics-format=sarif-file).
  • Uvedena je bila knjižnica libgdiagnostics, ki omogoča integracijo možnosti GCC, povezanih z oblikovanjem diagnostičnih sporočil v vaše projekte (na primer, lahko se uporabljajo sredstva za citiranje, osvetlitev in namige za popravilo).
  • Dodana sta opozorili „-Wtrailing-whitespace“ in „-Wleading-whitespace“ za odkrivanje preostalih belih prostorov na koncu vrstic in odvečnih belih prostorov na začetku vrstic.
  • Dodano je opozorilo „-Wheader-guard“ za obveščanje o težavah v makroih za zaščito glavične datoteke, ki preprečujejo večkratno vključitev glavične datoteke.
  • Frontend za jezik D je bil posodobljen na različico 2.111.0.
  • V frontend za jezik Fortran je bila dodana podpora za brezznakovana cela števila.
  • Vključena je bila prevajalnik za jezik COBOL — gcobol, ki podpira platforme x86-64 in AArch64 ter ni namenjen uporabi na 32-bitnih sistemih. Prevajalnik izvaja specifikacijo ISO/IEC 1989:2023 in uspešno prestane večino testov NIST CCVS/85.
  • Uresničena je bila standardizacija OpenMP 5.0, 5.1, 5.2 in 6.0 (Open Multi-Processing), ki določajo API in načine uporabe metod paralelnega programiranja na večjedrnih in hibridnih (CPU+GPU/DSP) sistemih z deljeno pomnilnikom in blokirnim vektoriziranjem (SIMD). Dodana je podpora za metadirektiv in konstrukcij tile, unroll, interop in dispatch. Za nekatere GPU AMD in NVIDIA je bila dodana podpora za enotni deljeni pomnilnik (se vklopi z navedbo unified_shared_memory v direktivi „requires“). Dodana je podpora za izraz „self_maps“.
  • V backend za arhitekturo AArch64 je bila dodana podpora za platformo MinGW (aarch64-w64-mingw32). Uvedenih je več kot 20 razširitev ARM8 in izboljšana podpora za razširitev ACLE (Arm C Language Extensions). Izvedena so številna izboljšanja v generatorju kode. Dodana je podpora za 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)
  • V b backendu generacije kode za GPU AMD Radeon (GCN) je bila implementirana podpora za knjižnico libstdc++ ter dodana eksperimentalna podpora za generacijo kode za serije naprav gfx9-generic, gfx10-3-generic in gfx11-generic.
  • V backend za arhitekturo x86 je bila dodana podpora za razširitve arhitekture procesorskega nabora Intel AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS. Dodana je bila podpora za procesorje Intel Diamond Rapids in Xeon Phi.
  • Razširjene zmogljivosti backendov za platforme LoongArch in AVR.
  • Podpora za ciljno arhitekturo nios2, ki se uporablja v procesorjih Nios II, je bila odstranjena. Podpora za ABI ILP32 (-mabi=ilp32) v portu za AArch64 je razglašena za zastarelo in bo odstranjena v naslednji pomembni izdaji.

Izvor: opennet.ru

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster