A GCC 9 fordítócsomag kiadása

Egy év fejlesztés után közzétett ingyenes fordítókészlet kiadása GCC 9.1, az első jelentős kiadás az új GCC 9.x ágban. Vminek megfelelően új rendszer kiadási számokat, a 9.0-s verziót használták a fejlesztési folyamatban, és nem sokkal a GCC 9.1 megjelenése előtt már elágazódtak a GCC 10.0-s ágak, amelyek alapján a következő jelentős kiadás, a GCC 10.1 jön létre.

A GCC 9.1 figyelemre méltó a C++17 szabvány támogatásának stabilizálása, a jövőbeni C++20 szabvány képességeinek megvalósítása (C++2a kódnéven), a D nyelv beépítése a frontendbe, az OpenMP 5.0 részleges támogatása , az OpenACC 2.5 szinte teljes támogatása, az eljárások közötti optimalizálás és optimalizálás skálázhatóságának növelése a kötési szakaszban, a diagnosztikai eszközök bővítése és új figyelmeztetések, háttérrendszerek hozzáadása az OpenRISC, C-SKY V2 és AMD GCN GPU számára.

A főbb változások:

  • Hozzáadott támogatás a D programozási nyelvhez. A GCC tartalmaz egy frontendet fordítóval GDC (Gnu D Compiler) és futásidejű könyvtárak (libphobos), amelyek lehetővé teszik a szabványos GCC használatát a D programozási nyelvű programok létrehozásához. A D nyelv támogatásának engedélyezése a GCC-ben elkezdődött még 2011-ben, de elhúzódott amiatt, hogy a kódot összhangba kell hozni a GCC-követelményekkel, és problémák merültek fel a szellemi tulajdonjogoknak a D programozási nyelvet fejlesztő Digital Mars számára történő átruházásával kapcsolatban;
  • Fejlesztések történtek a kódgenerátoron. Például különböző stratégiákat alkalmaztak a Switch kifejezések (ugrótábla, bitteszt, döntési fa) helyzettől függően történő bővítésére. Hozzáadtuk az olyan lineáris függvények átalakításának lehetőségét, amelyek Switch kifejezést tartalmaznak a „-ftree-switch-conversion” optimalizálás segítségével (például olyan feltételek halmaza, mint „2. eset: hogyan = 205; break; 3. eset: hogyan = 305; break ;” a következőre lesz konvertálva: „100 * hogyan + 5”;
  • Továbbfejlesztett eljárások közötti optimalizálás. A beépített telepítési beállításokat a modern C++ kódbázisokhoz igazították, és új paraméterekkel bővítették: max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns és uninlined -thunk-time. Fokozott pontosság és agresszivitás a hideg/meleg kódok szétválasztásánál. Továbbfejlesztett méretezhetőség nagyon nagy méretekhez fordítási egységek (például az optimalizálás alkalmazásakor a nagy programok összekapcsolási szakaszában);
  • A kódprofilozás eredményein alapuló optimalizálási mechanizmus (PGO - Profile-guided optimization) továbbfejlesztésre került, amely a kódvégrehajtás jellemzőinek elemzése alapján optimálisabb kódot generál. Összefoglaló opció "-fprofile-használatA " mostantól tartalmazza a "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" és "-ftree-loop-distribution" optimalizálási módokat. Eltávolítottuk a számlálókkal ellátott hisztogramok fájlokban való szerepeltetését, ami csökkentette a profilokat tartalmazó fájlok méretét (a hisztogramok immár menet közben jönnek létre a linkelés során végzett optimalizálás során);
  • Továbbfejlesztett összekapcsolási idő optimalizálás (LTO). Az eredmény generálása előtt a típusok egyszerűsítését biztosítottuk, ami lehetővé tette az LTO objektumfájlok méretének jelentős csökkentését, a memóriafelhasználás csökkentését a kötési szakaszban, valamint a műveletek párhuzamosításának javítását. A partíciók (-param lto-partitions) száma 32-ről 128-ra nőtt, ami javítja a teljesítményt a nagyszámú CPU-szálat tartalmazó rendszereken. Egy paraméter került hozzáadásra az optimalizáló folyamatok számának szabályozására
    "-param lto-max-streaming-parallelism";

    Ennek eredményeként a GCC 8.3-hoz képest a GCC 9-ben bevezetett optimalizálás megengedett csökkentse a Firefox 5 és a LibreOffice 66 fordítási idejét körülbelül 6.2.3%-kal. Az objektumfájlok mérete 7%-kal csökkent. A kötési idő egy 8 magos CPU-n 11%-kal csökkent. Az összekapcsolási szakasz szekvenciális optimalizálási szakasza most 28%-kal gyorsabb, és 20%-kal kevesebb memóriát fogyaszt. Az LTO párhuzamosított szakaszának minden processzorának memóriafogyasztása 30%-kal csökkent;

  • A legtöbb párhuzamos programozási specifikáció C, C++ és Fortran nyelvekre van implementálva OpenACC 2.5, amely eszközöket határoz meg a GPU-kon és speciális processzorokon, például az NVIDIA PTX-en végzett műveletek tehermentesítéséhez;
  • A szabvány részleges támogatása megtörtént C és C++ nyelven Nyissa meg az MP 5.0-t (Open Multi-Processing), amely meghatározza az API-t és a párhuzamos programozási módszerek alkalmazási módszereit C, C++ és Fortran nyelvekhez többmagos és hibrid (CPU+GPU/DSP) rendszereken megosztott memóriával és vektorizációs egységekkel (SIMD) ;
  • Új figyelmeztetések kerültek hozzáadásra a C nyelvhez: "-Csomagolt tag vattája" (igazítás nélküli mutatóérték egy struktúra vagy unió csomagolt tagjára) és
    «-Abszolút érték" (abszolút érték kiszámítására szolgáló függvények elérésekor, ha van megfelelőbb függvény a megadott argumentumhoz, például az abs(3.14) helyett a fabs(3.14)-et kell használni. Új figyelmeztetések hozzáadva a C++-hoz: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" és "-Wclass-conversion". Számos korábban elérhető figyelmeztetés kibővült;

  • Kísérleti támogatás hozzáadva a jövőbeli C nyelvi szabvány egy részének, a C2x kódnéven. A C2x támogatás engedélyezéséhez használja a "-std=c2x" és a "-std=gnu2x" opciókat (a GNU kiterjesztések engedélyezéséhez). A szabvány még a fejlesztés korai szakaszában van, ezért képességei közül csak az egy argumentummal rendelkező _Static_assert kifejezés támogatott (a _Static_assert két argumentummal szabványosított a C11-ben);
  • A C++17 szabvány támogatását stabilnak nyilvánították. A frontendben a C++17 nyelvi képességei maradéktalanul implementáltak, a libstdc++-ban pedig a szabványban definiált könyvtári funkciók közel állnak a teljes megvalósításhoz;
  • Folytatás végrehajtás a jövőbeli C++2a szabvány elemei. Például hozzáadásra került az inicializálás során a tartományok felvételének képessége, a lambda-kifejezések kiterjesztése, az adatszerkezetek üres tagjainak és a valószínű/valószínűtlen attribútumok támogatása, valamint a virtuális függvények feltételes kifejezésekben való meghívása. stb.
    A C++2a támogatás engedélyezéséhez használja a „-std=c++2a” és „-std=gnu++2a” opciókat. Bit- és verziófejléc-fájlok hozzáadva a libstdc++-hoz C++2a-hoz, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible és std::type_identity traits, stdstd::midlerpoint, function , std::bind_front,
    std::visit, std::is_constant_evaluated és std::assume_aligned, hozzáadta a char8_t típus támogatását, lehetővé tette a karakterláncok elő- és utótagjának ellenőrzését (kezdődik_vel, ends_with);

  • Támogatás hozzáadva az új ARM processzorokhoz
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE és Neoverse N1. Az Armv8.3-A-ban bevezetett utasítások támogatása komplex számokkal, pszeudo-véletlen számgenerálás (rng) és memóriacímkézés (memtag), valamint az elágazás előrejelző egység spekulatív végrehajtásával és működésével kapcsolatos támadások blokkolására vonatkozó utasítások támogatása. . Az AArch64 architektúrához egy védelmi mód került hozzáadásra verem és kupac metszéspontjai („-fstack-clash-protection”). Az Armv8.5-A architektúra szolgáltatásainak használatához a „-march=armv8.5-a” opció hozzáadásra került

  • Tartalmaz egy háttérprogramot az AMD GPU-k kódjának generálásához a GCN mikroarchitektúrán. A megvalósítás jelenleg az egyszálú alkalmazások összeállítására korlátozódik (az OpenMP-n és OpenACC-n keresztüli többszálas számítások végrehajtásának támogatása később lesz elérhető), valamint a GPU Fiji és Vega 10 támogatására;
  • Új háttérrendszer hozzáadva a processzorokhoz OpenRISC;
  • Hozzáadott háttérrendszer a processzorokhoz C-SKY V2, amelyet az azonos nevű kínai cég gyártott különféle fogyasztói eszközökhöz;
  • Minden bájtértékeket működtető parancssori opció támogatja a kb, KiB, MB, MiB, GB és GiB utótagokat;
  • Megvalósítva a „-flive-patching=[inline-only-static|inline-klón]” opció lehetővé teszi az élő javítórendszerek biztonságos fordítását az interprocedurális (IPA) optimalizálás;
  • Hozzáadott "--completion" opció az opció befejezésének finomszemcsés szabályozásához bash használatakor;
  • A diagnosztikai eszközök megjelenítik a forrásszöveg-kivonatokat, amelyek jelzik a sorszámot, és vizuálisan megjelölik a kapcsolódó információkat, például az operandustípusokat. A sorszámok és címkék megjelenítésének letiltásához az „-fno-diagnostics-show-line-numbers” és „-fno-diagnostics-show-labels” opciók állnak rendelkezésre;

    A GCC 9 fordítócsomag kiadása

  • Kiterjesztett eszközök a C++ kód hibáinak diagnosztizálására, a hibák okaira vonatkozó információk jobb olvashatósága és a problémás paraméterek kiemelése;

    A GCC 9 fordítócsomag kiadása

  • Hozzáadott „-fdiagnostics-format=json” opció, amely lehetővé teszi a diagnosztikai kimenet generálását géppel olvasható formátumban (JSON);
  • Új profilozási beállítások: „-fprofile-filter-files” és „-fprofile-exclude-files” a feldolgozandó forrásfájlok kiválasztásához;
  • Az AddressSanitizer kompaktabb ellenőrző kódot biztosít az automatikus változókhoz, ami csökkenti az ellenőrzött futtatható fájl memóriafelhasználását;
  • Továbbfejlesztett kimenet a "-fopt-info» (részletes információ a hozzáadott optimalizálásokról). Új „optimalizált” és „kihagyott” előtagok hozzáadva a korábban elérhető „megjegyzés” előtag mellett. Hozzáadott információ a döntéshozatalról a ciklusok soron belüli kibontásával és vektorizálásával kapcsolatban;
  • Az „-fsave-optimization-record” opció hozzáadásával, ha megadja, a GCC elmenti az SRCFILE.opt-record.json.gz fájlt bizonyos optimalizációk használatára vonatkozó döntések leírásával. Az új opció eltér a „-fopt-info” módtól azáltal, hogy további metaadatokat tartalmaz, például információkat a profilról és a beágyazott láncokról;
  • Hozzáadott „-fipa-stack-alignment” és „-fipa-reference-addressable” opciók a verem igazításának és a címzési módok (csak írható vagy olvasási pontos) használatának szabályozásához a statikus változókhoz az eljárások közötti optimalizálás során;
  • Új beépített függvények kerülnek bevezetésre az attribútum-összerendelés, valamint az elágazás előrejelzésével és a spekulatív utasítás-végrehajtással kapcsolatos viselkedés szabályozására: "__builtin_has_attribute""__beépítve_várható_valószínűséggel"És"__builtin_speculation_safe_value". Új attribútum került hozzáadásra a függvényekhez, változókhoz és típusokhoz másolat;
  • Az aszinkron bemenet/kimenet teljes támogatása megvalósult a Fortran nyelven;
  • A Solaris 10 (*-*-solaris2.10) és a Cell/BE (Cell Broadband Engine SPU) platformok támogatása elavult, és a következő nagyobb kiadásban megszűnik. Az Armv2, Armv3, Armv5 és Armv5E architektúrák támogatása megszűnt. Az Intel MPX (Memory Protection Extensions) támogatása megszűnt.

Forrás: opennet.ru

Hozzászólás