GCC 9 kompilaatorikomplekti väljalase

Pärast aastast arengut avaldatud tasuta kompilaatorite komplekti väljaandmine GCC 9.1, esimene suurem väljalase uues GCC 9.x harus. Kooskõlas uus skeem väljalaskenumbrid, arendusprotsessis kasutati versiooni 9.0 ning veidi enne GCC 9.1 väljaandmist oli juba hargnenud GCC 10.0 haru, mille alusel moodustuks järgmine oluline väljalase GCC 10.1.

GCC 9.1 on märkimisväärne C++17 standardi toe stabiliseerimise, tulevase C++20 standardi (koodnimega C++2a) võimaluste juurutamise jätkamise, D-keele kasutajaliidese lisamise, OpenMP 5.0 osalise toe poolest. , OpenACC 2.5 peaaegu täielik tugi, protseduuridevahelise optimeerimise ja optimeerimise mastaapsuse suurendamine sidumisetapis, diagnostikatööriistade laiendamine ja uute hoiatuste lisamine, OpenRISC, C-SKY V2 ja AMD GCN GPU taustaprogrammid.

Kõik muutused:

  • Lisatud on programmeerimiskeele D tugi. GCC sisaldab kompilaatoriga esiosa GDC (Gnu D Compiler) ja käitusaegsed teegid (libphobos), mis võimaldavad kasutada standardset GCC-d programmide koostamiseks programmeerimiskeeles D. D-keele toe lubamise protsess GCC-s on alanud aastal 2011, kuid venis edasi seoses vajadusega viia kood vastavusse GCC nõuetega ja probleemidest intellektuaalomandi õiguste üleandmisel D programmeerimiskeelt arendavale Digital Marsile;
  • Koodigeneraatorit on täiustatud. Näiteks on rakendatud erinevate strateegiate kasutamist Switchi avaldiste (hüppetabel, bititest, otsustuspuu) laiendamiseks sõltuvalt olukordadest. Lisatud on võimalus teisendada lineaarseid funktsioone, mis sisaldavad Switchi avaldist, kasutades optimeerimist "-ftree-switch-conversion" (näiteks tingimuste komplekt nagu "juhtum 2: kuidas = 205; katkestus; juhtum 3: kuidas = 305; katkestus ;” teisendatakse "100 * kuidas + 5";
  • Täiustatud protseduuridevahelised optimeerimised. Inline juurutamise sätted on kohandatud kaasaegsetele C++ koodibaasidele ja neid on laiendatud uute parameetritega max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns ja uninlined - mõtlemisaeg. Parem külma/kuuma koodi eraldamise täpsus ja agressiivsus. Täiustatud skaleeritavus väga suurte jaoks tõlkeüksused (näiteks optimeerimise rakendamisel suurte programmide linkimise etapis);
  • Täiustatud on koodi profileerimise tulemustel põhinev optimeerimismehhanism (PGO – Profile-guided optimization), mis genereerib koodi täitmise tunnuste analüüsi põhjal optimaalsema koodi. Kokkuvõtte valik "-fprofiili kasutamine" sisaldab nüüd optimeerimisrežiime "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" ja "-ftree-loop-distribution". Eemaldatud loenduritega histogrammide lisamine failidesse, mis vähendas profiilidega failide suurust (nüüd genereeritakse histogramme käigu pealt optimeerimiste tegemisel linkimise ajal);
  • Täiustatud linkimisaja optimeerimised (LTO). Enne tulemuse genereerimist pakuti tüüpide lihtsustamist, mis võimaldas oluliselt vähendada LTO objektifailide suurust, vähendada mälukulu sidumisetapis ja parandada toimingute paralleelsust. Sektsioonide (-param lto-partitions) arvu on suurendatud 32-lt 128-le, mis parandab suure arvu protsessori lõimedega süsteemide jõudlust. Optimeerimisprotsesside arvu juhtimiseks on lisatud parameeter
    "-param lto-max-streaming-parallelism";

    Selle tulemusena on GCC 8.3-ga võrreldes GCC 9-s kasutusele võetud optimeerimised lubatud lühendage Firefox 5 ja LibreOffice 66 kompileerimisaega umbes 6.2.3%. Objektifailide suurus vähenes 7%. 8-tuumalise protsessori sidumisaeg vähenes 11%. Linkimisetapi järjestikuse optimeerimise etapp on nüüd 28% kiirem ja tarbib 20% vähem mälu. LTO paralleelse etapi iga protsessori mälutarbimine vähenes 30%;

  • Suurem osa paralleelse programmeerimise spetsifikatsioonist on rakendatud C, C++ ja Fortrani keelte jaoks OpenACC 2.5, mis määratleb tööriistad GPU-de ja spetsiaalsete protsessorite (nt NVIDIA PTX) toimingute mahalaadimiseks;
  • Standardi osaline tugi on juurutatud C ja C++ jaoks Avage MP 5.0 (Open Multi-Processing), mis määratleb API ja meetodid paralleelse programmeerimise meetodite rakendamiseks C-, C++- ja Fortran-keelte jaoks mitmetuumalistes ja hübriidsüsteemides (CPU+GPU/DSP) jagatud mälu ja vektoriseerimisüksustega (SIMD) ;
  • C-keele jaoks on lisatud uued hoiatused: "-Waddress-of-packed-liikme" (joondamata osuti väärtus struktuuri või liidu pakitud liikmele) ja
    «-Absoluutväärtus" (absoluutväärtuse arvutamiseks mõeldud funktsioonidele juurdepääsul, kui määratud argumendi jaoks on sobivam funktsioon, tuleks abs(3.14) asemel kasutada näiteks fabs(3.14). C++ jaoks on lisatud uued hoiatused: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" ja "-Wclass-conversion". Paljusid varem kättesaadavaid hoiatusi on laiendatud;

  • Lisatud eksperimentaalne tugi osale tulevasest C-keelestandardist, koodnimega C2x. C2x toe lubamiseks kasutage suvandeid "-std=c2x" ja "-std=gnu2x" (GNU laienduste lubamiseks). Standard on alles arendamise varajases staadiumis, seetõttu toetatakse selle võimalustest ainult ühe argumendiga avaldist _Staatiline_väide (kahe argumendiga _Static_assert on C11-s standarditud);
  • C++17 standardi tugi on kuulutatud stabiilseks. Frontendis on C++17 keelevõimalused täielikult juurutatud ja libstdc++ puhul on standardis määratletud teegi funktsioonid peaaegu täieliku juurutuse lähedal;
  • Jätkub rakendamine tulevase C++2a standardi elemendid. Näiteks on lisatud võimalus initsialiseerimisel kaasata vahemikke, juurutatud on lambda-avaldiste laiendused, lisatud on andmestruktuuride tühjade liikmete ja tõenäoliste/ebatõenäoliste atribuutide tugi, on antud võimalus kutsuda välja virtuaalseid funktsioone tingimusavaldistes , jne.
    C++2a toe lubamiseks kasutage suvandeid "-std=c++2a" ja "-std=gnu++2a". Biti- ja versioonipäise failid on lisatud libstdc++ jaoks C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible ja std::type_identity traits, stdstd::midlerpoint, stdstd::midlerpoint , std::bind_front,
    std::visit, std::on_constant_evaluated ja std::sume_aligned, lisati char8_t tüübi tugi, rakendati võimalus kontrollida stringide eesliidet ja järelliidet (algab_koos, lõpeb_koos);

  • Lisatud on uute ARM-protsessorite tugi
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE ja Neoverse N1. Lisatud on Armv8.3-A-s kasutusele võetud juhiste tugi kompleksarvudega töötamiseks, pseudojuhuslike arvude genereerimine (rng) ja mälumärgistamine (memtag), samuti juhised rünnakute blokeerimiseks, mis on seotud haru ennustusüksuse spekulatiivse täitmise ja toimimisega. . AArch64 arhitektuuri jaoks on lisatud kaitserežiim virna ja kuhja ristumiskohad (“-fstack-clash-protection”). Armv8.5-A arhitektuuri võimaluste kasutamiseks on lisatud valik “-march=armv8.5-a”

  • See sisaldab taustaprogrammi GCN-i mikroarhitektuuril põhinevate AMD GPU-de jaoks koodi genereerimiseks. Rakendamine piirdub praegu ühe lõimega rakenduste kompileerimisega (hiljem pakutakse toetust OpenMP ja OpenACC kaudu mitme lõimega arvutuste tegemiseks) ning GPU Fiji ja Vega 10 toega;
  • Lisatud uus taustaprogramm protsessoritele OpenRISC;
  • Lisatud protsessorite taustaprogramm C-SKY V2, mida toodab samanimeline Hiina ettevõte erinevatele tarbeseadmetele;
  • Kõik käsurea valikud, mis käitavad baitide väärtusi, toetavad järelliiteid kb, KiB, MB, MiB, GB ja GiB;
  • Rakendatud valik "-flive-patching=[inline-only-static|inline-clone]" võimaldab teil saavutada reaalajas patchingu süsteemide jaoks ohutu kompileerimise tänu mitmetasandilisele kontrollile protseduuridevahelise (IPA) optimeerimised;
  • Lisatud suvand "--completion" suvandi lõpetamise täpseks juhtimiseks bashi kasutamisel;
  • Diagnostikatööriistad pakuvad lähteteksti väljavõtete kuvamist, mis näitavad rea numbrit ja märgivad visuaalselt seotud teavet, näiteks operandi tüüpe. Reanumbrite ja siltide kuvamise keelamiseks pakutakse valikuid “-fno-diagnostics-show-line-numbers” ja “-fno-diagnostics-show-labels”;

    GCC 9 kompilaatorikomplekti väljalase

  • Laiendatud vahendid vigade diagnoosimiseks C++ koodis, vigade põhjuste info parem loetavus ja probleemsete parameetrite esiletõstmine;

    GCC 9 kompilaatorikomplekti väljalase

  • Lisatud valik “-fdiagnostics-format=json”, mis võimaldab genereerida diagnostikaväljundit masinloetavas vormingus (JSON);
  • Töödeldavate lähtefailide valimiseks on lisatud uued profileerimissuvandid “-fprofile-filter-files” ja “-fprofile-exclude-files”;
  • AddressSanitizer pakub automaatsete muutujate jaoks kompaktsema kinnituskoodi genereerimist, mis vähendab kontrollitava täitmisfaili mälutarbimist;
  • Täiustatud väljund rakenduses "-fopt-info» (üksikasjalik teave lisatud optimeerimiste kohta). Lisatud uued eesliited "optimeeritud" ja "vastamata", lisaks varem saadaval olnud eesliitele "märkus". Lisatud teabe väljund otsuste tegemise kohta tsüklite sisemise lahtivoltimise ja vektoriseerimise kohta;
  • Lisatud suvand „-fsave-optimization-record”, kui see on määratud, salvestab GCC faili SRCFILE.opt-record.json.gz koos teatud optimeerimiste kasutamise otsuste kirjeldusega. Uus valik erineb režiimist "-fopt-info", lisades täiendavaid metaandmeid, näiteks teavet profiili ja sisemiste kettide kohta;
  • Lisatud valikud "-fipa-stack-alignment" ja "-fipa-reference-addressable", et juhtida virna joondust ja adresseerimisrežiimide (ainult kirjutamine või lugemiseks täpne) kasutamist staatiliste muutujate jaoks protseduuridevahelise optimeerimise ajal;
  • Kasutusele on võetud uued sisseehitatud funktsioonid, mis kontrollivad atribuutide sidumist ning haru ennustamise ja spekulatiivse käsu täitmisega seotud käitumist: "__builtin_has_attribute","__ehitatud_oodata_tõenäosusega"Ja"__builtin_speculation_safe_value". Funktsioonide, muutujate ja tüüpide jaoks on lisatud uus atribuut koopia;
  • Fortrani keele jaoks on rakendatud asünkroonse sisendi/väljundi täielik tugi;
  • Solaris 10 (*-*-solaris2.10) ja Cell/BE (Cell Broadband Engine SPU) platvormide tugi on aegunud ja see eemaldatakse järgmises suuremas versioonis. Armv2, Armv3, Armv5 ja Armv5E arhitektuuride tugi on lõpetatud. Intel MPX (Memory Protection Extensions) tugi on lõpetatud.

Allikas: opennet.ru

Lisa kommentaar