После годину дана развоја, пуштен је бесплатан ГЦЦ компајлерски пакет ГЦЦ 15.1, прво велико издање у новој грани ГЦЦ 15.к. Према шеми нумерисања издања, верзија 15.0 је коришћена током развоја, а непосредно пре издавања ГЦЦ 15.1, грана ГЦЦ 16.0 је већ била рачваљена, која ће чинити основу следећег великог издања, ГЦЦ 16.1.
Главне промене:
- Приликом компајлирања Ц програма, стандардно се користи Ц23 стандард (Резиме промене) са ГНУ екстензијама ("-стд=гну23"). Раније је стандард Ц17 коришћен подразумевано (-стд=гну17). Промена би потенцијално могла да изазове проблеме при изградњи постојећих пројеката због укључивања константе нуллптр, типа _БитИнт(н) и кључних речи боол, труе и фалсе, које би могле да буду у сукобу са идентификаторима сличног имена дефинисаним у апликацијама.
- Имплементиране су следеће могућности стандарда Ц23:
- Директива "#ембед" је дизајнирана за уграђивање бинарних ресурса у код.
- Атрибут „унсекуенцед” који указује да резултат не зависи од редоследа извршења.
- Атрибут "репродуцибилан" указује на то да функција увек враћа исти резултат са истим улазним подацима, тј. не зависи од других фактора.
- Имплементирани су елементи будућег Ц2И стандарда (-стд=ц2и и -стд=гну2и):
- Способност декларисања променљивих у изјави „иф“, као што је „иф (инт к = гет ()) {...}“.
- Подршка за именовање петљи да се на њих позива у коду. спољашњи: фор (инт и = 0; и < ИК; ++ и) { свитцх (и) { цасе 1: бреак; // скаче на ЦОНТ1 случај 2: бреак оутер; // скаче на ЦОНТ2 } // ЦОНТ1 } // ЦОНТ2
- Подршка за одређивање опсега целобројних вредности у изразима случаја, као што је "случај 1...10:".
- Суфикси "и" и "ј" за означавање имагинарног дела у комплексним бројевима.
- Могућност коришћења оператора "++" и "—" са комплексним бројевима.
- „_Генериц(типе, екпр1, екпр2, …)“ конструкција за избор израза на основу типа операнда.
- Подршка за приступ низовима бајтова попут других типова објеката, као што су структуре и уније.
- Подршка за примену оператора „алигноф“ на непотпуне низове (оне декларисане без навођења величине, као што је „инт а[]“).
- Додата нова синтакса за окталне, хексадецималне и универзалне излазне секвенце знакова. Уместо „\у”, „\к” и „\ннн” предлажу се низови „\у{}”, „\о{}” и „\к{}” у којима се може навести било који број цифара.
- Уграђене функције "__буилтин_стдц_ротате_лефт" и "__буилтин_стдц_ротате_ригхт".
- Дозвољене су операције нулте дужине над НУЛЛ показивачима (нпр. „сизеоф(*п)“).
- Фронтенд за језик Ц++ имплементира карактеристике које се развијају за будући Ц++26 стандард:
- Оператор варијације "пријатељ" ("пријатељ Тс...").
- Могућност коришћења кључне речи цонстекпр са варијацијом новог оператора (плацемент нев) за постављање објекта у унапред додељену меморију у време компајлирања.
- Излаз грешке приликом брисања показивача на некомплетан тип.
- Синтакса за дефинисање променљивих параметара са три тачке без претходног зареза (на пример, када се наводи „воид е(инт…)“ уместо „воид е(инт, …)“) је застарела.
- Индексирање пакета параметара у шаблонима.
- Атрибути за структурирана повезивања;
- Синтакса '= делете("реасон")';
- Укључивање „@“, „$“ и „`“ у основни скуп знакова.
- Употреба макроа за декларисање модула је забрањена.
- Способност коришћења структурираног везивања као услова у иф и свитцх изјавама.
- Подршка за директно поређење низа (нпр. "инт арр1[5]; инт арр2[5]; боол исто = арр1 == арр2") је укинута.
- Механизам „#ембед“ за уграђивање бинарних ресурса.
- Класа шаблона ис_тривиал је застарела.
- Додате функције Ц++23:
- Забраните неке употребе директиве „извоз“ и дозволите употребу „извоза {}“.
- Подршка за продужење животног века привремених објеката у фор петљама које се понављају преко опсега.
- Библиотека либстдц++ имплементира експерименталну подршку за стд и стд.цомпат модуле.
- Коришћење иницијализатора „{0}“ за уније у Ц и Ц++ коду више не гарантује да ће сав садржај бити обрисан, већ уместо тога доводи до поништавања првог елемента уније. Да бисте обрисали целу унију, користите израз „{}“ дефинисан у Ц23 спецификацији или наведите опцију „-фзеро-инит-паддинг-битс=унионс“ да бисте вратили старо понашање.
- Имплементирана подршка за атрибут "мусттаил" ([[гну::мусттаил]] и [[цланг::мусттаил]]) за гарантоване позиве у реп. Атрибут се примењује на повратне наредбе које упућују рекурзивни позив тренутној функцији и обезбеђује да ће такав позив користити репну рекурзију, која не додељује додатну меморију на стеку (елиминише ризик да остане без меморије са веома великим бројем позива).
- Имплементирана подршка за атрибут флаг_енум ([[гну::флаг_енум]] и [[цланг::флаг_енум]]) примењен на набрајања да би се указало да се садржај користи у битским операцијама (спречава упозорења у -Всвитцх режиму).
- Додата подршка за атрибут „цоунтед_би“, који се може користити за одређивање поља у структури са флексибилним низом који одређује број елемената. Атрибут се може користити за побољшање ефикасности провера прекорачења бафера.
- Функцијама је додат атрибут „ноннулл_иф_нонзеро“, који наводи да неки параметри функције са показивачима могу бити НУЛЛ само ако је други параметар нула.
- Дозвољен је проширени асемблер који убацује "асм(….)" ван функције. У асемблерским уметцима, дозвољено је преписивање меморије у црвеној зони стека (област на врху стека).
- Компилација Ц++ кода је бржа захваљујући побољшаном хеширању шаблона.
- Додате нове оптимизације. Имплементирана је подршка за векторизацију петљи које садрже код за рани излазак (на пример, преко прекида или повратног позива), чак и ако такве петље манипулишу динамички додељеним низовима или баферима чија величина је непозната у време компајлирања. Када је наведена опција -О2, омогућена је векторизација неких петљи које се лако векторизују за које информације о броју путовања нису доступне.
- Додат је инкрементални режим оптимизације у фази повезивања (ЛТО, Линк-Тиме Оптимизатион), који значајно смањује време рекомпилације када се користи ЛТО у ситуацијама када су унете мање измене у код (једна функција је уређена). Да бисте омогућили инкрементални режим, предлаже се опција "-флто-инцрементал".
- Побољшана компилација веома великих улазних датотека. Имплементирано праћење бројева колона већи од 4096. Побољшана прецизност указивање на локацију грешака и упозорења у веома великим датотекама.
- Побољшана видљивост извештаја приликом дијагностиковања проблема. На пример, локација проблема је истакнута симболом „⚠“, промењен је изглед излаза за грешке у Ц++ шаблонима, додати су савети за поједностављење преласка на стандард Ц23, а шема боја је редизајнирана. Додата могућност излаза дијагностике у Сариф формату (-фдиагностицс-формат=сариф-филе).
- Библиотека либгдиагностицс је имплементирана, омогућавајући вам да интегришете ГЦЦ могућности које се односе на дизајн дијагностичких порука у ваше пројекте (на пример, можете да користите савете за цитирање, истицање и исправљање).
- Додата упозорења "-Втраилинг-вхитеспаце" и "-Влеадинг-вхитеспаце" за откривање заосталог размака на крају редова и додатног размака на почетку редова.
- Додато упозорење „-Вхеадер-гуард“ за пријаву проблема у макроима за заштиту заглавља који спречавају да се датотека заглавља поново укључи.
- Фронтенд за језик Д је ажуриран на верзију 2.111.0.
- Подршка за неозначене целе бројеве је додата на Фортран фронтенд.
- Пакет укључује компајлер за језик ЦОБОЛ, гцобол, који подржава к86-64 и ААрцх64 платформе и није дизајниран за употребу на 32-битним системима. Компајлер имплементира ИСО/ИЕЦ 1989:2023 спецификацију и пролази већину НИСТ ЦЦВС/85 тестова.
- Настављена је имплементација ОпенМП 5.0, 5.1, 5.2 и 6.0 (Опен Мулти-Процессинг) стандарда, који дефинишу АПИ и методе за примену метода паралелног програмирања на вишејезгарним и хибридним (ЦПУ+ГПУ/ДСП) системима са дељеном меморијом и јединицама за векторизацију (СИМД). Додата подршка за метадирективе и конструкције плочица, одмотавање, интероп и отпремање. За неке АМД и НВИДИА ГПУ-ове, додата је подршка за обједињену заједничку меморију (омогућена навођењем унифиед_схаред_мемори у директиви „рекуирес“). Додата подршка за израз "селф_мапс".
- Позадина за ААрцх64 архитектуру је ажурирана да подржава МинГВ платформу (аарцх64-в64-мингв32). Имплементирано је више од 20 АРМ8 екстензија и побољшана је подршка за проширење АЦЛЕ (Арм Ц Лангуаге Ектенсионс). Бројна побољшања су направљена на генератору кода. Додата подршка за процесор:
- Аппле А12 (аппле-а12)
- Аппле М1 (јабука-м1)
- Аппле М2 (јабука-м2)
- Аппле М3 (јабука-м3)
- Арм Цортек-А520АЕ (цортек-а520ае)
- Арм Цортек-А720АЕ (цортек-а720ае)
- Арм Цортек-А725 (цортек-а725)
- Арм Цортек-Р82АЕ (цортек-р82ае)
- Арм Цортек-Кс925 (цортек-к925)
- Арм Неоверсе Н3 (неоверсе-н3)
- Арм Неоверсе В3 (неоверсе-в3)
- Арм Неоверсе В3АЕ (неоверсе-в3ае)
- ФУЈИТСУ-МОНАКА (фујитсу-монака)
- НВИДИА Граце
- НВИДИА Олимп (олимп)
- Куалцомм Орион-1 (Орион-1)
- Позадински део за генерисање кода АМД Радеон ГПУ (ГЦН) је ажуриран да подржава библиотеку либстдц++ и додата је подршка за експериментално генерисање кода за гфк9-генеричке, гфк10-3-генеричке и гфк11-генеричке серије уређаја.
- Позадина к86 сада подржава проширења архитектуре Интел скупа инструкција АВКС10.2, АМКС-АВКС512, АМКС-ФП8, АМКС-МОВРС, АМКС-ТФ32, АМКС-ТРАНСПОСЕ, МОВРС. Додата подршка за Интел Диамонд Рапидс и Ксеон Пхи ЦПУ.
- Проширене позадинске могућности за ЛоонгАрцх и АВР платформе.
- Уклоњена подршка за ниос2 циљну архитектуру која се користи у Ниос ИИ процесорима. Подршка за ИЛП32 АБИ (-маби=илп32) на ААрцх64 порту је застарела и биће уклоњена у следећем великом издању.
Извор: опеннет.ру
