Објавување на пакетот компајлер GCC 9

По една година развој објавено ослободување на бесплатен сет на компајлери GCC 9.1, првото големо издание во новата гранка на GCC 9.x. Во согласност со нова шема броеви на изданија, верзијата 9.0 се користеше во процесот на развој, а непосредно пред објавувањето на GCC 9.1, филијалата на GCC 10.0 веќе се разграни, врз основа на која ќе се формира следното значајно издание, GCC 10.1.

GCC 9.1 е забележлив за стабилизирање на поддршката за стандардот C++17, продолжувајќи со имплементација на можностите на идниот стандард C++20 (кодениран C++2a), вклучување во предниот дел за јазикот D, делумна поддршка за OpenMP 5.0 , речиси целосна поддршка за OpenACC 2.5, зголемување на приспособливоста на интерпроцедуралните оптимизации и оптимизации во фазата на врзување, проширување на дијагностички алатки и додавање на нови предупредувања, задни за OpenRISC, C-SKY V2 и AMD GCN GPU.

Главните промени:

  • Додадена е поддршка за програмскиот јазик D. GCC вклучува преден дел со компајлер GDC (Gnu D Compiler) и библиотеки за извршување (libphobos), кои ви дозволуваат да користите стандарден GCC за да изградите програми во програмскиот јазик D. Процесот на овозможување поддршка на јазикот D во GCC започна уште во 2011 година, но се влечеше поради потребата да се усогласи кодот со барањата на GCC и проблеми со преносот на правата на интелектуална сопственост на Digital Mars, кој го развива програмскиот јазик D;
  • Направени се подобрувања на генератор на код. На пример, имплементирана е употребата на различни стратегии за проширување на Switch изразите (табела за скокање, бит тест, стебло на одлуки) во зависност од ситуациите. Додадена е способност за трансформирање на линеарни функции кои вклучуваат израз на Switch користејќи ја оптимизацијата „-ftree-switch-conversion“ (на пример, збир на услови како „случај 2: како = 205; пауза; случај 3: како = 305; прекин ;“ ќе се конвертира во „100 * како + 5“;
  • Подобрени интерпроцедурални оптимизации. Вградените поставки за распоредување се адаптирани за модерни бази на кодови во C++ и проширени со нови параметри max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns и uninlined -време-време. Подобрена точност и агресивност на раздвојувањето на ладно/топло кодови. Подобрена приспособливост за многу големи преведувачки единици (на пример, при примена на оптимизација во фазата на поврзување со големи програми);
  • Механизмот за оптимизација базиран на резултатите од профилирањето на кодот (PGO - Profile-guided optimization) е подобрен, што генерира пооптимален код врз основа на анализа на карактеристиките на извршувањето на кодот. Резиме опција "-fprofile-употреба" сега ги вклучува режимите за оптимизација "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" и "-ftree-loop-distribution". Отстрането вклучување на хистограми со бројачи во датотеките, што ја намали големината на датотеките со профили (хистограмите сега се генерираат во лет кога се вршат оптимизации за време на поврзувањето);
  • Подобрени оптимизации за време на поврзување (LTO). Беше обезбедено поедноставување на типовите пред да се генерира резултатот, што овозможи значително да се намали големината на датотеките со објекти LTO, да се намали потрошувачката на меморија во фазата на врзување и да се подобри паралелизацијата на операциите. Бројот на партиции (-param lto-partitions) е зголемен од 32 на 128, што ги подобрува перформансите на системите со голем број нишки на процесорот. Додаден е параметар за контрола на бројот на процеси на оптимизатор
    „-param lto-max-стриминг-паралелизам“;

    Како резултат на тоа, во споредба со GCC 8.3, оптимизациите воведени во GCC 9 дозволено намалете го времето на компилација на Firefox 5 и LibreOffice 66 за околу 6.2.3%. Големината на објектните датотеки се намали за 7%. Времето на врзување на 8-јадрен процесор се намали за 11%. Фазата на секвенцијална оптимизација на фазата на поврзување сега е 28% побрза и троши 20% помалку меморија. Потрошувачката на меморија на секој процесор од паралелизираната фаза на LTO се намали за 30%;

  • Повеќето од спецификацијата за паралелно програмирање се имплементирани за C, C++ и Fortran јазиците OpenACC 2.5, кој ги дефинира алатките за истоварување операции на графички процесори и специјализирани процесори како што е NVIDIA PTX;
  • Делумна поддршка за стандардот е имплементирана за C и C++ Отворете MP 5.0 (Open Multi-Processing), кој ги дефинира API и методите за примена на паралелни методи на програмирање за C, C++ и Fortran јазици на повеќејадрени и хибридни (CPU+GPU/DSP) системи со заедничка меморија и единици за векторизација (SIMD) ;
  • Додадени се нови предупредувања за јазикот C:-Вада-на-спакуван-член" (непорамнета вредност на покажувачот на спакуван член на структура или унија) и
    «-Вапсолутната вредност" (при пристап до функции за пресметување на апсолутна вредност, ако има посоодветна функција за наведениот аргумент, на пример, треба да се користи fabs(3.14) наместо abs(3.14). Додадени се нови предупредувања за C++: „-Wdeprecated-copy“,
    „-Winit-list-lifetime“, „-Wredundant-move“, „-Wpessimizing-move“ и „-Wclass-conversion“. Многу претходно достапни предупредувања се проширени;

  • Додадена е експериментална поддршка за дел од идниот јазичен стандард C, со кодно име C2x. За да ја овозможите поддршката за C2x, користете ги опциите „-std=c2x“ и „-std=gnu2x“ (за да овозможите екстензии на GNU). Стандардот е сè уште во рана фаза на развој, затоа, за неговите можности, е поддржан само изразот _Static_assert со еден аргумент (_Static_assert со два аргументи е стандардизиран во C11);
  • Поддршката за стандардот C++17 е прогласена за стабилна. Во предниот дел, јазичните можности на C++17 се целосно имплементирани, а во libstdc++, функциите на библиотеката дефинирани во стандардот се блиску до целосна имплементација;
  • Продолжува имплементација елементи на идниот стандард C++2a. На пример, додадена е можноста за вклучување опсези за време на иницијализацијата, имплементирани се екстензии за ламбда изрази, додадена е поддршка за празни членови на структури на податоци и веројатни/неверојатни атрибути, обезбедена е можност за повикување виртуелни функции во условни изрази , итн.
    За да овозможите поддршка за C++2a, користете ги опциите „-std=c++2a“ и „-std=gnu++2a“. Додадени се датотеки за заглавие на битови и верзија на libstdc++ за C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible и std::type_identity карактеристики, std::midpoint функција, std::midpoint, , std::bind_front,
    std::visit, std::is_constant_evaluated и std::assume_aligned, додадена поддршка за типот char8_t, имплементирана е способноста за проверка на префиксот и наставката на стринговите (starts_with, ends_with);

  • Додадена е поддршка за нови ARM процесори
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE и Neoverse N1. Додадена е поддршка за инструкции воведени во Armv8.3-A за работа со сложени броеви, генерирање псевдо-случајни броеви (rng) и мемориско обележување (memtag), како и инструкции за блокирање напади поврзани со шпекулативно извршување и работа на единицата за предвидување гранки . За архитектурата AArch64, додаден е режим на заштита раскрсници на оџакот и купот („-fstack-clash-protection“). За користење на карактеристиките на архитектурата Armv8.5-A, додадена е опцијата „-march=armv8.5-a“

  • Вклучува заднина за генерирање код за AMD графички процесори базирани на микроархитектурата на GCN. Имплементацијата во моментов е ограничена на компилација на апликации со една нишка (подоцна ќе се нуди поддршка за извршување пресметки со повеќе нишки преку OpenMP и OpenACC) и поддршка за GPU Fiji и Vega 10;
  • Додаден е нов заднина за процесори OpenRISC;
  • Додаден заднина за процесори C-SKY V2, произведен од истоимената кинеска компанија за различни потрошувачки уреди;
  • Сите опции на командната линија кои работат со вредности на бајти ги поддржуваат суфиксите kb, KiB, MB, MiB, GB и GiB;
  • Имплементиран опцијата „-flive-patching=[inline-only-static|inline-clone]“ ви овозможува да постигнете безбедна компилација за системи за поправање во живо поради контрола на повеќе нивоа врз употребата на интерпроцедурални (ИПА) оптимизации;
  • Додадена е опцијата „--завршување“ за ситно-грануларна контрола на комплетирањето на опцијата при користење баш;
  • Дијагностичките алатки обезбедуваат приказ на извадоци од изворниот текст што го означуваат бројот на линијата и визуелно означуваат поврзани информации, како што се типовите на операнди. За да се оневозможи прикажувањето на броеви и ознаки на линии, се обезбедени опциите „-fno-diagnostics-show-line-numbers“ и „-fno-diagnostics-show-labels“;

    Објавување на пакетот компајлер GCC 9

  • Проширен алатки за дијагностицирање на грешки во кодот C++, подобрена читливост на информациите за причините за грешките и истакнување на проблематичните параметри;

    Објавување на пакетот компајлер GCC 9

  • Додадена е опција „-fdiagnostics-format=json“, која овозможува генерирање на дијагностички излез во машински читлив формат (JSON);
  • Додадени се нови опции за профилирање „-fprofile-filter-files“ и „-fprofile-exclude-files“ за да се изберат изворните датотеки што ќе се обработуваат;
  • AddressSanitizer обезбедува генерирање на покомпактен код за потврда за автоматските променливи, што ја намалува потрошувачката на меморија на извршната датотека што се проверува;
  • Подобрен излез во "-fopt-информации» (детални информации за додадените оптимизации). Додадени се нови префикси „оптимизирани“ и „пропуштени“, покрај претходно достапниот префикс „белешка“. Додаден излез на информации за одлучување за внатрешно расплетување и векторизација на циклусите;
  • Додадена е опцијата „-fsave-optimization-record“, кога е наведено, GCC ја зачувува датотеката SRCFILE.opt-record.json.gz со опис на одлуките за употреба на одредени оптимизации. Новата опција се разликува од режимот „-fopt-info“ со тоа што вклучува дополнителни метаподатоци, како што се информации за профилот и вградените синџири;
  • Додадени се опциите „-fipa-stack-alignment“ и „-fipa-reference-addressable“ за контрола на порамнувањето на стек и употребата на режими за адресирање (само за пишување или за читање-точно) за статични променливи за време на интерпроцедурални оптимизации;
  • Новите вградени функции се воведени за да се контролира врзувањето на атрибутите, како и однесувањето поврзано со предвидување на гранките и шпекулативно извршување на инструкциите: "__изграден_има атрибут«,«__изградено_очекување_со_веројатност"И"__вградена_шпекулација_безбедна_вредност“. Додаден е нов атрибут за функции, променливи и типови копирате;
  • Целосна поддршка за асинхрони влез/излез е имплементирана за јазикот Фортран;
  • Поддршката за платформите Solaris 10 (*-*-solaris2.10) и Cell/BE (Cell Broadband Engine SPU) е застарена и ќе биде отстранета во следното големо издание. Поддршката за архитектурите Armv2, Armv3, Armv5 и Armv5E е прекината. Поддршката за Intel MPX (Екстензии за заштита на меморија) е прекината.

Извор: opennet.ru

Додадете коментар