GCC 9 kompilyatorlar to'plamining chiqarilishi

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

GCC 9.1 C++17 standartini qo‘llab-quvvatlashni barqarorlashtirish, kelajakdagi C++20 standarti (kod nomi C++2a) imkoniyatlarini joriy etishda davom etishi, D tili uchun frontendga qo‘shilishi, OpenMP 5.0 ni qisman qo‘llab-quvvatlashi bilan ajralib turadi. , OpenACC 2.5-ni deyarli to'liq qo'llab-quvvatlash, ulanish bosqichida protseduralararo optimallashtirish va optimallashtirishning miqyoslanishini oshirish, diagnostika vositalarini kengaytirish va yangi ogohlantirishlarni qo'shish, OpenRISC, C-SKY V2 va AMD GCN GPU uchun backends.

asosiy o'zgartirish:

  • D dasturlash tili uchun qoʻshimcha qoʻllab-quvvatlash. GCC kompilyatorli frontendni oʻz ichiga oladi GDK (Gnu D Compiler) va ish vaqti kutubxonalari (libphobos), bu sizga D dasturlash tilida dasturlar yaratish uchun standart GCC dan foydalanish imkonini beradi. GCCda D tilini qo'llab-quvvatlashni yoqish jarayoni boshlandi 2011 yilda, lekin sudrab ketdi kodni GCC talablariga muvofiqlashtirish zarurati va D dasturlash tilini ishlab chiqayotgan Digital Marsga intellektual mulk huquqlarini o'tkazish bilan bog'liq muammolar tufayli;
  • Kod generatoriga yaxshilanishlar kiritildi. Masalan, vaziyatlarga qarab Switch ifodalarini kengaytirish uchun turli strategiyalardan foydalanish (o'tish jadvali, bit testi, qarorlar daraxti) amalga oshirildi. “-ftree-switch-conversion” optimallashtirish yordamida Switch ifodasini o‘z ichiga olgan chiziqli funksiyalarni o‘zgartirish imkoniyati qo‘shildi (masalan, “2-holat: qanday = 205; tanaffus; 3-hol: qanday = 305; tanaffus” kabi shartlar to‘plami ;” “100 * qanday + 5” ga aylantiriladi;
  • Protseduralararo optimallashtirishlar yaxshilandi. Inline joylashtirish sozlamalari zamonaviy C++ kod bazalari uchun moslashtirildi va max-inline-insns-small, max-inline-insns-size, unlined-function-insns, unlined-function-time, unlined-thunk-insns va unlined yangi parametrlari bilan kengaytirildi. - tafakkur vaqti. Sovuq/issiq kodni ajratishning yaxshilangan aniqligi va tajovuzkorligi. Juda katta hajmdagi miqyoslash yaxshilandi tarjima birliklari (masalan, katta dasturlarga ulanish bosqichida optimallashtirishni qo'llashda);
  • Kodni profillash natijalariga asoslangan optimallashtirish mexanizmi (PGO - Profile-guided optimization) takomillashtirildi, bu kodni bajarish xususiyatlarini tahlil qilish asosida yanada optimal kodni yaratadi. Xulosa varianti "-fprofile-foydalanish" endi "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" va "-ftree-loop-distribution" optimallashtirish rejimlarini o'z ichiga oladi. Hisoblagichlari bo'lgan gistogrammalarning fayllarga kiritilishi olib tashlandi, bu profilli fayllar hajmini qisqartirdi (hozirda gistogrammalar ulanish paytida optimallashtirishni amalga oshirishda tezda yaratiladi);
  • Kengaytirilgan ulanish vaqtini optimallashtirish (LTO). Natijani yaratishdan oldin turlarni soddalashtirish ta'minlandi, bu LTO ob'ekt fayllari hajmini sezilarli darajada kamaytirish, ulanish bosqichida xotira sarfini kamaytirish va operatsiyalarni parallellashtirishni yaxshilash imkonini berdi. Bo'limlar soni (-param lto-partitions) 32 tadan 128 tagacha ko'paytirildi, bu esa ko'p sonli protsessor iplari bo'lgan tizimlarda ishlashni yaxshilaydi. Optimallashtiruvchi jarayonlar sonini boshqarish uchun parametr qo'shildi
    "-param lto-max-streaming-parallelism";

    Natijada, GCC 8.3 bilan solishtirganda, GCC 9da optimallashtirishlar kiritilgan ruxsat berilgan Firefox 5 va LibreOffice 66 ni kompilyatsiya qilish vaqtini taxminan 6.2.3% ga qisqartirish. Ob'ekt fayllari hajmi 7% ga kamaydi. 8 yadroli protsessorda ulanish vaqti 11% ga kamaydi. Ulanish bosqichini ketma-ket optimallashtirish bosqichi endi 28% tezroq va 20% kamroq xotirani sarflaydi. LTO ning parallellashtirilgan bosqichining har bir protsessorining xotira iste'moli 30% ga kamaydi;

  • Parallel dasturlash spetsifikatsiyasining aksariyati C, C++ va Fortran tillari uchun amalga oshiriladi OpenACC 2.5, bu GPU va NVIDIA PTX kabi ixtisoslashtirilgan protsessorlarda yuk tushirish operatsiyalari uchun vositalarni belgilaydi;
  • Standartni qisman qo'llab-quvvatlash C va C++ uchun amalga oshirildi MP 5.0 ni oching (Ochiq Multi-Processing), bu API va C, C++ va Fortran tillari uchun parallel dasturlash usullarini qo'llash usullarini belgilaydigan ko'p yadroli va umumiy xotira va vektorlashtirish birliklari (SIMD) bilan gibrid (CPU+GPU/DSP) tizimlarida. ;
  • C tili uchun yangi ogohlantirishlar qo'shildi: "-To'plangan a'zoning manzili" (tuzilma yoki birlashmaning to'plangan a'zosiga tenglashtirilmagan ko'rsatkich qiymati) va
    «- Mutlaq qiymat" (mutlaq qiymatni hisoblash uchun funktsiyalarga kirishda, agar ko'rsatilgan argument uchun mosroq funktsiya mavjud bo'lsa, masalan, abs (3.14) o'rniga fabs (3.14) dan foydalanish kerak). C++ uchun yangi ogohlantirishlar qo'shildi: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" va "-Wclass-conversion". Oldindan mavjud bo'lgan ko'plab ogohlantirishlar kengaytirildi;

  • Kelajakdagi C tili standartining bir qismi uchun C2x kodli eksperimental yordam qo'shildi. C2x qo'llab-quvvatlashini yoqish uchun "-std=c2x" va "-std=gnu2x" (GNU kengaytmalarini yoqish uchun) opsiyalaridan foydalaning. Standart hali rivojlanishning dastlabki bosqichida, shuning uchun uning imkoniyatlaridan faqat bitta argumentli _Static_assert ifodasi qo'llab-quvvatlanadi (ikki argumentli _Static_assert C11da standartlashtirilgan);
  • C++ 17 standartini qo'llab-quvvatlash barqaror deb e'lon qilindi. Frontendda C++ 17 tilining til imkoniyatlari to‘liq amalga oshirilgan, libstdc++ da standartda belgilangan kutubxona funksiyalari to‘liq amalga oshirishga yaqin;
  • Davomi amalga oshirish kelajak C++2a standartining elementlari. Masalan, ishga tushirish vaqtida diapazonlarni qo'shish imkoniyati qo'shildi, lambda ifodalari uchun kengaytmalar amalga oshirildi, ma'lumotlar tuzilmalarining bo'sh a'zolari va ehtimoliy/ehtimoliy atributlarni qo'llab-quvvatlash qo'shildi, virtual funktsiyalarni shartli ifodalarda chaqirish imkoniyati taqdim etildi. , va boshqalar.
    C++ 2a yordamini yoqish uchun “-std=c++2a” va “-std=gnu++2a” opsiyalaridan foydalaning. libstdc++ ga C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible va std::type_identity traits, std::type_identity:mid:point, std:d, funksiyasi uchun bit va versiya sarlavhalari fayllari qo‘shildi. , std::bind_front,
    std::visit, std::is_constant_evaluated va std::assume_aligned, char8_t turini qo'llab-quvvatlash qo'shildi, satrlarning prefiksi va qo'shimchasini tekshirish imkoniyatini amalga oshirdi (boshlang'ich_bilan, ends_with);

  • Yangi ARM protsessorlari uchun qo'shimcha yordam
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE va Neoverse N1. Armv8.3-A-da murakkab raqamlar bilan ishlash, psevdo-tasodifiy raqamlarni yaratish (rng) va xotira yorlig'i (memtag), shuningdek, spekulyativ bajarilishi va filialni bashorat qilish blokining ishlashi bilan bog'liq hujumlarni blokirovka qilish bo'yicha ko'rsatmalar uchun qo'shilgan qo'llab-quvvatlash qo'shildi. . AArch64 arxitekturasi uchun himoya rejimi qo'shildi stack va to'pning kesishuvlari (“-fstack-to'qnashuvdan himoya qilish”). Armv8.5-A arxitekturasining xususiyatlaridan foydalanish uchun “-march=armv8.5-a” opsiyasi qoʻshildi.

  • U GCN mikroarxitekturasi asosidagi AMD GPU'lari uchun kod yaratish uchun backendni o'z ichiga oladi. Amalga oshirish hozirda bir tarmoqli ilovalarni kompilyatsiya qilish (OpenMP va OpenACC orqali ko'p bosqichli hisob-kitoblarni amalga oshirish uchun keyinroq taqdim etiladi) va GPU Fiji va Vega 10-ni qo'llab-quvvatlash bilan cheklangan;
  • Protsessorlar uchun yangi backend qo'shildi OpenRISC;
  • Protsessorlar uchun qo'shilgan backend C-SKY V2, turli xil iste'molchi qurilmalari uchun bir xil nomdagi Xitoy kompaniyasi tomonidan ishlab chiqarilgan;
  • Bayt qiymatlari bilan ishlaydigan barcha buyruq qatori parametrlari kb, KiB, MB, MiB, GB va GiB qo'shimchalarini qo'llab-quvvatlaydi;
  • Amalga oshirildi “-flive-patching=[inline-only-static|inline-clone]” opsiyasi interprotseduralardan foydalanish ustidan ko‘p darajali nazorat tufayli jonli yamoq tizimlari uchun xavfsiz kompilyatsiyaga erishishga imkon beradi (IPA) optimallashtirish;
  • Bash-dan foydalanganda opsiyaning bajarilishini aniq nazorat qilish uchun "--to'ldirish" opsiyasi qo'shildi;
  • Diagnostika asboblari satr raqamini ko'rsatuvchi va operand turlari kabi tegishli ma'lumotlarni vizual ravishda belgilaydigan manba matn parchalarini ko'rsatishni ta'minlaydi. Satr raqamlari va yorliqlarni ko'rsatishni o'chirish uchun "-fno-diagnostika-satr raqamlarini ko'rsatish" va "-fno-diagnostika-yorliqlarni ko'rsatish" variantlari taqdim etiladi;

    GCC 9 kompilyatorlar to'plamining chiqarilishi

  • Kengaytirilgan C++ kodidagi xatolarni diagnostika qilish vositalari, xatolar sabablari va muammoli parametrlarni ajratib ko'rsatish to'g'risidagi ma'lumotlarning yaxshi o'qilishi;

    GCC 9 kompilyatorlar to'plamining chiqarilishi

  • “-fdiagnostics-format=json” opsiyasi qo‘shildi, bu esa diagnostika natijalarini mashinada o‘qiladigan formatda (JSON) yaratish imkonini beradi;
  • Qayta ishlanadigan manba fayllarni tanlash uchun “-fprofile-filter-files” va “-fprofile-exclude-files” yangi profillash opsiyalari qo‘shildi;
  • AddressSanitizer avtomatik o'zgaruvchilar uchun yanada ixcham tasdiqlash kodini yaratishni ta'minlaydi, bu tekshirilayotgan bajariladigan faylning xotira sarfini kamaytiradi;
  • Yaxshilangan chiqish "-fopt-info» (qo'shilgan optimallashtirishlar haqida batafsil ma'lumot). Oldin mavjud bo'lgan "eslatma" prefiksiga qo'shimcha ravishda "optimallashtirilgan" va "o'tkazib yuborilgan" yangi prefikslar qo'shildi. Inline-ochish va tsikllarni vektorlashtirish bo'yicha qaror qabul qilish to'g'risidagi ma'lumotlarning qo'shilgan chiqishi;
  • “-fsave-optimization-record” opsiyasi qo‘shilgan bo‘lsa, GCC SRCFILE.opt-record.json.gz faylini ma’lum optimallashtirishlardan foydalanish bo‘yicha qarorlar tavsifi bilan saqlaydi. Yangi parametr "-fopt-info" rejimidan profil va inline zanjirlar haqidagi ma'lumotlar kabi qo'shimcha metama'lumotlarni o'z ichiga olishi bilan farq qiladi;
  • Protseduralararo optimallashtirish jarayonida stack hizalanishini va statik o‘zgaruvchilar uchun manzillash rejimlaridan (faqat yozish yoki o‘qish-aniq) foydalanishni boshqarish uchun “-fipa-stack-alignment” va “-fipa-reference-addressable” opsiyalari qo‘shildi;
  • Atributlarni bog'lashni, shuningdek, filialni bashorat qilish va spekulyativ ko'rsatmalarni bajarish bilan bog'liq xatti-harakatlarni nazorat qilish uchun yangi o'rnatilgan funktsiyalar joriy etilgan: "__builtin_has_atributi","__ehtimollik bilan_qurilgan_kutish"Va"__qurilgan_spekulyatsiya_xavfsiz_qiymati". Funktsiyalar, o'zgaruvchilar va turlar uchun yangi atribut qo'shildi nusxa ko'chirish;
  • Fortran tili uchun asinxron kiritish/chiqarish uchun to'liq qo'llab-quvvatlash amalga oshirildi;
  • Solaris 10 (*-*-solaris2.10) va Cell/BE (Cell Broadband Engine SPU) platformalarini qo‘llab-quvvatlash eskirgan va keyingi yirik nashrda olib tashlanadi. Armv2, Armv3, Armv5 va Armv5E arxitekturalarini qo'llab-quvvatlash to'xtatildi. Intel MPX (Xotirani himoya qilish kengaytmalari) ni qo'llab-quvvatlash to'xtatildi.

Manba: opennet.ru

a Izoh qo'shish