GCC 10 kompilyatorlar to'plamining chiqarilishi

Bir yillik rivojlanishdan keyin e'lon qilindi bepul kompilyatorlar to'plamini chiqarish GCC 10.1, yangi GCC 10.x filialidagi birinchi yirik nashr. Ga muvofiq yangi sxema relizlar raqamlari, 10.0 versiyasi ishlab chiqish jarayonida ishlatilgan va GCC 10.1 chiqarilishidan biroz oldin GCC 11.0 filiali allaqachon tarmoqlangan bo'lib, uning asosida keyingi muhim reliz GCC 11.1 shakllantiriladi.

GCC 10.1 C++ 20 standarti uchun ishlab chiqilgan C++ tilida ko‘plab innovatsiyalarni amalga oshirish, kelajakdagi C tili standarti (C2x) bilan bog‘liq yaxshilanishlar, kompilyator orqa qismidagi yangi optimallashtirishlar va eksperimental qo‘llab-quvvatlash bilan ajralib turadi. statik tahlil rejimi. Bundan tashqari, yangi filialni tayyorlash jarayonida loyiha omborni SVN-dan Git-ga o'tkazdi.

asosiy o'zgartirish:

  • Qo'shilgan statik tahlilning eksperimental usuli "- fanalizator", bu dasturda kodni bajarish yo'llari va ma'lumotlar oqimlarining resurs talab qiladigan protseduralararo tahlilini amalga oshiradi. Rejim kompilyatsiya bosqichidagi muammolarni aniqlashga qodir, masalan, bitta xotira maydoni uchun free() funksiyasiga ikki marta qo'ng'iroq qilish, fayl identifikatori oqish, nol ko'rsatkichlarni o'chirish va o'tkazish, bo'shatilgan xotira bloklariga kirish, ishga tushirilmagan qiymatlardan foydalanish va hokazo. OpenSSL kodi uchun yangi rejimdan foydalanish allaqachon aniqlash imkonini berdi xavfli zaiflik.
  • Protseduralararo optimallashtirishlar yaxshilandi. IPA-SRA (Interprocedural Scalar Shared Replacement) ruxsatnomasi ulanish vaqtida ishlash uchun qayta ishlab chiqilgan va boshqa narsalar qatorida endi hisoblangan va qaytarilgan foydalanilmagan qiymatlarni olib tashlaydi. "-O2" optimallashtirish rejimida "-finline-funksiyalari" opsiyasi yoqilgan bo'lib, u ijro samaradorligidan ko'ra ixcham kodni afzal ko'rish uchun qayta sozlanadi. Inline funktsiyani joylashtirish uchun evristik ish tezlashtirildi. Inline kengaytirish va funktsiyalarni klonlash evristikasi endi qiymat diapazonlari haqidagi ma'lumotlardan individual o'zgarishlar samaradorligini bashorat qilish uchun foydalanishi mumkin. C++ uchun turga asoslangan taxallusni tahlil qilishning aniqligi yaxshilandi.
  • Kengaytirilgan ulanish vaqtini optimallashtirish (LTO). Yangi bajariladigan fayl qo'shildi lto-dump LTO baytkodi bilan ob'ekt fayllari haqidagi ma'lumotlarni qayta tiklash uchun. Parallel LTO o'tishlari avtomatik ravishda bir vaqtning o'zida bajariladigan vazifalar sonini aniqlaydi va agar ularni aniqlash mumkin bo'lmasa, parallelizatsiya omili sifatida CPU yadrolari soni haqidagi ma'lumotlardan foydalaning. Zstd algoritmi yordamida LTO bayt kodini siqish qobiliyati qo'shildi.
  • Kodni profillash natijalariga asoslangan optimallashtirish mexanizmi (PGO - Profile-guided optimization) takomillashtirildi, bu kodni bajarish xususiyatlarini tahlil qilish asosida yanada optimal kodni yaratadi. Kompilyatsiya va issiq/sovuq kodni ajratish vaqtida yaxshilangan profilga texnik xizmat ko'rsatish. Variant orqali "-fprofile-qiymatlari» endi 4 tagacha profil qiymatini kuzatishi mumkin, masalan, bilvosita qoʻngʻiroqlar va aniqroq profil maʼlumotlarini taqdim etish.
  • Parallel dasturlash spetsifikatsiyasi C, C++ va Fortran tillari uchun amalga oshirilgan OpenACC 2.6, bu GPU va NVIDIA PTX kabi maxsus protsessorlarda yuk tushirish operatsiyalari uchun vositalarni belgilaydi. Standartni joriy etish deyarli yakunlandi MP 5.0 ni oching Umumiy xotira va vektorlashtirish birliklari (SIMD) bilan ko'p yadroli va gibrid (CPU+GPU/DSP) tizimlarda parallel dasturlash usullarini qo'llash API va usullarini belgilaydigan (Ochiq Multi-Processing). Oxirgi xususiy shartlar, skanerlash va aylanish ko'rsatmalari, buyurtma va use_device_addr ifodalari kabi qo'shilgan xususiyatlar. OpenMP va OpenACC uchun to'rtinchi avlod (Fiji) va beshinchi avlod AMD Radeon (GCN) GPU (VEGA 10/VEGA 20) da yuk tushirish operatsiyalari uchun qo'llab-quvvatlash qo'shildi.
  • C oilasining tillari uchun funksiyaning mos yozuvlar yoki ko'rsatgich orqali uzatiladigan ob'ektlarga kirishini tavsiflash va bunday ob'ektlarni ob'ektlarning o'lchami haqidagi ma'lumotlarni o'z ichiga olgan butun son argumentlari bilan bog'lash uchun "kirish" funktsiyasi qo'shilgan. "Kirish" bilan birgalikda ishlash uchun "tur" atributi foydalanuvchi funktsiyalaridan noto'g'ri kirishni aniqlash uchun amalga oshiriladi, masalan, massiv chegarasidan tashqaridagi maydonga qiymatlarni yozishda. ELF faylidagi belgilarni ma'lum versiya raqamlari bilan bog'lash uchun "symver" atributi ham qo'shilgan.
  • Yangi ogohlantirishlar qo'shildi:
    • "-Wstring-qiyoslash" ("-Wextra" bilan faollashtirilgan) - strcmp va strncmp funktsiyalarini chaqirish natijasi bilan nol solishtiriladigan iboralar mavjudligi haqida ogohlantiradi, bu uzunligi tufayli doimiyga ekvivalentdir. bir argumentning soni ikkinchi argumentdagi massiv hajmidan kattaroqdir.
    • "-Wzero-length-bounds" ("-Warray-bounds" bilan faollashtirilgan) - nol uzunlikdagi massiv elementlariga kirish haqida ogohlantiradi, bu boshqa ma'lumotlarni qayta yozishga olib kelishi mumkin.
    • “-Warray-bounds”, “-Wformat-overflow”, “-Wrestrict”, “-Wreturn-local-addr” va “-Wstringop-overflow” ogohlantirishlari chegaradan tashqari holatlar sonini kengaytirish uchun kengaytirildi. ishlov beriladiganlar.
  • UCN belgisi (\uNNNN yoki \UNNNNNNNN) emas, balki joriy kodlash (sukut bo'yicha UTF-8) yordamida identifikatorlarda keng belgilarni bevosita ko'rsatish imkoniyati joriy etildi. Masalan:

    statik const int p = 3;
    int get_naïve_pi() {
    p ni qaytarish;
    }

  • C tili uchun C2X standarti doirasida ishlab chiqilgan yangi funksiyalarning bir qismi amalga oshirildi (-std=c2x va -std=gnu2x belgilash orqali faollashtirilgan): quyidagi kabi atributlarni aniqlash uchun “[[]]” sintaksisi qo‘llab-quvvatlandi. C++ (masalan, [[gnu ::const]], [[eskirgan]], [[fallthrough]] va [[maybe_unused]]. UTF-8 belgilar bilan konstantalarni aniqlash uchun “u8” sintaksisi qo‘shildi.
    Yangi makroslar qo'shildi . strftime ga "%OB" va "%Ob" almashtirishlari qo'shildi.

  • C uchun standart rejim "-fno-common" bo'lib, ba'zi platformalarda global o'zgaruvchilarga yanada samarali kirish imkonini beradi.
  • C++ uchun C++16 standartida ishlab chiqilgan 20 ga yaqin o'zgartirish va innovatsiyalar amalga oshirildi. Jumladan, “constinit” kalit so‘zi qo‘shilgan
    va shablon kengaytmalarini qo'llab-quvvatlash amalga oshirildi "tushunchalar". Tushunchalar kompilyatsiya vaqtida shablon parametrlari sifatida qabul qilinishi mumkin bo'lgan argumentlar to'plamini cheklaydigan shablon parametrlari talablari to'plamini aniqlash imkonini beradi. Tushunchalar shablonda ishlatiladigan ma'lumotlar turlarining xususiyatlari va kirish parametrlarining ma'lumotlar turi xususiyatlari o'rtasidagi mantiqiy nomuvofiqlikni oldini olish uchun ishlatilishi mumkin.

  • G++ doimiy ob'ektlarni constexpr orqali o'zgartirish natijasida yuzaga kelgan aniqlanmagan xatti-harakatlarni aniqlashni ta'minlaydi. Constexpr ni hisoblashda kompilyator tomonidan qisqartirilgan xotira sarfi. "-Wmismatched-tags" va "-Wredundant-tags" yangi ogohlantirishlari qo'shildi.
  • Yangi buyruq qatori variantlari taklif qilindi:
    • "-fallocation-dce" "yangi" va "o'chirish" operatorlarining keraksiz juftlarini olib tashlash uchun.
    • "-fprofile-partial-training" o'quv jarayoniga ega bo'lmagan kod uchun o'lchamni optimallashtirishni o'chirish uchun.
    • "-fprofile-reproducible profilning takrorlanuvchanlik darajasini nazorat qilish uchun.
    • "-fprofile-prefix-path" alohida profil yaratish uchun foydalaniladigan asosiy manba yaratish katalogini aniqlash uchun ("-fprofile-generate=profile_dir" va "-fprofile-use=profile_dir" uchun).
  • Ko'rsatilgan variantlar uchun ogohlantirish matnida ushbu variantlar bo'yicha hujjatlarga o'tish imkonini beruvchi giperhavolalar taqdim etilgan. URL almashtirish "-fdiagnostics-urls" opsiyasi yordamida boshqariladi.
  • Qo'shilgan protsessor operatori "__o'rnatilgan", bu o'rnatilgan funktsiyalarni tekshirish uchun ishlatilishi mumkin.
  • ISO/IEC TS 18661 spetsifikatsiyasida aniqlangan yaxlitlash funktsiyasini amalga oshirish bilan yangi o'rnatilgan "__builtin_roundeven" funksiyasi qo'shildi, "yumaloq" ga o'xshash, lekin yaxlitlash qismi 0.5 dan katta (kattaroq qiymatga), 0.5 dan kam. - pastga (nolga) va 0.5 ga teng - oxirgidan oldingi raqamning paritetidan boshlab.
  • AArch64 arxitekturasi uchun SVE2 kengaytmasini qoʻllab-quvvatlash qoʻshildi va SVE (Scalable Vector Extension) qoʻllab-quvvatlashi yaxshilandi, jumladan, oʻrnatilgan SVE ACLE funksiyalari va turlari uchun qoʻshimcha yordam hamda vektorlashtirishdan foydalanish. LSE (Large System Extensions) va TME (Transactional Memory Extension) qo‘llab-quvvatlash kengaytirildi. Armv8.5-A va Armv8.6-A da taklif qilingan yangi koʻrsatmalar qoʻshildi, jumladan tasodifiy sonlarni yaratish, yaxlitlash, xotira yorligʻini ulash boʻyicha koʻrsatmalar,
    bfloat16 va matritsani ko'paytirish. Protsessorni qo'llab-quvvatlash qo'shildi
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 va
    Marvell ThunderX3.

  • ARM32 uchun ABI FDPIC (64-bit funktsiya ko'rsatkichlari) qo'llab-quvvatlandi. 64-bitli butun operatsiyalarni qayta ishlangan va optimallashtirilgan ishlov berish. Qo'shilgan CPU yordami
    Arm Cortex-A77,
    Arm Cortex-A76AE va
    Arm Cortex-M35P. 32-bitli SIMD, 16-bitli koʻpaytirish, mandal arifmetikasi va boshqa DSP algoritmini optimallashtirishni oʻz ichiga olgan ACLE maʼlumotlarini qayta ishlash koʻrsatmalari uchun kengaytirilgan yordam. ACLE CDE (Custom Datapath Extension) koʻrsatmalari uchun tajribaviy yordam qoʻshildi.

  • GCN mikroarxitekturasi asosidagi AMD GPUlari uchun backendda kod ishlab chiqarish va vektorlashtirish sezilarli darajada yaxshilandi.
  • AVR arxitekturasi uchun XMEGA o'xshash qurilmalarni qo'llab-quvvatlash qo'shildi
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808ga, ATmega809me, ATtiny 1608, ATmega1609, ATmega3208 3209, ATmega4808 va ATmega4809.

  • IA-32/x86-64 arxitekturalari uchun yangi Intel ENQCMD ko'rsatmalar to'plami arxitektura kengaytmasi (-menqcmd) qo'shildi. Intel Cooperlake (-march=cooperlake, AVX512BF16 ISA kengaytmasini o‘z ichiga oladi) va Tigerlake (-march=tigerlake, MOVDIRI, MOVDIR64B va AVX512VP2INTERSECT ISA kengaytmalarini o‘z ichiga oladi) protsessorlari uchun qo‘shimcha yordam.
  • HSA arxitekturasiga asoslangan heterojen hisoblash tizimlari uchun HSAIL (Heterojen tizim arxitekturasi oraliq tili) ilovasi eskirgan va kelgusi versiyada olib tashlanishi mumkin.

Manba: opennet.ru

a Izoh qo'shish