Pas një vit zhvillimi lëshimi i një grupi të lirë të kompilerëve , publikimi i parë i rëndësishëm në degën e re GCC 9.x. Sipas 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 (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 në vitin 2011, por 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 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), который генерирует более оптимальный код на основе анализа особенностей выполнения кода. Сводная опция «" 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 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 , 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 (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: "" (vlera e paaventuar e treguesit në një element të paketuar të strukturës ose unionit) dhe
«" (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 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 ("-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 ;
- Është shtuar backend për procesorët , 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;
- 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 () 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";
- 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ë;

- Ë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 "" (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: "
- Представлены новые встроенные функции для управления привязкой атрибутов, а также поведением, связанным с предсказанием переходов и спекулятивным выполнением инструкций: ««, «" dhe "«. Për funksionet, variablat dhe llojet është shtuar një atribut i ri ;
- 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

