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 компиляторы бар фронтенді қамтиды ГДК (Gnu D Compiler) және D бағдарламалау тілінде бағдарламаларды құру үшін стандартты GCC пайдалануға мүмкіндік беретін жұмыс уақыты кітапханалары (libphobos) GCC жүйесінде D тілін қолдауды қосу процесі басталды 2011 жылы, бірақ сүйреп апарды кодты GCC талаптарына сәйкес келтіру қажеттілігіне және D бағдарламалау тілін әзірлеуші ​​Digital Mars-қа зияткерлік меншік құқықтарын беру проблемаларына байланысты;
  • Код генераторына жақсартулар жасалды. Мысалы, жағдайларға байланысты Switch өрнектерін кеңейтудің әртүрлі стратегияларын пайдалану (секіру кестесі, биттік тест, шешім ағашы) жүзеге асырылды. «-ftree-switch-conversion» оңтайландыруын пайдаланып Switch өрнегін қамтитын сызықтық функцияларды түрлендіру мүмкіндігі қосылды (мысалы, «2-жағдай: қалай = 205; үзіліс; 3-жағдай: қалай = 305; үзіліс» сияқты шарттар жинағы ;” "100 * қалай + 5" түрлендіріледі;
  • Жақсартылған процедурааралық оңтайландырулар. Кірістірілген орналастыру параметрлері заманауи 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 ядролы процессордағы байланыстыру уақыты 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) бар жүйелерде. ;
  • Си тілі үшін жаңа ескертулер қосылды: "-Қапталған мүшенің-адресі" (құрылымның немесе бірлестіктің оралған мүшесіне теңестірілмеген көрсеткіш мәні) және
    «-Абсолюттік мән" (абсолюттік мәнді есептеуге арналған функцияларға қатынасу кезінде, егер көрсетілген аргумент үшін неғұрлым қолайлы функция болса, мысалы, abs(3.14) орнына fabs(3.14) қолданылуы керек). C++ үшін жаңа ескертулер қосылды: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" және "-Wclass-conversion". Бұрын қол жетімді көптеген ескертулер кеңейтілді;

  • 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" опцияларын пайдаланыңыз. C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible және std::type_identity traits, std::type_identity, std::mids:d, функция үшін libstdc++ бит және нұсқа тақырыбы файлдары қосылды. , std::bind_front,
    std::visit, std::is_constant_evaluated және std::assume_aligned, char8_t түріне қолдау қосылды, жолдардың префиксі мен жұрнағын тексеру мүмкіндігін іске асырды (бастау_мен, аяқталады_мен);

  • Жаңа ARM процессорларына қолдау қосылды
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE және Neoverse N1. Күрделі сандармен жұмыс істеу, жалған кездейсоқ сандарды генерациялау (rng) және жадты тегтеу (memtag) үшін Armv8.3-A нұсқасына енгізілген нұсқауларға, сондай-ақ алыпсатарлық орындауға және салалық болжау блогының жұмысына байланысты шабуылдарды блоктауға арналған нұсқауларға қолдау қосылды. . 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 пайдалану кезінде опцияның аяқталуын егжей-тегжейлі бақылау үшін "--толтыру" опциясы қосылды;
  • Диагностика құралдары жол нөмірін көрсететін және операнд түрлері сияқты қатысты ақпаратты көрнекі түрде белгілейтін бастапқы мәтін үзінділерінің дисплейлерін қамтамасыз етеді. Жол нөмірлері мен белгілерді көрсетуді өшіру үшін “-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 файлын сақтайды. Жаңа опция профиль және кірістірілген тізбектер туралы ақпарат сияқты қосымша метадеректерді қосу арқылы «-fop-info» режимінен ерекшеленеді;
  • Процедуралар аралық оңтайландырулар кезінде статикалық айнымалылар үшін стектің теңестірілуін және адрестеу режимдерін (тек жазу немесе оқу-дәл) пайдалануды басқару үшін «-fipa-стек-alignment» және «-fipa-reference-addressable» опциялары қосылды;
  • Жаңа кірістірілген функциялар атрибуттарды байланыстыруды, сондай-ақ тармақты болжау мен алыпсатарлық нұсқауларды орындауға қатысты мінез-құлықты басқару үшін енгізілген: "__құрылған_атрибутқа_бар«,»__ықтималдықпен_құрылған_күту« Және »__орнатылған_спекуляция_қауіпсіз_мән«. Функциялар, айнымалылар және түрлер үшін жаңа атрибут қосылды көшірме;
  • Fortran тілі үшін асинхронды енгізу/шығару толық қолдауы жүзеге асырылды;
  • Solaris 10 (*-*-solaris2.10) және Cell/BE (Cell Broadband Engine SPU) платформаларына қолдау көрсету ескірген және келесі негізгі шығарылымда жойылады. Armv2, Armv3, Armv5 және Armv5E архитектураларына қолдау көрсету тоқтатылды. Intel MPX (жадты қорғау кеңейтімдері) қолдауы тоқтатылды.

Ақпарат көзі: opennet.ru

пікір қалдыру