GCC 10 компиляторлар жинағының шығарылымы

Бір жылдық дамудан кейін жарияланған компиляторлардың тегін жинағын шығару GCC 10.1, жаңа GCC 10.x тармағындағы бірінші негізгі шығарылым. Сәйкес жаңа схема шығарылым нөмірлері, 10.0 нұсқасы әзірлеу процесінде пайдаланылды және GCC 10.1 шығарылымынан көп ұзамай GCC 11.0 тармағы тармақталған болатын, оның негізінде келесі маңызды шығарылым GCC 11.1 құрылатын болады.

GCC 10.1 C++20 стандарты үшін әзірленген C++ тіліндегі көптеген инновацияларды енгізуімен, болашақ Си тілінің стандартына (C2x) қатысты жақсартуларды, компилятор серверлеріндегі жаңа оңтайландыруларды және эксперименталды қолдауымен ерекшеленеді. статикалық талдау режимі. Сонымен қатар, жаңа филиалды дайындау кезінде жоба репозиторийді SVN-ден Git-ке ауыстырды.

басты өзгерту:

  • Қосылды статикалық талдаудың эксперименттік режимі»-фанализатор«, ол бағдарламадағы кодты орындау жолдарын және деректер ағындарын ресурсты қажет ететін процедурааралық талдауды жүзеге асырады. Режим компиляция сатысындағы мәселелерді анықтай алады, мысалы, бір жад аймағы үшін free() функциясына қосарланған шақырулар, файл дескрипторының ағып кетуі, сілтемені алып тастау және нөлдік көрсеткіштерді беру, бос жад блоктарына қол жеткізу, инициализацияланбаған мәндерді пайдалану және т.б. OpenSSL коды үшін жаңа режимді пайдалану анықтауға мүмкіндік берді қауіпті осалдық.
  • Жақсартылған процедурааралық оңтайландырулар. IPA-SRA (процедуралық скалярлық ортақ ауыстыру) рұқсаты байланыстыру уақытында жұмыс істеу үшін қайта жасақталды және басқа нәрселермен қатар енді есептелген және қайтарылған пайдаланылмаған мәндерді жояды. "-O2" оңтайландыру режимінде "-finline-функциялары" опциясы қосылады, ол орындау өнімділігіне қарағанда ықшам кодты қолдану үшін қайта реттеледі. Кірістірілген функцияны орналастыруға арналған эвристикалық жұмыс жеделдетілді. Кірістірілген кеңейту және функцияны клондау эвристикасы енді жеке түрлендірулердің тиімділігін болжау үшін мән ауқымдары туралы ақпаратты пайдалана алады. C++ үшін типке негізделген бүркеншік ат талдауының дәлдігі жақсартылды.
  • Жетілдірілген байланыстыру уақытын оңтайландырулар (LTO). Жаңа орындалатын файл қосылды lto-дамп LTO байт коды бар нысан файлдары туралы ақпаратты қалпына келтіру үшін. Параллельді LTO өтулері бір уақытта орындалатын жасау тапсырмаларының санын автоматты түрде анықтайды және оларды анықтау мүмкін болмаса, параллельдеу факторы ретінде процессор өзектерінің саны туралы ақпаратты пайдаланыңыз. Zstd алгоритмі арқылы LTO байт кодын қысу мүмкіндігі қосылды.
  • Кодты профильдеу нәтижелеріне негізделген оңтайландыру механизмі (PGO - Profile-guided optimization) жетілдірілді, ол кодты орындау сипаттамаларын талдау негізінде анағұрлым оңтайлы кодты жасайды. Компиляция және ыстық/суық кодты бөлу кезінде жақсартылған профильге техникалық қызмет көрсету. опциясы арқылы-fprofile-мәндері» енді 4 профиль мәніне дейін бақылай алады, мысалы, жанама қоңыраулар және дәлірек профиль ақпаратын қамтамасыз ету.
  • C, C++ және Fortran тілдері үшін енгізілген параллельді бағдарламалау спецификациясы OpenACC 2.6, ол графикалық процессорлар мен NVIDIA PTX сияқты арнайы процессорлардағы жүкті түсіру операцияларына арналған құралдарды анықтайды. Стандартты енгізу аяқталуға жақын MP 5.0 ашыңыз (Open Multi-Processing), ол API интерфейсін және ортақ жады және векторизация бірліктері (SIMD) бар көп ядролы және гибридті (CPU+GPU/DSP) жүйелерде параллельді бағдарламалау әдістерін қолдану әдістерін анықтайды. Соңғы жеке шарттар, сканерлеу және цикл директивалары, тапсырыс және use_device_addr өрнектері сияқты мүмкіндіктер қосылды. OpenMP және OpenACC үшін төртінші буын (Фиджи) және бесінші буындағы AMD Radeon (GCN) графикалық процессорларында (VEGA 10/VEGA 20) жүк түсіру операцияларына қолдау қосылды.
  • Си тобының тілдері үшін функцияның сілтеме немесе көрсеткіш арқылы берілетін нысандарға қатынасын сипаттау және мұндай нысандарды нысандардың өлшемі туралы ақпаратты қамтитын бүтін аргументтермен байланыстыру үшін «қолжетімділік» функциясы қосылды. «Кіру» мүмкіндігімен бірге жұмыс істеу үшін «түр» атрибуты пайдаланушы функцияларынан қате қатынасты анықтау үшін жүзеге асырылады, мысалы, массив шекарасынан тыс аймаққа мәндерді жазу кезінде. Сондай-ақ ELF файлындағы таңбаларды нақты нұсқа нөмірлерімен байланыстыруға арналған "symver" атрибуты қосылған.
  • Жаңа ескертулер қосылды:
    • “-Wstring-compare” (“-Wextra” арқылы қосылған) – ұзындығына байланысты тұрақты мәнге эквивалентті strcmp және strncmp функцияларын шақыру нәтижесімен нөл салыстырылатын өрнектердің болуы туралы ескертеді. бір аргументтің мәні екінші аргументтегі массив өлшемінен үлкенірек.
    • "-Wzero-length-bounds" ("-Warray-bounds" арқылы қосылған) - нөлдік ұзындықтағы массив элементтеріне қол жеткізу туралы ескертеді, бұл басқа деректерді қайта жазуға әкелуі мүмкін.
    • «-Warray-bounds», «-Wformat-overflow», «-Wrestrict», «-Wreturn-local-addr» және «-Wstringop-overflow» ескертулері шекарадан тыс жағдайлардың санын кеңейту үшін кеңейтілді. өңделеді.
  • UCN (\uNNNN немесе \UNNNNNNNNN) емес, ағымдағы кодтауды (әдепкі бойынша UTF-8) пайдаланып идентификаторлардағы кең таңбаларды тікелей көрсету мүмкіндігі енгізілді. Мысалы:

    static const int π = 3;
    int get_naïve_pi() {
    π қайтару;
    }

  • Си тілі үшін C2X стандартында әзірленген жаңа мүмкіндіктердің бір бөлігі іске асырылды (-std=c2x және -std=gnu2x көрсету арқылы қосылған): келесідей атрибуттарды анықтау үшін «[[]]» синтаксисін қолдау пайда болды. C++ (мысалы, [[gnu ::const]], [[ескірген]], [[fallthrough]] және [[maybe_unused]]. UTF-8 таңбалары бар тұрақты мәндерді анықтауға арналған "u8" синтаксисіне қолдау қосылды.
    жаңа макростар қосылды. strftime бағдарламасына "%OB" және "%Ob" алмастырулары қосылды.

  • C тілінің әдепкі режимі кейбір платформаларда жаһандық айнымалыларға тиімдірек қол жеткізуге мүмкіндік беретін "-fno-common" болып табылады.
  • C++ үшін C++16 стандартында әзірленген 20-ға жуық өзгерістер мен инновациялар енгізілді. Қосылған кілт сөзі «constinit»
    және үлгі кеңейтімдерін қолдау жүзеге асырылды »тұжырымдамасы«. Тұжырымдамалар құрастыру уақытында үлгі параметрлері ретінде қабылдануы мүмкін аргументтер жиынын шектейтін үлгі параметрлері талаптарының жинағын анықтауға мүмкіндік береді. Ұғымдарды үлгі ішінде пайдаланылатын деректер түрлерінің сипаттары мен кіріс параметрлерінің деректер түрі сипаттары арасындағы логикалық сәйкессіздіктерді болдырмау үшін пайдалануға болады.

  • G++ constexpr арқылы тұрақты нысандарды өзгертуден туындаған анықталмаған әрекетті анықтауды қамтамасыз етеді. constexpr есептеу кезінде компилятор жадты тұтынуды азайтты. "-Wmismatched-tegs" және "-Wredundant-tegs" жаңа ескертулері қосылды.
  • Жаңа пәрмен жолы опциялары ұсынылды:
    • «жаңа» және «жою» операторларының қажетсіз жұптарын жою үшін «-fallocation-dce».
    • Жаттығу іске қосылмаған код үшін өлшемді оңтайландыруды өшіру үшін "-fprofile-partial-training".
    • "-fprofile-reproducible профильдің қайталану деңгейін бақылау үшін.
    • "-fprofile-prefix-path" бөлек профильді құру үшін пайдаланылатын негізгі бастапқы құрастыру каталогын анықтау үшін («-fprofile-generate=profile_dir» және «-fprofile-use=profile_dir» үшін).
  • Аталған опциялар үшін ескерту мәтінінде осы опциялардың құжаттамасына өтуге мүмкіндік беретін гиперсілтемелер берілген. URL мекенжайын ауыстыру "-fdiagnostics-urls" опциясы арқылы бақыланады.
  • Қосылған препроцессор операторы »__салынған", ол кірістірілген функцияларды тексеру үшін пайдаланылуы мүмкін.
  • ISO/IEC TS 18661 спецификациясында анықталған дөңгелектеу функциясын жүзеге асыратын жаңа "__builtin_roundeven" функциясы қосылды, "дөңгелекке" ұқсас, бірақ дөңгелектеу бөлігі 0.5-тен жоғары (үлкенірек мәнге), 0.5-тен аз. - төмен (нөлге дейін), ал 0.5-ке тең - соңғыдан кейінгі санның паритетінен бастап.
  • AArch64 архитектурасы үшін SVE2 кеңейтімін қолдау қосылды және SVE (Scalable Vector Extension) қолдауы жақсартылды, оның ішінде кірістірілген SVE ACLE функциялары мен түрлеріне қолдау және векторизацияны пайдалану. LSE (Large System Extensions) және TME (Transactional Memory Extension) қолдауы кеңейтілді. Armv8.5-A және Armv8.6-A нұсқаларында ұсынылған жаңа нұсқаулар, соның ішінде кездейсоқ сандарды құру, дөңгелектеу, жад тегтерін байлау,
    bfloat16 және матрицаны көбейту. Қосылған процессорды қолдау
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 және
    Marvell ThunderX3.

  • ARM32 үшін ABI FDPIC (64 биттік функция көрсеткіштері) қолдауы қосылды. 64 биттік бүтін операцияларды қайта жобаланған және оңтайландырылған өңдеу. Қосылған CPU қолдауы
    Arm Cortex-A77,
    Arm Cortex-A76AE және
    Arm Cortex-M35P. 32 биттік SIMD, 16 биттік көбейту, ысырма арифметикасы және басқа DSP алгоритмін оңтайландыруды қоса алғанда, ACLE деректерді өңдеу нұсқауларына кеңейтілген қолдау. ACLE CDE (Custom Datapath Extension) нұсқауларына эксперименттік қолдау қосылды.

  • GCN микроархитектурасына негізделген AMD графикалық процессорларына арналған серверде код жасау және векторлау айтарлықтай жақсартылған.
  • AVR архитектурасы үшін XMEGA тәрізді құрылғыларға қолдау қосылды
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmegamegamegame, ATtiny809, ATtiny1608 , ATmega1609, ATmega3208 3209, ATmega4808 және ATmega4809.

  • IA-32/x86-64 архитектуралары үшін жаңа Intel ENQCMD нұсқаулар жинағы архитектурасы кеңейтімі (-menqcmd) қосылды. Intel Cooperlake (-march=cooperlake, AVX512BF16 ISA кеңейтімін қамтиды) және Tigerlake (-march=tigerlake, MOVDIRI, MOVDIR64B және AVX512VP2INTERSECT ISA кеңейтімдерін қамтиды) процессорларына қолдау қосылды.
  • HSA архитектурасына негізделген гетерогенді есептеу жүйелеріне арналған HSAIL (гетерогендік жүйе архитектурасының аралық тілі) нұсқасы ескірген және болашақ шығарылымда жойылуы мүмкін.

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

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