Lëshimi i paketës së kompilatorëve GCC 9

Pas një vit zhvillimi është publikuar lëshimi i një grupi të lirë të kompilerëve GCC 9.1, publikimi i parë i rëndësishëm në degën e re GCC 9.x. Sipas skemën e re numrimit të versioneve, versioni 9.0 u përdor në procesin e zhvillimit, dhe pak para lancimit GCC 9.1 tashmë u ndan në degën GCC 10.0, mbi bazën e të cilës do të formohet publikuar i ardhshëm i rëndësishëm GCC 10.1.

GCC 9.1 është i njohur për stabilizimin e mbështetjes për standardin C++17, vazhdimin e zbatimit të mundësive të standardit të ardhshëm C++20 (emri kodor C++2a), përfshirjen e front-end-it për gjuhën D, mbështetje të pjesshme për OpenMP 5.0, mbështetje gati të plotë për OpenACC 2.5, rritjen e qëndrueshmërisë së optimizimeve ndër-procedurale dhe optimizimeve në fazën e lidhjes, zgjerimin e mjeteve të diagnostikimit dhe shtimin e paralajmërimeve të reja, për backend për OpenRISC, C-SKY V2 dhe AMD GCN GPU.

Ndryshimet kryesore :

  • Shtuar mbështetje për gjuhën programuese D. Në përbërjen kryesore të GCC janë përfshirë front-end me kompilatorin GDC (Kompozitori D i GNU) dhe bibliotekat runtime (libphobos), të cilat lejojnë përdorimin e GCC për të ndërtuar programe në gjuhën programuese D. Procesi i përfshirjes së mbështetjes për gjuhën D në GCC ka filluar në vitin 2011, por ka vonuar për shkak të nevojës për të përshtatur kodin në përputhje me kërkesat e GCC dhe problemeve me transferimin e të drejtave të pronës intelektuale nga kompania Digital Mars, e cila zhvillon gjuhën programuese D;
  • Janë bërë përmirësime në gjeneratën e kodit. Për shembull, janë zbatuar strategji të ndryshme për ekspozimin e shprehjeve Switch (tabela e skakave, testi i bitëve, druri i vendimeve) në varësi të situatave. Shtuar mundësinë e transformimit të funksioneve lineare, që përfshijnë shprehjen Switch, duke përdorur optimizimin "-ftree-switch-conversion" (për shembull, grupi i kushteve "case 2: how = 205; break; case 3: how = 305; break;" do të transformohet në "100 * how + 5";
  • Janë përmirësuar optimizimet ndër-procedurale. Cilësimet e efekteve të inline janë adapatuar për bazat e kodit moderne në C++ dhe janë zgjeruar me parametra të rinj max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns dhe uninlined-thunk-time. Është rritur saktësia dhe agresiviteti në ndarjen e kodit "të ftohtë" dhe "të nxehtë". Janë përmirësuar qëndrueshmëria për njësitë shumë të mëdha të përkthimit (për shembull, kur aplikohet optimizimi gjatë fazës së lidhjes për programe të mëdha); Janë përmirësuar mekanizmat e optimizimit të bazuar në rezultatet e profilizimit të kodit (PGO — Optimizimi i udhëhequr nga profilizimi), i cili krijon kod më optimal në bazë të analizës së veçorive të ekzekutimit të kodit. Opcioni përmbledhës "
  • Улучшен механизм оптимизации на основе результатов профилирования кода (PGO — Profile-guided optimization), который генерирует более оптимальный код на основе анализа особенностей выполнения кода. Сводная опция «-fprofile-use" tani përfshin modet e optimizimit "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" dhe "-ftree-loop-distribution". Është hequr përfshirja në skedarët e histogramit me numruesit, që ka lejuar të zvogëlohet madhësia e skedarëve të profileve (histogramet tani gjenerohen në flakë gjatë optimizimeve gjatë lidhjes);
  • Janë zgjeruar optimizimet gjatë lidhjes (LTO). Është siguruar thjeshtimi i tipeve para gjenerimit të rezultatit, që ka lejuar të zvogëlohet ndjeshëm madhësia e skedarëve objekt LTO, të ulet konsumimi i memories gjatë lidhjes dhe të përmirësohet përshtatshmëria e operacioneve. Numri i pjesëve (—param lto-partitions) është rritur nga 32 në 128, që ka rritur efikasitetin e punës në sisteme me një numër të madh rrjedhash në CPU. Për të menaxhuar numrin e proceseve të optimizuesit është shtuar parameteri
    «—param lto-max-streaming-parallelism»;

    Si rezultat, krahasuar me GCC 8.3, optimizimet e realizuara në GCC 9 lejuan kanë reduktuar rreth 5% kohën e kompilimit të Firefox 66 dhe LibreOffice 6.2.3. Madhësia e skedarëve objekt ka rënë me 7%. Kohëzgjatja e lidhjes në CPU me 8 bërthama ka rënë me 11%. Faza sekondare e optimizimit gjatë lidhjes tani kryhet 28% më shpejt dhe konsumon 20% më pak memorie. Konsumi i memories për çdo trajtues të fazës LTO të përshtatur është reduktuar me 30%;

  • Për gjuhët C, C++ dhe Fortran është realizuar pjesa më e madhe e specifikimeve të programimit paralel OpenACC 2.5, që përcakton mjetet për transferimin e operacioneve (offloading) në GPU dhe procesorë të specializuar, siç është NVIDIA PTX;
  • Për C dhe C++ është realizuar mbështetje e pjesshme për standardin OpenMP 5.0 (Open Multi-Processing), që përcakton API dhe mënyrat e zbatimit të metodave të programimit paralel për gjuhët C, C++ dhe Fortran në sisteme me shumë bërthama dhe hibride (CPU+GPU/DSP) me memorie të përbashkët dhe blloqe vektorizimi (SIMD);
  • Për gjuhën C janë shtuar paralajmërime të reja: "-Waddress-of-packed-member" (vlera e paaventuar e treguesit në një element të paketuar të strukturës ose unionit) dhe
    «-Wabsolute-value" (kur i qasemi funksioneve të llogaritjes së vlerës absolute, nëse për argumentin e dhënë ka një funksion më të përshtatshëm, p.sh., në vend të abs(3.14) duhet përdorur fabs(3.14)). Për C++ janë shtuar paralajmërime të reja: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" dhe "-Wclass-conversion". Janë zgjeruar shumë paralajmërime të mëparshme;
  • Shto u shtua mbështetje eksperimentale për një pjesë të standardit të ardhshëm të gjuhës C, duke u zhvilluar nën emrin kodor C2x. Për të aktivizuar mbështetje C2x, duhet të përdorni opsionet "-std=c2x" dhe "-std=gnu2x" (për të aktivizuar zgjerimet GNU). Standarti është ende në fazë të hershme zhvillimi, prandaj nga funksionalitetet e tij mbështetet vetëm shprehja _Static_assert me një argument (_Static_assert me dy argumente është standardizuar në C11);
  • Është shpallur mbështetje stabile për standardin C++17. Në frontend, mundësitë gjuhësore të C++17 janë realizuar plotësisht, ndërsa në libstdc++ funksionet bibliotekore të përcaktuara në standard janë afër realizimit të plotë;
  • Vazhduar implementimi elementeve të standardit të ardhshëm C++2a. Për shembull, është shtuar mundësia e përfshirjes së vargjeve gjatë inicializimit, janë realizuar zgjerime për shprehjet lambda, është shtuar mbështetje për anëtarët bosh të strukturave të dhënave dhe atributet likely/unlikely, si dhe është siguruar mundësia e thirrjes së funksioneve virtuale në shprehjet kushtore, e kështu me radhë.
    Për të aktivizuar mbështetje C++2a, duhet të përdorni opsionet "-std=c++2a" dhe "-std=gnu++2a". Në libstdc++ për C++2a janë shtuar skedarë tituj bit dhe version, tipazhe std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible dhe std::type_identity, funksionet std::midpoint, std::lerp, std::bind_front,
    std::visit, std::is_constant_evaluated dhe std::assume_aligned, është shtuar mbështetje për tipin char8_t, është realizuar mundësia e kontrollit të parafjalëve dhe pasfjalëve të vargjeve (starts_with, ends_with);
  • Është shtuar mbështetje për procesorët e rinj ARM
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE dhe Neoverse N1. Është shtuar mbështetje për instruksionet e reja të shfaqura në Armv8.3-A për punë me numra kompleksë, gjenerimin e numrave të rastësishëm (rng) dhe etiketimin e memories (memtag), si dhe instruksionet për bllokimin e sulmeve të lidhura me ekzekutimin spekullativ dhe funksionin e bllokut të parashikimit të kalimeve. Për arkitekturën AArch64 është shtuar një mod i mbrojtjes nga përplasjeve të stacks dhe heaps ("-fstack-clash-protection"). Për të përdorur karakteristikat e arkitekturës Armv8.5-A është shtuar opsioni "-march=armv8.5-a"
  • Në paketë është përfshirë një backend për gjenerimin e kodit për GPU AMD të bazuar në mikroarkitekturën GCN. Realizimi është ende i kufizuar në kompilimin e aplikacioneve me një thread (mbështetje për daljen e llogaritjeve me shumë thread përmes OpenMP dhe OpenACC do të ofrohet më vonë) dhe mbështetje për GPU Fiji dhe Vega 10;
  • Është shtuar backend i ri për procesorët OpenRISC;
  • Është shtuar backend për procesorët C-SKY V2, të prodhuara nga kompania kineze me të njëjtin emër për pajisje të ndryshme për konsumatorët;
  • Në të gjitha opsionet e linjës së komandës që operojnë me vlera byte, është siguruar mbështetje për sufikset kb, KiB, MB, MiB, GB dhe GiB;
  • Implementuar opsioni "-flive-patching=[inline-only-static|inline-clone]", i cili lejon arritjen e kompilimit të sigurt për sistemet e aplikacioneve të nxehta (live-patching) përmes menaxhimit të shumëfishtë të aplikimit të optimizimeve ndërproçedurale (IPA) optimizimeve;
  • Është shtuar opsioni "—completion" për menaxhim të hollësishëm të autokompletimeve të opsioneve gjatë përdorimit të bash;
  • Në mjetet e diagnostikës është siguruar shfaqja e fragmenteve të teksteve burimore me tregimin e numrit të rreshtit dhe me një shënim të dukshëm të informacionit përkatës, siç janë llojet e operandëve. Për të çaktivizuar shfaqjen e numrave të rreshtave dhe etiketave janë parashikuar opsionet "-fno-diagnostics-show-line-numbers" dhe "-fno-diagnostics-show-labels";

    Lëshimi i paketës së kompilatorëve GCC 9
  • Janë zgjeruar mjete për diagnostikimin e gabimeve në kodin C++, është përmirësuar lexueshmëria e informacionit mbi shkaqet e gabimeve dhe nënvizimi i parametrave problematikë;

    Lëshimi i paketës së kompilatorëve GCC 9
  • Është shtuar opsioni "-fdiagnostics-format=json", i cili lejon formimin e daljes diagnostike në formatikë që mund të lexohen nga makina (JSON);
  • Janë shtuar opsione të reja të profilizimit "-fprofile-filter-files" dhe "-fprofile-exclude-files" për të zgjedhur skedarët e përpunuar me tekste burimore;
  • Në AddressSanitizer është siguruar gjenerimi i kodit të kontrollit më kompakt për variablat automatike, që ka lejuar uljen e konsumit të memories nga skedari ekzekutiv i kontrolluar;
  • Është përmirësuar dalja në modin "-fopt-info" (detalizimi i informacionit për optimizimet e reja të shtuar). Janë shtuar prefikset e reja "optimized" dhe "missed", përveç prefiksit të mëparshëm "note". Është shtuar dalja e informacionit mbi marrjen e vendimit për zhvillimin inline dhe vektorizimin e cikleve;
  • Është shtuar opsioni "-fsave-optimization-record", me caktimin e të cilit GCC ruan skedarin SRCFILE.opt-record.json.gz me përshkrimin e vendimeve mbi aplikimin e optimizimeve të ndryshme. Nga moda "-fopt-info", opsioni i ri përmban metadata të tjera të dukshme, si informacion mbi profilin dhe zinxhirët inline;
  • Janë paraqitur funksione të reja të integruara për menaxhimin e lidhjes për atributet, si dhe për sjelljen e lidhur me parashikimin e kalimeve dhe ekzekutimin spekullativ të instruksioneve: "
  • Представлены новые встроенные функции для управления привязкой атрибутов, а также поведением, связанным с предсказанием переходов и спекулятивным выполнением инструкций: «__builtin_has_attribute«, «__builtin_expect_with_probability" dhe "__builtin_speculation_safe_value«. Për funksionet, variablat dhe llojet është shtuar një atribut i ri copy;
  • Për gjuhën Fortran është implementuar mbështetje e plotë për input/imet asinkron.
  • Mbështetja për platformat Solaris 10 (*-*-solaris2.10) dhe Cell/B.E (Cell Broadband Engine SPU) është shpallur e vjetruar dhe do të hiqet në versionin e ardhshëm të rëndësishëm. Është ndërprerë mbështetja për architekturën Armv2, Armv3, Armv5 dhe Armv5E. Është ndërprerë mbështetja për zgjerimin Intel MPX (Memory Protection Extensions).

Burimi: opennet.ru

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster