Жилийн турш хөгжүүлсний дараа GCC 15.1 үнэгүй хөрвүүлэгчийн багц гарсан нь GCC 15.x-ийн шинэ салбар дахь анхны томоохон хувилбар юм. Хувилбарын дугаарлалтын схемийн дагуу 15.0 хувилбарыг хөгжүүлэлтийн явцад ашигласан бөгөөд GCC 15.1-ийг гаргахаас өмнөхөн GCC 16.0-ийн салбар аль хэдийн салаалагдсан байсан бөгөөд энэ нь дараагийн томоохон хувилбар болох GCC 16.1-ийн үндэс суурь болно.
Үндсэн өөрчлөлтүүд:
- Си программуудыг эмхэтгэхдээ GNU өргөтгөлтэй ("-std=gnu23") C23 стандартыг (Өөрчлөлтийн хураангуй) анхдагч байдлаар ашигладаг. Өмнө нь C17 стандартыг анхдагч байдлаар ашигладаг байсан (-std=gnu17). Энэхүү өөрчлөлт нь одоо байгаа төслүүдийг бүтээхэд nullptr тогтмол, _BitInt(n) төрөл, bool, true, false гэсэн түлхүүр үгсийг оруулсны улмаас асуудал үүсгэж болзошгүй бөгөөд энэ нь программд тодорхойлсон ижил нэртэй танигчтай зөрчилдөж болзошгүй юм.
- C23 стандартын дараах боломжуудыг хэрэгжүүлсэн.
- "#embed" заавар нь хоёртын нөөцийг код болгон оруулахад зориулагдсан.
- Үр дүн нь гүйцэтгэлийн дарааллаас хамаарахгүй гэдгийг харуулж буй "дараалалгүй" шинж чанар.
- "Дахин давтагдах" шинж чанар нь функц нь ижил оролтоор үргэлж ижил үр дүнг буцаадаг, өөрөөр хэлбэл бусад хүчин зүйлээс хамаардаггүй гэдгийг харуулж байна.
- Ирээдүйн C2Y стандартын элементүүдийг хэрэгжүүлсэн (-std=c2y ба -std=gnu2y):
- "if (int x = get ()) {...}" гэх мэт "if" хэллэгт хувьсагчдыг зарлах чадвар.
- Кодоор дурдах гогцоонуудыг нэрлэх дэмжлэг. гадаад: for (int i = 0; i < IK; ++ i) { switch (i) { case 1: break; // CONT1 тохиолдол 2 руу үсрэх: гадна талыг таслах; // CONT2 руу очно } // CONT1 } // CONT2
- "1...10:" гэх мэт тохиолдлын илэрхийлэлд бүхэл тоон утгын мужийг зааж өгөх дэмжлэг.
- "i", "j" дагавар нь нийлмэл тоогоор төсөөлөгдөх хэсгийг илэрхийлнэ.
- Комплекс тоо бүхий "++" ба "—" операторуудыг ашиглах боломж.
- "_Generic(type, expr1, expr2, …)" бүтэц нь операндын төрөлд тулгуурлан илэрхийлэл сонгоход зориулагдсан.
- Бүтэц, нэгдэл гэх мэт бусад объектын төрлүүд шиг байт массивуудад хандах дэмжлэг.
- Бүрэн бус массивуудад ("int a[]" гэх мэт хэмжээг заагаагүй зарлагдсан) "alignof" операторыг ашиглахад дэмжлэг үзүүлэх.
- Найман, арван зургаан тоот, бүх нийтийн тэмдэгтээс зугтах дарааллын шинэ синтакс нэмсэн. "\u", "\x" болон "\nnn"-ийн оронд "\u{}", "\o{}" болон "\x{}" гэсэн дарааллыг санал болгож, ямар ч тооны цифрийг зааж өгөх боломжтой.
- "__builtin_stdc_rotate_left" болон "__builtin_stdc_rotate_right" суурилуулсан функцууд.
- NULL заагч дээр тэг урттай үйлдлийг хийхийг зөвшөөрдөг (жишээ нь "sizeof(*p)").
- C++ хэлний урд тал нь ирээдүйн C++26 стандартад зориулан хөгжүүлж буй функцуудыг хэрэгжүүлдэг.
- Вариацын оператор "найз" ("найз Ц...").
- Объектыг хөрвүүлэх үед урьдчилан хуваарилсан санах ойд байрлуулахын тулд constexpr түлхүүр үгийг new операторын хувилбартай (шинэ байршуулах) ашиглах чадвар.
- Бүрэн бус төрлийн заагчийг устгах үед гарсан алдаа.
- Өмнөх таслалгүй олон талт параметрүүдийг тодорхойлох синтакс (жишээ нь, "void e(int, …)"-ын оронд "void e(int...)" гэж зааж өгөх үед) хуучирсан.
- Загвар дахь параметрийн багцыг индексжүүлэх.
- Бүтэцлэгдсэн холболтын шинж чанарууд;
- Синтакс '= устгах("шалтгаан")';
- Үндсэн тэмдэгтийн багцад "@", "$" болон "`"-г оруулах.
- Модуль зарлахын тулд макро ашиглахыг хориглоно.
- if болон switch хэллэгүүдэд бүтэцлэгдсэн холболтыг нөхцөл болгон ашиглах чадвар.
- Массивыг шууд харьцуулах (жишээ нь "int arr1[5]; int arr2[5]; bool same = arr1 == arr2") дэмжлэгийг зогсоосон.
- Хоёртын нөөцийг оруулах "#embed" механизм.
- is_trivial загварын анги хуучирсан.
- C++ 23 функцийг нэмсэн:
- "Экспорт" зааврын зарим хэрэглээг хориглож, "экспорт {}"-г ашиглахыг зөвшөөрнө үү.
- Муж дээр давтагддаг for гогцоонд түр зуурын объектуудын ашиглалтын хугацааг уртасгах дэмжлэг.
- Libstdc++ номын сан нь std болон std.compat модулиудын туршилтын дэмжлэгийг хэрэгжүүлдэг.
- C болон C++ кодын нэгдэлд "{0}" эхлүүлэгчийг ашигласнаар бүх агуулгыг арилгах баталгаа өгөхгүй, харин нэгдлийн эхний элементийг тэглэх болно. Холбоог бүхэлд нь арилгахын тулд C23 тодорхойлолтод тодорхойлсон "{}" илэрхийллийг ашиглана уу, эсвэл "-fzero-init-padding-bits=unions" сонголтыг зааж хуучин үйлдлийг сэргээнэ үү.
- Баталгаат дуудлагын "musttail" шинж чанарыг ([[gnu::musttail]] болон [[clang::musttail]]) дэмжсэн. Энэ шинж чанар нь одоогийн функцэд рекурсив дуудлага хийдэг буцаах мэдэгдлүүдэд хамаарах бөгөөд ийм дуудлага нь стек дээр нэмэлт санах ойг хуваарилдаггүй сүүлний рекурсийг ашиглахыг баталгаажуулдаг (маш олон тооны дуудлага хийх үед санах ой дуусах эрсдэлийг арилгадаг).
- Агуулга нь битийн үйлдэлд ашиглагдаж байгааг харуулахын тулд тоололд хэрэглэсэн flag_enum шинж чанарыг ([[gnu::flag_enum]] болон [[clang::flag_enum]]) дэмжсэн (-Wswitch горимд анхааруулга өгөхөөс сэргийлдэг).
- Элементүүдийн тоог тодорхойлдог уян массив бүхий бүтэц дэх талбарыг зааж өгөхөд ашиглаж болох "тоолдог_тоолдог" шинж чанарын дэмжлэгийг нэмсэн. Атрибутыг буфер халих шалгалтын үр ашгийг дээшлүүлэхэд ашиглаж болно.
- Функцуудад "nonnull_if_nonzero" атрибутыг нэмсэн бөгөөд энэ нь заагчтай зарим функцийн параметрүүд зөвхөн өөр параметр тэг байвал NULL байж болохыг зааж өгсөн.
- Өргөтгөсөн ассемблерийн гаднах функцийг "asm(....)" оруулахыг зөвшөөрнө. Ассемблерийн оруулгад санах ойг стекийн улаан бүсэд (стекийн дээд талд байгаа хэсэг) дарж бичихийг зөвшөөрдөг.
- Загвар хэшийг сайжруулсны ачаар C++ кодыг эмхэтгэх нь илүү хурдан болдог.
- Шинэ оновчлол нэмэгдсэн. Хэмжээ нь эмхэтгэх үед тодорхойгүй динамикаар хуваарилагдсан массив эсвэл буферийг удирддаг байсан ч эрт гарах код агуулсан гогцоог векторжуулахад дэмжлэг үзүүлсэн (жишээ нь завсарлага эсвэл буцах дуудлагаар). -O2 сонголтыг зааж өгөх үед аялалын тооллын мэдээлэл байхгүй зарим хялбар векторчлох гогцоог векторчлох боломжтой.
- Холбох үе шатанд (LTO, Link-Time Optimization) нэмэлт оновчлолын горимыг нэмсэн бөгөөд энэ нь кодонд бага зэрэг өөрчлөлт оруулсан (нэг функцийг засварласан) тохиолдолд LTO ашиглах үед дахин эмхэтгэх хугацааг эрс багасгадаг. Өсөн нэмэгдэж буй горимыг идэвхжүүлэхийн тулд "-flto-incremental" сонголтыг санал болгож байна.
- Маш том оролтын файлуудын эмхэтгэлийг сайжруулсан. 4096-аас дээш баганын дугаарыг хянах ажлыг хэрэгжүүлсэн. Маш том файл дахь алдаа, анхааруулгын байршлыг зааж өгөх нарийвчлал сайжирсан.
- Асуудлыг оношлох үед тайлангийн харагдах байдал сайжирсан. Тухайлбал, асуудлын байршлыг “⚠️” тэмдгээр тодруулсан, C++ загваруудын алдааны гаралтын схемийг өөрчилсөн, C23 стандарт руу шилжих шилжилтийг хялбарчлах зөвлөмжийг нэмж, өнгөний схемийг шинэчилсэн. Оношлогоог Sarif форматаар гаргах боломжийг нэмсэн (-fdiagnostics-format=sarif-файл).
- libgdiagnostics номын сан хэрэгжсэн бөгөөд энэ нь танд оношлогооны мессежийн дизайнтай холбоотой GCC чадавхийг өөрийн төслүүдэд нэгтгэх боломжийг олгодог (жишээлбэл, та иш татах, тодруулах, засах зөвлөмжийг ашиглаж болно).
- "-Wtrailing-whitespace" болон "-Wleading-whitespace" анхааруулгыг нэмсэн бөгөөд мөрийн төгсгөлд үлдэгдэл хоосон зай, мөрийн эхэнд нэмэлт хоосон зай байгааг илрүүлэх.
- Толгой файлыг дахин оруулахаас сэргийлж, толгойн хамгаалалтын макронд гарсан асуудлуудыг мэдээлэх "-Wheader-guard" анхааруулгыг нэмсэн.
- D хэлний урд тал нь 2.111.0 хувилбар болж шинэчлэгдсэн.
- Тэмдэглэгдээгүй бүхэл тоонуудын дэмжлэгийг Фортраны нүүр хэсэгт нэмсэн.
- Уг багцад COBOL хэлний хөрвүүлэгч, gcobol багтсан бөгөөд энэ нь x86-64 болон AArch64 платформуудыг дэмждэг бөгөөд 32 битийн системд ашиглахад зориулагдаагүй болно. Хөрвүүлэгч нь ISO/IEC 1989:2023 стандартын тодорхойлолтыг хэрэгжүүлдэг бөгөөд NIST CCVS/85 тестийн ихэнхийг давсан.
- Дундын санах ой, векторжуулалтын нэгж (SIMD) бүхий олон цөмт болон эрлийз (CPU+GPU/DSP) системд зэрэгцээ програмчлалын аргуудыг хэрэглэх API болон аргуудыг тодорхойлсон OpenMP 5.0, 5.1, 5.2, 6.0 (Нээлттэй олон боловсруулалт) стандартуудыг хэрэгжүүлэх ажил үргэлжилж байна. Метадиректив болон хавтанцар, буулгах, харилцан ажиллах, илгээх байгууламжуудад зориулсан дэмжлэг нэмэгдсэн. Зарим AMD болон NVIDIA GPU-ийн хувьд нэгдсэн санах ойн дэмжлэгийг нэмсэн ("шаардлагатай" зааварт нэгдсэн_хуваалцсан_санах ойг зааж өгснөөр идэвхжүүлсэн). "self_maps" илэрхийлэлд дэмжлэг нэмсэн.
- MinGW платформыг (aarch64-w64-mingw64) дэмжихийн тулд AArch32 архитектурын арын хэсгийг шинэчилсэн. 20 гаруй ARM8 өргөтгөл хэрэгжиж, ACLE (Arm C Language Extensions) өргөтгөлийн дэмжлэг сайжирсан. Код үүсгэгч дээр олон тооны сайжруулалт хийгдсэн. CPU-ийн дэмжлэгийг нэмсэн:
- Apple A12 (алим-a12)
- Apple M1 (алим-м1)
- Apple M2 (алим-м2)
- Apple M3 (алим-м3)
- Arm Cortex-A520AE (cortex-a520ae)
- Arm Cortex-A720AE (cortex-a720ae)
- Arm Cortex-A725 (cortex-a725)
- Arm Cortex-R82AE (cortex-r82ae)
- Arm Cortex-X925 (cotex-x925)
- Arm Neoverse N3 (neoverse-n3)
- Arm Neoverse V3 (neoverse-v3)
- Arm Neoverse V3AE (neoverse-v3ae)
- FUJITSU-MONAKA (fujitsu-monaka)
- NVIDIA Грейс
- NVIDIA Olympus (olympus)
- Qualcomm Oryon-1 (Орён-1)
- AMD Radeon GPU (GCN) код үүсгэх арын хэсгийг libstdc++ номын санг дэмжих зорилгоор шинэчилсэн бөгөөд gfx9-generic, gfx10-3-generic болон gfx11-generic төхөөрөмжүүдийн цувралд туршилтын код үүсгэх дэмжлэг нэмэгдсэн.
- X86 backend нь одоо Intel-ийн зааврын багц архитектурын AVX10.2, AMX-AVX512, AMX-FP8, AMX-MOVRS, AMX-TF32, AMX-TRANSPOSE, MOVRS өргөтгөлүүдийг дэмждэг. Intel Diamond Rapids болон Xeon Phi CPU-ийн дэмжлэгийг нэмсэн.
- LoongArch болон AVR платформуудад зориулсан өргөтгөсөн backend боломжууд.
- Nios II процессоруудад ашигладаг nios2 зорилтот архитектурын дэмжлэгийг хассан. AArch32 порт дахь ILP32 ABI (-mabi=ilp64)-ийн дэмжлэгийг хуучирсан бөгөөд дараагийн томоохон хувилбарт устгах болно.
Эх сурвалж: opennet.ru
