GCC 10 kompilyator dəstinin buraxılışı

Bir illik inkişafdan sonra nəşr olundu kompilyatorların pulsuz dəstinin buraxılması GCC 10.1, yeni GCC 10.x filialında ilk böyük buraxılış. Uyğun olaraq yeni sxem buraxılış nömrələri, 10.0 versiyası inkişaf prosesində istifadə edilmişdir və GCC 10.1-in buraxılmasından qısa müddət əvvəl GCC 11.0 filialı artıq şaxələnmişdi və bunun əsasında növbəti əhəmiyyətli buraxılış, GCC 11.1 formalaşacaqdır.

GCC 10.1 C++ 20 standartı üçün hazırlanmış C++ dilində bir çox innovasiyaların tətbiqi, gələcək C dili standartı (C2x) ilə bağlı təkmilləşdirmələr, kompilyator arxa hissələrində yeni optimallaşdırmalar və eksperimental dəstək ilə diqqət çəkir. statik analiz rejimi. Bundan əlavə, yeni filialın hazırlanması zamanı layihə deponu SVN-dən Git-ə köçürdü.

Əsas dəyişikliklər:

  • Əlavə edilib statik analizin eksperimental rejimi "-fanalizator“, proqramda kodun icra yollarının və məlumat axınlarının resurs tələb edən prosedurlararası təhlilini həyata keçirir. Rejim kompilyasiya mərhələsində problemləri aşkar etməyə qadirdir, məsələn, bir yaddaş sahəsi üçün free() funksiyasına ikiqat çağırışlar, fayl deskriptorunun sızması, istinaddan imtina və null göstəricilərin ötürülməsi, boşaldılmış yaddaş bloklarına daxil olmaq, işə salınmamış dəyərlərdən istifadə və s. OpenSSL kodu üçün yeni rejimin istifadəsi artıq müəyyən etməyə imkan verib təhlükəli zəiflik.
  • Təkmilləşdirilmiş prosedurlararası optimallaşdırmalar. IPA-SRA (Prosedurlararası Skalar Paylaşılan Dəyişdirmə) keçidi bağlama zamanı işləmək üçün yenidən işlənib və digər şeylərlə yanaşı, indi hesablanmış və qaytarılmış istifadə olunmamış dəyərləri silir. "-O2" optimallaşdırma rejimində "-finline-funksiyaları" seçimi aktivləşdirilir ki, bu da icra performansından daha yığcam kodlara üstünlük vermək üçün yenidən tənzimlənir. Daxili funksiyaların yerləşdirilməsi üçün evristik iş sürətləndirildi. Daxili genişləndirmə və funksiya klonlama evristikası indi fərdi transformasiyaların effektivliyini proqnozlaşdırmaq üçün dəyər diapazonları haqqında məlumatdan istifadə edə bilər. C++ üçün tip əsaslı ləqəb təhlilinin dəqiqliyi təkmilləşdirilmişdir.
  • Təkmilləşdirilmiş Əlaqələndirmə Vaxtı Optimizasiyası (LTO). Yeni icra olunan əlavə edildi lto-dump LTO bayt kodu ilə obyekt faylları haqqında məlumatı sıfırlamaq üçün. Paralel LTO keçidləri avtomatik olaraq eyni vaxtda işləyən tapşırıqların sayını müəyyənləşdirir və onları müəyyən etmək mümkün olmadıqda, paralelləşdirmə faktoru kimi CPU nüvələrinin sayı haqqında məlumatdan istifadə edin. Zstd alqoritmindən istifadə edərək LTO bayt kodunu sıxışdırmaq imkanı əlavə edildi.
  • Kodun profilləşdirilməsinin nəticələrinə əsaslanan optimallaşdırma mexanizmi (PGO - Profile-guided optimization) təkmilləşdirilmişdir ki, bu da kodun icrasının xüsusiyyətlərinin təhlili əsasında daha optimal kodu yaradır. Kompilyasiya və isti/soyuq kod ayırma zamanı təkmilləşdirilmiş profil baxımı. Seçim vasitəsilə "-fprofile-dəyərləri» indi 4-ə qədər profil dəyərinə nəzarət edə bilər, məsələn, dolayı zənglər və daha dəqiq profil məlumatı təqdim etmək.
  • Paralel proqramlaşdırma spesifikasiyası C, C++ və Fortran dilləri üçün həyata keçirilir OpenACC 2.6, GPU-larda və NVIDIA PTX kimi xüsusi prosessorlarda yükləmə əməliyyatları üçün alətləri müəyyən edir. Standartın tətbiqi demək olar ki, başa çatıb MP 5.0 açın Paylaşılan yaddaş və vektorlaşdırma vahidləri (SIMD) olan çoxnüvəli və hibrid (CPU+GPU/DSP) sistemlərdə paralel proqramlaşdırma metodlarının tətbiqi API və üsullarını müəyyən edən (Açıq Multi-Processing). Son şəxsi şərtlər, skan və loop direktivləri, sifariş və use_device_addr ifadələri kimi funksiyalar əlavə edildi. OpenMP və OpenACC üçün dördüncü nəsil (Fiji) və beşinci nəsil AMD Radeon (GCN) GPU-larında (VEGA 10/VEGA 20) yükləmə əməliyyatları üçün dəstək əlavə edilmişdir.
  • C ailəsinin dilləri üçün funksiyanın istinad və ya göstərici ilə ötürülən obyektlərə çıxışını təsvir etmək və bu cür obyektləri obyektlərin ölçüsü haqqında məlumatı ehtiva edən tam ədəd arqumentləri ilə əlaqələndirmək üçün "giriş" funksiyası əlavə edilmişdir. "Giriş" ilə birlikdə işləmək üçün "növ" atributu istifadəçi funksiyalarından səhv girişi aşkar etmək üçün həyata keçirilir, məsələn, massivin hüdudlarından kənarda bir sahəyə dəyərlər yazarkən. ELF faylındakı simvolları xüsusi versiya nömrələri ilə əlaqələndirmək üçün "symver" atributu da əlavə olunur.
  • Yeni xəbərdarlıqlar əlavə edildi:
    • “-Wstring-müqayisə” (“-Wextra” ilə aktivləşdirilib) - uzunluğuna görə sabitə ekvivalent olan strcmp və strncmp funksiyalarının çağırılması nəticəsində sıfırın müqayisə edildiyi ifadələrin olması barədə xəbərdarlıq edir. bir arqumentin ölçüsü ikinci arqumentdəki massivin ölçüsündən böyükdür.
    • "-Wzero-length-bounds" ("-Warray-bounds" ilə aktivləşdirilib) - sıfır uzunluqda massiv elementlərinə daxil olmaq barədə xəbərdarlıq edir ki, bu da digər məlumatların üzərinə yazılmasına səbəb ola bilər.
    • “-Warray-bounds”, “-Wformat-overflow”, “-Wrestrict”, “-Wreturn-local-addr” və “-Wstringop-overflow” xəbərdarlıqları hüduddan kənar vəziyyətlərin sayını genişləndirmək üçün genişləndirilib. ki, idarə olunur.
  • UCN notasiyası (\uNNNN və ya \UNNNNNNNN) əvəzinə cari kodlaşdırmadan (standart olaraq UTF-8) istifadə edərək identifikatorlarda geniş simvolları birbaşa təyin etmək imkanı həyata keçirilib. Misal üçün:

    statik const int π = 3;
    int get_naïve_pi() {
    π qaytarmaq;
    }

  • C dili üçün, C2X standartı çərçivəsində hazırlanmış yeni funksiyaların bir hissəsi həyata keçirilmişdir (-std=c2x və -std=gnu2x təyin edilməklə işə salınmışdır): “[[]]” sintaksisi üçün dəstək aşağıdakı kimi atributları müəyyən etmək üçün meydana çıxdı. C++ (məsələn, [[gnu ::const]], [[deprecated]], [[fallthrough]] və [[maybe_unused]]. UTF-8 simvolları ilə sabitləri təyin etmək üçün "u8" sintaksisi üçün əlavə dəstək.
    Yeni makrolar əlavə edildi . Strftime-a "%OB" və "%Ob" əvəzləmələri əlavə edildi.

  • C üçün standart rejim bəzi platformalarda qlobal dəyişənlərə daha səmərəli daxil olmağa imkan verən "-fno-common"dur.
  • C++ üçün C++ 16 standartında işlənmiş 20-ya yaxın dəyişiklik və yenilik tətbiq edilmişdir. Əlavə edilmiş açar sözü "constinit" daxil olmaqla
    və şablon uzantıları üçün dəstək həyata keçirildi "anlayışlar". Konsepsiyalar tərtib zamanı şablon parametrləri kimi qəbul edilə bilən arqumentlər toplusunu məhdudlaşdıran şablon parametr tələbləri toplusunu müəyyən etməyə imkan verir. Şablon daxilində istifadə olunan məlumat növlərinin xüsusiyyətləri ilə giriş parametrlərinin məlumat tipi xüsusiyyətləri arasında məntiqi uyğunsuzluqların qarşısını almaq üçün anlayışlardan istifadə edilə bilər.

  • G++ constexpr vasitəsilə daimi obyektlərin dəyişdirilməsi nəticəsində yaranan qeyri-müəyyən davranışın aşkarlanmasını təmin edir. Constexpr hesablanarkən kompilyator tərəfindən azaldılmış yaddaş istehlakı. "-Wmismatched-tags" və "-Wredundant-tags" yeni xəbərdarlıqlar əlavə edildi.
  • Yeni komanda xətti variantları təklif edilmişdir:
    • "-fallocation-dce" lazımsız "yeni" və "sil" operator cütlərini silmək üçün.
    • "-fprofile-partial-training" təlim proqramı olmayan kod üçün ölçü optimallaşdırmasını söndürmək üçün.
    • "-fprofile-reproducible profilin təkrar istehsal səviyyəsinə nəzarət etmək üçün.
    • "-fprofile-prefix-path" ayrı profil yaratmaq üçün istifadə olunan əsas mənbə qurma kataloqunu müəyyən etmək üçün ("-fprofile-generate=profile_dir" və "-fprofile-use=profile_dir" üçün).
  • Qeyd olunan variantlar üçün xəbərdarlıq mətnində bu seçimlər üçün sənədlərə keçməyə imkan verən hiperlinklər verilir. URL dəyişdirilməsi "-fdiagnostics-urls" seçimi ilə idarə olunur.
  • Əlavə edilmiş preprosessor operatoru "__quraşdırılıb", daxili funksiyaları yoxlamaq üçün istifadə edilə bilər.
  • ISO/IEC TS 18661 spesifikasiyasında müəyyən edilmiş yuvarlaqlaşdırma funksiyasının həyata keçirilməsi ilə yeni quraşdırılmış "__builtin_roundeven" funksiyası əlavə edildi, "dəyirmi" kimi, lakin yuvarlaqlaşdırma hissəsi 0.5-dən yuxarı (daha böyük dəyərə), 0.5-dən azdır. - aşağı (sıfıra) və 0.5-ə bərabər - sondan əvvəlki rəqəmin paritetindən başlayaraq.
  • AArch64 arxitekturası üçün SVE2 genişləndirilməsi üçün dəstək əlavə edildi və SVE (Ölçəklənən Vektor Genişləndirilməsi) dəstəyi təkmilləşdirildi, o cümlədən daxili SVE ACLE funksiyaları və növləri üçün əlavə dəstək və vektorlaşdırmadan istifadə. LSE (Large System Extensions) və TME (Transactional Memory Extension) üçün dəstək genişləndirilmişdir. Armv8.5-A və Armv8.6-A-da təklif olunan yeni təlimatlar, o cümlədən təsadüfi nömrələrin yaradılması, yuvarlaqlaşdırılması, yaddaş etiketinin bağlanması,
    bfloat16 və matrisin vurulması. Əlavə edilmiş prosessor dəstəyi
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 və
    Marvell ThunderX3.

  • ARM32 üçün ABI FDPIC (64-bit funksiya göstəriciləri) üçün əlavə dəstək. 64 bitlik tam əməliyyatların yenidən işlənmiş və optimallaşdırılmış işlənməsi. CPU dəstəyi əlavə edildi
    Arm Cortex-A77,
    Arm Cortex-A76AE və
    Arm Cortex-M35P. 32-bit SIMD, 16-bit vurma, mandalı hesablama və digər DSP alqoritm optimallaşdırmaları daxil olmaqla, ACLE məlumat emal təlimatları üçün genişləndirilmiş dəstək. ACLE CDE (Custom Datapath Extension) təlimatları üçün eksperimental dəstək əlavə edildi.

  • GCN mikroarxitekturasına əsaslanan AMD GPU-ları üçün arxa hissədə kod yaratmaq və vektorlaşdırma əhəmiyyətli dərəcədə təkmilləşdirilmişdir.
  • AVR arxitekturası üçün XMEGA kimi cihazlar üçün əlavə dəstək
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATtiny809, ATtiny1608, ATtiny 1609, ATmega3208, ATmega3209 4808, ATmega4809 və ATmegaXNUMX.

  • IA-32/x86-64 arxitekturaları üçün yeni Intel ENQCMD təlimat dəsti arxitektura genişlənməsi (-menqcmd) əlavə edildi. Intel Cooperlake (-march=cooperlake, AVX512BF16 ISA genişləndirilməsi daxildir) və Tigerlake (-march=tigerlake, MOVDIRI, MOVDIR64B və AVX512VP2INTERSECT ISA genişləndirmələri daxildir) CPU-ları üçün əlavə dəstək.
  • HSA arxitekturasına əsaslanan heterojen hesablama sistemləri üçün HSAIL (Heterogen Sistem Arxitekturasının Ara Dili) tətbiqi köhnəlib və gələcək buraxılışda silinəcək.

Mənbə: opennet.ru

Добавить комментарий