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 үчүн backends.

негизги өзгөрүүлөр:

  • D программалоо тили үчүн колдоо кошулду. GCC компилятору менен фронтонду камтыйт GDC (Gnu D Compiler) жана иштөө убактысынын китепканалары (libphobos), алар D программалоо тилинде программаларды куруу үчүн стандарттык GCCди колдонууга мүмкүндүк берет. GCCде D тилин колдоону иштетүү процесси башталды кайра 2011-жылы, бирок сүйрөп кетти кодду GCC талаптарына ылайык келтирүү зарылдыгынан жана D программалоо тилин иштеп чыгуучу Digital Mars компаниясына интеллектуалдык менчик укуктарын өткөрүп берүү көйгөйлөрүнөн улам;
  • Код генераторуна жакшыртуулар киргизилди. Мисалы, кырдаалга жараша Switch туюнтмаларын кеңейтүү үчүн ар кандай стратегияларды колдонуу (секирүү таблицасы, бит тести, чечим дарагы) ишке ашырылган. “-ftree-switch-conversion” оптималдаштыруунун жардамы менен Switch туюнтмасын камтыган сызыктуу функцияларды трансформациялоо мүмкүнчүлүгү кошулду (мисалы, “2-жагдай: кантип = 205; үзүү; 3-жагдай: кантип = 305; үзүү” сыяктуу шарттардын жыйындысы ;” "100 * кантип + 5ке" которулат;
  • Жакшыртылган процедуралар аралык оптималдаштыруу. Inline жайгаштыруу орнотуулары заманбап C++ код базаларына ыңгайлаштырылган жана max-inline-insns-small, max-inline-insns-size, unlined-function-insns, unlined-function-time, unlined-thunk-insns жана unlined жаңы параметрлери менен кеңейтилген. - рахмат. Муздак/ысык кодду бөлүүнүн жакшыртылган тактыгы жана агрессивдүүлүгү. Абдан чоң масштабда жакшыртылган котормо бирдиктери (мисалы, оптималдаштырууну чоң программалар менен байланыштырууда);
  • Кодду профилдөөнүн натыйжаларына негизделген оптималдаштыруу механизми (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ге чейин көбөйтүлдү, бул көп сандагы CPU жиптери бар системалардын иштөөсүн жакшыртат. Оптимизатор процесстеринин санын көзөмөлдөө үчүн параметр кошулду
    "-param lto-max-streaming-parallelism";

    Натыйжада, GCC 8.3 менен салыштырганда, GCC 9 киргизилген оптималдаштыруу уруксат Firefox 5 жана LibreOffice 66 компиляция убактысын болжол менен 6.2.3% кыскартуу. Объект файлдарынын көлөмү 7% га кыскарган. 8 өзөктүү CPU менен байланышуу убактысы 11% га кыскарды. Шилтеме стадиясынын ырааттуу оптималдаштыруу баскычы азыр 28% тезирээк жана 20% аз эстутумду керектейт. LTOнун параллелдүү стадиясынын ар бир процессорунун эстутум керектөөсү 30% га төмөндөдү;

  • Параллелдүү программалоо спецификациясынын көбү C, C++ жана Fortran тилдеринде ишке ашырылат OpenACC 2.5, ал GPUларда жана NVIDIA PTX сыяктуу адистештирилген процессорлордо түшүрүү операциялары үчүн куралдарды аныктайт;
  • Стандартты жарым-жартылай колдоо C жана C++ үчүн ишке ашырылган Open MP 5.0 (Open Multi-Processing), бул API жана C, C++ жана Fortran тилдери үчүн параллелдүү программалоо ыкмаларын колдонуунун ыкмаларын аныктайт, көп ядролуу жана гибриддик (CPU+GPU/DSP) жалпы эс тутум жана векторизация бирдиктери (SIMD) ;
  • Си тили үчүн жаңы эскертүүлөр кошулду: "-Топ-топтолгон мүчө" (түзүмдүн же биримдиктин жыйылган мүчөсүнө теңелбеген көрсөткүч мааниси) жана
    «- Абсолюттук маани" (абсолюттук маанини эсептөө үчүн функцияларга кирүүдө, эгерде көрсөтүлгөн аргумент үчүн ылайыктуу функция болсо, мисалы, abs(3.14) ордуна fabs(3.14) колдонулушу керек). C++ үчүн жаңы эскертүүлөр кошулду: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-motion" жана "-Wclass-conversion". Көптөгөн мурда жеткиликтүү эскертүүлөр кеңейтилген;

  • C2x коддук аталышы менен келечектеги Си тилинин стандартынын бир бөлүгү үчүн эксперименталдык колдоо кошулду. C2x колдоосун иштетүү үчүн "-std=c2x" жана "-std=gnu2x" опцияларын колдонуңуз (GNU кеңейтүүлөрүн иштетүү үчүн). Стандарт дагы эле иштеп чыгуунун алгачкы этабында, ошондуктан, анын мүмкүнчүлүктөрү боюнча, бир аргумент менен _Static_assert туюнтмасы гана колдоого алынат (С11де эки аргумент менен _Static_assert стандартташтырылган);
  • C++ 17 стандартын колдоо туруктуу деп жарыяланды. Frontendде C++17 тилдик мүмкүнчүлүктөрү толугу менен ишке ашырылган, ал эми libstdc++те стандартта аныкталган китепкана функциялары толук ишке ашырылууга жакын;
  • уланды ишке ашыруу келечектеги C++2a стандартынын элементтери. Мисалы, инициализациялоо учурунда диапазондорду кошуу мүмкүнчүлүгү кошулду, lambda туюнтмалары үчүн кеңейтүүлөр ишке ашырылды, маалымат структураларынын бош мүчөлөрү үчүн колдоо жана мүмкүн/күмөндүү атрибуттар кошулду, виртуалдык функцияларды шарттуу туюнтмаларда чакыруу мүмкүнчүлүгү берилди , жана башкалар.
    C++2a колдоосун иштетүү үчүн "-std=c++2a" жана "-std=gnu++2a" опцияларын колдонуңуз. C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible жана std::type_identity сапаттары, std::type_nothrow:d, std::remove_cvref, std::remove_cvref, libstdc++ үчүн бит жана версия баш файлдары кошулду , std::bind_front,
    std::visit, std::is_constant_evaluated жана std::assume_aligned, char8_t түрүнө колдоо кошулду, саптардын префиксин жана суффикстерин текшерүү мүмкүнчүлүгүн ишке ашырды (старт_with, ends_with);

  • Жаңы ARM процессорлорун колдоо кошулду
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE жана Neoverse N1. Армв8.3-Ада комплекстүү сандар менен иштөө, псевдококустук сандарды генерациялоо (rng) жана эстутумду белгилөө (memtag), ошондой эле спекуляциялык аткарууга жана тармактык болжолдоо бирдигинин иштешине байланыштуу чабуулдарды бөгөттөө боюнча инструкцияларга кошумча колдоо көрсөтүлдү. . AArch64 архитектурасы үчүн коргоо режими кошулду стек менен үймөктүн кесилиши (“-fstack-кагылышуудан коргоо”). Armv8.5-A архитектурасынын өзгөчөлүктөрүн колдонуу үчүн “-march=armv8.5-a” опциясы кошулду.

  • Ал GCN микроархитектурасынын негизинде AMD GPU'лары үчүн кодду түзүү үчүн серверди камтыйт. Учурда ишке ашыруу бир жиптүү тиркемелерди түзүү (OpenMP жана OpenACC аркылуу көп жиптүү эсептөөлөрдү жүргүзүү үчүн колдоо кийинчерээк сунушталат) жана GPU Fiji жана Vega 10 колдоо менен чектелген;
  • Процессорлор үчүн жаңы сервер кошулду OpenRISC;
  • Процессорлор үчүн кошумча сервер C-SKY V2, ар кандай керектөөчү аппараттар үчүн ушундай эле аталыштагы кытай компаниясы тарабынан чыгарылган;
  • Байт маанилерин иштеткен бардык буйрук сабынын параметрлери kb, KiB, MB, MiB, GB жана GiB суффикстерин колдойт;
  • Аткарылган “-five-patching=[inline-only-static|inline-clone]” опциясы процедуралар аралык (IPA) оптималдаштыруу;
  • Bash колдонууда варианттын аяктоосун так көзөмөлдөө үчүн "--completion" опциясы кошулду;
  • Диагностикалык куралдар саптын номерин көрсөтүүчү жана операнд түрлөрү сыяктуу тиешелүү маалыматты визуалдык белгилөө менен баштапкы тексттин үзүндүлөрүн көрсөтүүнү камсыз кылат. Саптардын номерлерин жана энбелгилерин көрсөтүүнү өчүрүү үчүн “-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-info» (кошумча оптималдаштыруу жөнүндө толук маалымат). Буга чейин жеткиликтүү болгон "эскертме" префиксине кошумча "оптимизацияланган" жана "сатып жиберилген" жаңы префикстер кошулду. Циклдерди саптык ачуу жана векторизациялоо боюнча чечимдерди кабыл алуу жөнүндө маалыматтын кошумча чыгарылышы;
  • "-fsave-optimization-record" опциясы кошулду, көрсөтүлгөндө, GCC SRCFILE.opt-record.json.gz файлын айрым оптималдаштырууларды колдонуу боюнча чечимдердин сыпаттамасы менен сактайт. Жаңы опция "-fopt-info" режиминен кошумча метаберилиштерди камтуу менен айырмаланат, мисалы, профиль жана саптык чынжырлар жөнүндө маалымат;
  • Процедуралар аралык оптималдаштыруу учурунда статикалык өзгөрмөлөр үчүн стекти тегиздөө жана даректөө режимдерин (жазуу үчүн гана же окуу-так) колдонууну көзөмөлдөө үчүн “-fipa-sтек-alignment” жана “-fipa-reference-addressable” опциялары кошулду;
  • Жаңы орнотулган функциялар атрибуттарды байланыштыруу, ошондой эле бутактарды болжолдоо жана спекулятивдүү нускамаларды аткаруу менен байланышкан жүрүм-турумду көзөмөлдөө үчүн киргизилген: "__курулган_атрибуту"__курулган_күтүүмүнкүтүүлүк менен"Жана"__курулган_спекуляция_коопсуз_баа". Функциялар, өзгөрмөлөр жана типтер үчүн жаңы атрибут кошулду копия;
  • Fortran тили үчүн асинхрондук киргизүү/чыгарууга толук колдоо көрсөтүлдү;
  • Solaris 10 (*-*-solaris2.10) жана Cell/BE (Cell Broadband Engine SPU) платформаларын колдоо жокко чыгарылды жана кийинки негизги чыгарылышта алынып салынат. Armv2, Armv3, Armv5 жана Armv5E архитектураларын колдоо токтотулган. Intel MPX (эстутумду коргоо кеңейтүүлөрү) үчүн колдоо токтотулду.

Source: opennet.ru

Комментарий кошуу