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

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

GCC 9.1 C++17 standartı üçün dəstəyin stabilləşdirilməsi, gələcək C++20 standartının (kod adı C++2a) imkanlarını həyata keçirməyə davam etməsi, D dili üçün ön hissəyə daxil edilməsi, OpenMP 5.0 üçün qismən dəstəyi ilə diqqət çəkir. , OpenACC 2.5 üçün demək olar ki, tam dəstək, məcburi mərhələdə prosedurlararası optimallaşdırmaların və optimallaşdırmaların miqyasını artırmaq, diaqnostika vasitələrinin genişləndirilməsi və yeni xəbərdarlıqların əlavə edilməsi, OpenRISC, C-SKY V2 və AMD GCN GPU üçün arxa uçlar.

Əsas dəyişikliklər:

  • D proqramlaşdırma dili üçün əlavə dəstək. GCC kompilyatoru olan ön hissəni ehtiva edir GDC (Gnu D Compiler) və D proqramlaşdırma dilində proqramlar qurmaq üçün standart GCC-dən istifadə etməyə imkan verən iş vaxtı kitabxanaları (libphobos) GCC-də D dili dəstəyinin işə salınması prosesi başladı 2011-ci ildə, lakin sürükləndi kodun GCC tələblərinə uyğunlaşdırılması zərurəti və D proqramlaşdırma dilini inkişaf etdirən Digital Mars-a əqli mülkiyyət hüquqlarının ötürülməsi ilə bağlı problemlər səbəbindən;
  • Kod generatorunda təkmilləşdirmələr edildi. Məsələn, situasiyalardan asılı olaraq Switch ifadələrini genişləndirmək üçün müxtəlif strategiyaların istifadəsi (atlama cədvəli, bit testi, qərar ağacı) həyata keçirilmişdir. “-ftree-switch-conversion” optimallaşdırmasından istifadə edərək (məsələn, “hal 2: how = 205; break; case 3: how = 305; break” kimi şərtlər toplusundan istifadə edərək, Switch ifadəsini ehtiva edən xətti funksiyaları çevirmək imkanı əlavə edildi. ;” “100 * necə + 5”ə çevriləcək;
  • Təkmilləşdirilmiş prosedurlararası optimallaşdırmalar. Daxili yerləşdirmə parametrləri müasir C++ kod bazaları üçün uyğunlaşdırılıb və max-inline-insns-small, max-inline-insns-size, unlined-function-insns, unlined-function-time, unlined-thunk-insns və unlined yeni parametrləri ilə genişləndirilib. -təşəkkür vaxtı. Soyuq/isti kodun ayrılmasının təkmilləşdirilmiş dəqiqliyi və aqressivliyi. Çox böyük üçün təkmilləşdirilmiş miqyaslanma tərcümə vahidləri (məsələn, böyük proqramlarla əlaqələndirmə mərhələsində optimallaşdırma tətbiq edildikdə);
  • 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. Xülasə seçimi "-fprofile-istifadə" indi "-fversion-loops-for-addımlar", "-floop-interchange", "-floop-unroll-and-jam" və "-ftree-loop-distribution" optimallaşdırma rejimlərini ehtiva edir. Sayğacları olan histoqramların fayllara daxil edilməsi aradan qaldırıldı, bu da profilləri olan faylların ölçüsünü azaltdı (histoqramlar indi əlaqə zamanı optimallaşdırmalar apararkən tez yaradılır);
  • Təkmilləşdirilmiş Əlaqələndirmə Vaxtı Optimizasiyası (LTO). Nəticə yaratmazdan əvvəl növlərin sadələşdirilməsi təmin edildi ki, bu da LTO obyekt fayllarının ölçüsünü əhəmiyyətli dərəcədə azaltmağa, bağlama mərhələsində yaddaş istehlakını azaltmağa və əməliyyatların paralelləşdirilməsini yaxşılaşdırmağa imkan verdi. Bölmələrin sayı (-param lto-partitions) 32-dən 128-ə qədər artırılıb ki, bu da çoxlu sayda CPU yivləri olan sistemlərdə performansı yaxşılaşdırır. Optimizator proseslərinin sayına nəzarət etmək üçün parametr əlavə edilmişdir
    "-param lto-max-streaming-parallelism";

    Nəticədə, GCC 8.3 ilə müqayisədə, GCC 9-da təqdim edilən optimallaşdırmalar icazə verilir Firefox 5 və LibreOffice 66-ün tərtib müddətini təxminən 6.2.3% azaldın. Obyekt fayllarının ölçüsü 7% azalıb. 8 nüvəli CPU-da bağlanma müddəti 11% azalıb. Əlaqələndirmə mərhələsinin ardıcıl optimallaşdırma mərhələsi indi 28% daha sürətlidir və 20% daha az yaddaş sərf edir. LTO-nun paralelləşdirilmiş mərhələsinin hər bir prosessorunun yaddaş istehlakı 30% azaldı;

  • Paralel proqramlaşdırma spesifikasiyasının əksəriyyəti C, C++ və Fortran dilləri üçün həyata keçirilir OpenACC 2.5, GPU-larda və NVIDIA PTX kimi xüsusi prosessorlarda yükləmə əməliyyatları üçün alətləri müəyyən edir;
  • Standarta qismən dəstək C və C++ üçün həyata keçirilib 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ə C, C++ və Fortran dilləri üçün paralel proqramlaşdırma metodlarının tətbiqi API və üsullarını müəyyən edən (Açıq Multi-Processing) ;
  • C dili üçün yeni xəbərdarlıqlar əlavə edildi: "-Address-of-dolu-üzv" (strukturun və ya birliyin dolu üzvünə uyğunlaşdırılmamış göstərici dəyəri) və
    «-Mütləq dəyər" (mütləq dəyərin hesablanması üçün funksiyalara daxil olarkən, göstərilən arqument üçün daha uyğun funksiya varsa, məsələn, abs(3.14) əvəzinə fabs(3.14) istifadə edilməlidir). C++ üçün yeni xəbərdarlıqlar əlavə edildi: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" və "-Wclass-conversion". Əvvəllər mövcud olan bir çox xəbərdarlıqlar genişləndirildi;

  • C2x kod adlı gələcək C dili standartının bir hissəsi üçün eksperimental dəstək əlavə edildi. C2x dəstəyini aktivləşdirmək üçün "-std=c2x" və "-std=gnu2x" seçimlərindən istifadə edin (GNU uzantılarını aktivləşdirmək üçün). Standart hələ inkişafın erkən mərhələsindədir, ona görə də onun imkanlarından yalnız bir arqumentli _Static_assert ifadəsi dəstəklənir (iki arqumentli _Static_assert C11-də standartlaşdırılıb);
  • C++17 standartı üçün dəstək stabil elan edilib. Frontenddə C++ 17-nin dil imkanları tam həyata keçirilir, libstdc++-da isə standartda müəyyən edilmiş kitabxana funksiyaları tam icraya yaxındır;
  • davam edir həyata keçirilməsi gələcək C++2a standartının elementləri. Məsələn, başlatma zamanı diapazonları daxil etmək imkanı əlavə edildi, lambda ifadələri üçün genişləndirmələr həyata keçirildi, məlumat strukturlarının boş üzvləri üçün dəstək və ehtimal/mümkün olmayan atributlar əlavə edildi, şərti ifadələrdə virtual funksiyaları çağırmaq imkanı təmin edildi. və s.
    C++2a dəstəyini aktivləşdirmək üçün "-std=c++2a" və "-std=gnu++2a" seçimlərindən istifadə edin. C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible və std::type_identity traits, std::type_identity:mid,pstd, funksiyası üçün libstdc++-a bit və versiya başlıq faylları əlavə edildi , std::bind_front,
    std::visit, std::is_constant_evaluated və std::assume_aligned, char8_t növü üçün dəstək əlavə edildi, sətirlərin prefiksini və şəkilçisini yoxlamaq imkanı həyata keçirdi (başlanğıc_ilə, bitər_ilə);

  • Yeni ARM prosessorları üçün əlavə dəstək
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE və Neoverse N1. Armv8.3-A-da kompleks nömrələrlə işləmək, psevdo-təsadüfi nömrələr yaratmaq (rng) və yaddaş etiketləmə (memtag), həmçinin spekulyativ icra və filial proqnozlaşdırma bölməsinin işləməsi ilə bağlı hücumların qarşısını almaq üçün təlimatlar üçün əlavə dəstək . AArch64 arxitekturası üçün qoruma rejimi əlavə edilmişdir yığın və yığının kəsişmələri (“-fstack-clash-protection”). Armv8.5-A arxitekturasının xüsusiyyətlərindən istifadə etmək üçün “-march=armv8.5-a” seçimi əlavə edilmişdir.

  • Buraya GCN mikroarxitekturasına əsaslanan AMD GPU-ları üçün kod yaratmaq üçün arxa plan daxildir. Tətbiq hazırda tək yivli proqramların tərtibi (OpenMP və OpenACC vasitəsilə çox yivli hesablamaların aparılması üçün dəstək daha sonra təklif olunacaq) və GPU Fiji və Vega 10 dəstəyi ilə məhdudlaşır;
  • Prosessorlar üçün yeni backend əlavə edildi OpenRISC;
  • Prosessorlar üçün backend əlavə edildi C-SKY V2, müxtəlif istehlak cihazları üçün eyni adlı Çin şirkəti tərəfindən istehsal olunur;
  • Bayt dəyərlərini işlədən bütün əmr satırı seçimləri kb, KiB, MB, MiB, GB və GiB şəkilçilərini dəstəkləyir;
  • Həyata keçirilən “-flive-patching=[inline-only-static|inline-clone]” seçimi prosedurlararası istifadə üzərində çox səviyyəli nəzarət (IPA) optimallaşdırmalar;
  • bash istifadə edərkən seçim tamamlanmasına incə dənəli nəzarət üçün "--tamamlama" seçimi əlavə edildi;
  • Diaqnostika alətləri sətir nömrəsini göstərən və operand növləri kimi əlaqəli məlumatları əyani olaraq işarələyən mənbə mətn hissələrinin nümayişini təmin edir. Sətir nömrələrinin və etiketlərin göstərilməsini söndürmək üçün “-fno-diaqnostika-sətir nömrələrini göstər” və “-fno-diaqnostika-etiketləri göstər” seçimləri təmin edilir;

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

  • Genişləndirilmiş C++ kodunda səhvlərin diaqnostikası üçün alətlər, səhvlərin səbəbləri haqqında məlumatın oxunmasının təkmilləşdirilməsi və problemli parametrlərin işıqlandırılması;

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

  • Maşınla oxuna bilən formatda (JSON) diaqnostik nəticə yaratmağa imkan verən “-fdiagnostics-format=json” seçimi əlavə edildi;
  • Emal ediləcək mənbə faylları seçmək üçün “-fprofile-filter-files” və “-fprofile-exclude-files” yeni profil seçimləri əlavə edildi;
  • AddressSanitizer yoxlanılan icra edilə bilən faylın yaddaş istehlakını azaldan avtomatik dəyişənlər üçün daha yığcam doğrulama kodunun yaradılmasını təmin edir;
  • Təkmilləşdirilmiş çıxış "-fopt-info» (əlavə optimallaşdırmalar haqqında ətraflı məlumat). Əvvəllər mövcud olan "qeyd" prefiksinə əlavə olaraq "optimallaşdırılmış" və "buraxılmış" yeni prefikslər əlavə edildi. Dövrlərin inline-açılması və vektorlaşdırılması üzrə qərarların qəbulu haqqında məlumatın əlavə çıxışı;
  • “-fsave-optimization-record” seçimi əlavə edildi, müəyyən edildikdə, GCC SRCFILE.opt-record.json.gz faylını müəyyən optimallaşdırmaların istifadəsi ilə bağlı qərarların təsviri ilə saxlayır. Yeni seçim “-fopt-info” rejimindən profil və daxili zəncirlər haqqında məlumat kimi əlavə metadata daxil etməklə fərqlənir;
  • Prosedurlararası optimallaşdırmalar zamanı statik dəyişənlər üçün yığının düzülməsinə və ünvan rejimlərinin istifadəsinə (yalnız yazı və ya oxumaq-dəqiq) nəzarət etmək üçün “-fipa-stack-alignment” və “-fipa-reference-addressable” variantları əlavə edildi;
  • Yeni daxili funksiyalar atributların bağlanmasına, eləcə də budaqların proqnozlaşdırılması və spekulyativ göstərişlərin icrasına aid davranışlara nəzarət etmək üçün təqdim olunur: "__builtin_has_atribut«,«__ehtimalla_inşa edilmiş_gözləmək"Və"__builtin_spekulyasiya_təhlükəsiz_dəyər". Funksiyalar, dəyişənlər və növlər üçün yeni atribut əlavə edildi köçürmək;
  • Fortran dili üçün asinxron giriş/çıxış üçün tam dəstək həyata keçirilib;
  • Solaris 10 (*-*-solaris2.10) və Cell/BE (Cell Broadband Engine SPU) platformalarına dəstək ləğv edilib və növbəti əsas buraxılışda silinəcək. Armv2, Armv3, Armv5 və Armv5E arxitekturalarına dəstək dayandırıldı. Intel MPX (Memory Protection Extensions) dəstəyi dayandırılıb.

Mənbə: opennet.ru

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