GCC 9 կոմպիլյատորների փաթեթի թողարկում

Մեկ տարի զարգացումից հետո հրատարակված կոմպիլյատորների անվճար հավաքածուի թողարկում GCC 9.1, առաջին խոշոր թողարկումը նոր GCC 9.x մասնաճյուղում: Համաձայն նոր սխեմա թողարկման համարները, 9.0 տարբերակը օգտագործվել է զարգացման գործընթացում, և GCC 9.1-ի թողարկումից քիչ առաջ GCC 10.0 մասնաճյուղն արդեն ճյուղավորվել էր, որի հիման վրա կձևավորվեր հաջորդ նշանակալի թողարկումը՝ GCC 10.1։

GCC 9.1-ը նշանավորվում է C++17 ստանդարտի աջակցության կայունացմամբ, շարունակելով ապագա C++20 ստանդարտի հնարավորությունների ներդրումը (կոդավորմամբ C++2a), D լեզվի ճակատային մասում ներառված, OpenMP 5.0-ի մասնակի աջակցություն: , OpenACC 2.5-ի գրեթե ամբողջական աջակցություն, կապի փուլում միջընթացակարգային օպտիմալացումների և օպտիմալացումների մասշտաբայնության բարձրացում, ախտորոշիչ գործիքների ընդլայնում և նոր զգուշացումների ավելացում, OpenRISC-ի, C-SKY V2-ի և AMD GCN GPU-ի համար նախատեսված backends:

Հիմնական փոփոխություններ:

  • Ավելացվեց D ծրագրավորման լեզվի աջակցությունը: GCC-ն ներառում է կոմպիլյատորով ճակատ GDC (Gnu D Compiler) և աշխատաժամանակի գրադարաններ (libphobos), որոնք թույլ են տալիս օգտագործել ստանդարտ GCC՝ D ծրագրավորման լեզվով ծրագրեր ստեղծելու համար: GCC-ում D լեզվի աջակցությունը միացնելու գործընթացը սկսվեց դեռ 2011թ., բայց ձգվել է ծածկագիրը GCC-ի պահանջներին համապատասխանեցնելու անհրաժեշտության և մտավոր սեփականության իրավունքների փոխանցման հետ կապված խնդիրների պատճառով Digital Mars-ին, որը մշակում է D ծրագրավորման լեզուն.
  • Կոդերի գեներատորում բարելավումներ են կատարվել: Օրինակ, իրականացվել է Switch արտահայտությունների ընդլայնման տարբեր ռազմավարությունների օգտագործումը (ցատկման աղյուսակ, բիթերի թեստ, որոշումների ծառ) կախված իրավիճակներից: Ավելացվել է գծային ֆունկցիաները փոխակերպելու հնարավորություն, որոնք ներառում են Switch արտահայտություն՝ օգտագործելով «-ftree-switch-conversion» օպտիմալացումը (օրինակ՝ պայմանների մի շարք, ինչպիսին է «case 2: how = 205; break; case 3: how = 305; break ;» կվերածվի «100 * ինչպես + 5»;
  • Բարելավված միջգործընթացային օպտիմալացումներ: Ներկառուցված տեղակայման կարգավորումները հարմարեցվել են ժամանակակից C++ կոդերի բազաների համար և ընդլայնվել նոր պարամետրերով՝ max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns և uninlined: - մտածողության ժամանակ: Սառը/տաք կոդի բաժանման բարելավված ճշգրտությունը և ագրեսիվությունը: Բարելավված մասշտաբայնություն շատ մեծերի համար թարգմանչական միավորներ (օրինակ, խոշոր ծրագրերին միացման փուլում օպտիմալացում կիրառելիս);
  • Կոդերի պրոֆիլավորման արդյունքների վրա հիմնված օպտիմալացման մեխանիզմը (PGO - Profile-guided optimization) բարելավվել է, որն ավելի օպտիմալ կոդ է ստեղծում՝ հիմնված կոդի կատարման բնութագրերի վերլուծության վրա: Ամփոփման տարբերակ»-fprofile-օգտագործումԱյժմ ներառում է օպտիմալացման ռեժիմները «-fversion-loops-for-strides», «-floop-interchange», «-floop-unroll-and-jam» և «-ftree-loop-distribution»: Հեռացվել է ֆայլերում հաշվիչներ ունեցող հիստոգրամների ընդգրկումը, ինչը նվազեցրել է պրոֆիլներով ֆայլերի չափը (հիստոգրամներն այժմ ստեղծվում են անմիջապես՝ կապելու ժամանակ օպտիմալացումներ կատարելիս);
  • Ընդլայնված կապի ժամանակի օպտիմալացումներ (LTO): Արդյունք ստեղծելուց առաջ տրամադրվել է տեսակների պարզեցում, ինչը հնարավորություն է տվել զգալիորեն նվազեցնել LTO օբյեկտների ֆայլերի չափը, նվազեցնել հիշողության սպառումը պարտադիր փուլում և բարելավել գործողությունների զուգահեռացումը: Բաժանմունքների թիվը (-param lto-partitions) ավելացվել է 32-ից 128-ի, ինչը բարելավում է աշխատանքը մեծ թվով պրոցեսորային թելեր ունեցող համակարգերում: Ավելացվել է պարամետր՝ օպտիմալացնող գործընթացների քանակը վերահսկելու համար
    «-param lto-max-streaming-parallelism»;

    Արդյունքում, GCC 8.3-ի համեմատ, GCC 9-ում ներդրված օպտիմալացումները թույլատրվում է կրճատել Firefox 5-ի և LibreOffice 66-ի կազմման ժամանակը մոտ 6.2.3%-ով: Օբյեկտային ֆայլերի չափը նվազել է 7%-ով։ 8 միջուկանի պրոցեսորի վրա կապելու ժամանակը նվազել է 11%-ով: Կապակցման փուլի հաջորդական օպտիմալացման փուլն այժմ 28%-ով ավելի արագ է և 20%-ով քիչ հիշողություն է սպառում: LTO-ի զուգահեռացված փուլի յուրաքանչյուր պրոցեսորի հիշողության սպառումը նվազել է 30%-ով;

  • Զուգահեռ ծրագրավորման բնութագրերի մեծ մասն իրականացվում է C, C++ և Fortran լեզուների համար OpenACC 2.5, որը սահմանում է GPU-ների և մասնագիտացված պրոցեսորների վրա գործառնությունների բեռնաթափման գործիքներ, ինչպիսիք են NVIDIA PTX;
  • Ստանդարտի մասնակի աջակցությունն իրականացվել է C-ի և C++-ի համար Բացեք MP 5.0-ը (Open Multi-Processing), որը սահմանում է API-ն և զուգահեռ ծրագրավորման մեթոդները C, C++ և Fortran լեզուների համար բազմամիջուկային և հիբրիդային (CPU+GPU/DSP) համակարգերում՝ ընդհանուր հիշողության և վեկտորացման միավորներով (SIMD) ;
  • Նոր նախազգուշացումներ են ավելացվել C լեզվի համար.-Փաթեթավորված անդամի հասցե« (չհավասարեցված ցուցիչի արժեքը կառույցի կամ միության փաթեթավորված անդամին) և
    «-Բացարձակ արժեք« (բացարձակ արժեք հաշվարկելու համար գործառույթներ մուտք գործելիս, եթե կա նշված արգումենտի համար ավելի հարմար գործառույթ, օրինակ, abs (3.14) փոխարեն պետք է օգտագործվի fabs(3.14): Ավելացվեցին նոր նախազգուշացումներ C++-ի համար՝ «-Wdeprecated-copy»,
    «-Winit-list-lifetime», «-Wredundant-move», «-Wpessimizing-move» և «-Wclass-conversion»: Նախկինում առկա բազմաթիվ նախազգուշացումներ ընդլայնվել են.

  • Ավելացվեց փորձնական աջակցություն ապագա C լեզվի ստանդարտի մի մասի համար, որը կրում է C2x ծածկանունը: C2x-ի աջակցությունը միացնելու համար օգտագործեք «-std=c2x» և «-std=gnu2x» տարբերակները (GNU ընդլայնումները միացնելու համար): Ստանդարտը դեռ մշակման վաղ փուլում է, հետևաբար, նրա հնարավորությունների համար աջակցվում է միայն _Static_assert արտահայտությունը մեկ արգումենտով (_Static_assert երկու արգումենտով ստանդարտացված է C11-ում);
  • C++17 ստանդարտի աջակցությունը հայտարարվել է կայուն: Frontend-ում C++17-ի լեզվական հնարավորություններն ամբողջությամբ ներդրված են, իսկ libstdc++-ում ստանդարտում սահմանված գրադարանային գործառույթները մոտ են ամբողջական իրականացմանը.
  • Շարունակություն իրականացումը ապագա C++2a ստանդարտի տարրեր: Օրինակ՝ ավելացվել է սկզբնավորման ընթացքում միջակայքերը ներառելու հնարավորությունը, ներդրվել են լամբդա արտահայտությունների ընդլայնումներ, ավելացվել է տվյալների կառուցվածքների դատարկ անդամների և հավանական/անհավանական ատրիբուտների աջակցություն, պայմանական արտահայտություններով վիրտուալ ֆունկցիաներ կանչելու հնարավորությունը տրամադրվել է։ և այլն։
    C++2a-ի աջակցությունը միացնելու համար օգտագործեք «-std=c++2a» և «-std=gnu++2a» տարբերակները: libstdc++-ում ավելացվել են բիթային և տարբերակի վերնագրի ֆայլեր C++2a-ի համար, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible և std::type_identity հատկանիշներ, std::midpoint, std::midpoint ֆունկցիա: , std::bind_front,
    std::visit, std::is_constant_evaluated և std::assume_aligned, ավելացրել է աջակցություն char8_t տեսակի համար, ներդրել է տողերի նախածանցը և վերջածանցը ստուգելու հնարավորությունը (սկսում_ով, ավարտվում_ով);

  • Ավելացվեց նոր ARM պրոցեսորների աջակցություն
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE և Neoverse N1: Ավելացվել է Armv8.3-A-ում ներկայացված հրահանգների աջակցություն՝ կոմպլեքս թվերի հետ աշխատելու, կեղծ պատահական թվերի ստեղծման (rng) և հիշողության հատկորոշման (memtag), ինչպես նաև սպեկուլյատիվ կատարման և ճյուղի կանխատեսման միավորի շահագործման հետ կապված հարձակումների արգելափակման հրահանգների համար։ . AArch64 ճարտարապետության համար ավելացվել է պաշտպանության ռեժիմ կույտային և կույտային խաչմերուկներ («-fstack-clash-protection»): Armv8.5-A ճարտարապետության առանձնահատկություններից օգտվելու համար ավելացվել է «-march=armv8.5-a» տարբերակը։

  • Այն ներառում է GCN-ի միկրոճարտարապետության վրա հիմնված AMD GPU-ների համար կոդ ստեղծելու հետին պլան: Ներկայում իրականացումը սահմանափակվում է միաշղթա հավելվածների կազմմամբ (ավելի ուշ կառաջարկվի OpenMP-ի և OpenACC-ի միջոցով բազմաթելային հաշվարկներ իրականացնելու համար) և GPU Fiji-ի և Vega 10-ի աջակցությամբ;
  • Ավելացվեց պրոցեսորների նոր հետին պլան OpenRISC;
  • Ավելացվեց հետնամաս պրոցեսորների համար C-SKY V2, արտադրված չինական համանուն ընկերության կողմից տարբեր սպառողական սարքերի համար;
  • Բոլոր հրամանի տողի ընտրանքները, որոնք գործում են բայթային արժեքներով, աջակցում են kb, KiB, MB, MiB, GB և GiB վերջածանցները.
  • Իրականացվել է «-flive-patching=[inline-only-static|inline-clone]» տարբերակը թույլ է տալիս հասնել անվտանգ կոմպիլյացիա կենդանի կարկատանային համակարգերի համար՝ շնորհիվ միջընթացակարգային օգտագործման բազմաստիճան վերահսկողության (IPA) օպտիմալացումներ;
  • Ավելացվեց «--լրացում» տարբերակը՝ bash-ի օգտագործման ժամանակ օպցիոնի լրացման մանրահատիկ վերահսկման համար;
  • Ախտորոշիչ գործիքները տրամադրում են սկզբնաղբյուր տեքստի քաղվածքների ցուցադրում՝ նշելով տողի համարը և տեսողականորեն նշելով առնչվող տեղեկատվությունը, օրինակ՝ օպերանդների տեսակները: Տողերի համարների և պիտակների ցուցադրումն անջատելու համար տրամադրվում են «-fno-diagnostics-show-line-numbers» և «-fno-diagnostics-show-labels» տարբերակները.

    GCC 9 կոմպիլյատորների փաթեթի թողարկում

  • Ընդլայնված C++ կոդի սխալների ախտորոշման գործիքներ, սխալների պատճառների մասին տեղեկատվության բարելավված ընթերցանություն և խնդրահարույց պարամետրերի ընդգծում.

    GCC 9 կոմպիլյատորների փաթեթի թողարկում

  • Ավելացվեց «-fdiagnostics-format=json» տարբերակը, որը թույլ է տալիս ստեղծել ախտորոշիչ արդյունք մեքենայաընթեռնելի ձևաչափով (JSON);
  • Ավելացվել են պրոֆիլավորման նոր ընտրանքներ «-fprofile-filter-files» և «-fprofile-exclude-files»՝ մշակման ենթակա աղբյուրի ֆայլերը ընտրելու համար;
  • AddressSanitizer-ն ապահովում է ավտոմատ փոփոխականների ավելի կոմպակտ հաստատման կոդի ստեղծում, որը նվազեցնում է ստուգվող գործարկվող ֆայլի հիշողության սպառումը.
  • բարելավված արդյունքը "-fopt-info» (մանրամասն տեղեկատվություն ավելացված օպտիմալացումների մասին): Ավելացվել են նոր նախածանցներ «օպտիմիզացված» և «բաց թողնված», ի լրումն նախկինում առկա «նշում» նախածանցի: Ավելացվել է ցիկլերի ներգծային բացման և վեկտորացման վերաբերյալ որոշումների կայացման վերաբերյալ տեղեկատվության ելք;
  • Ավելացվել է «-fsave-optimization-record» տարբերակը, երբ նշված է, GCC-ն պահպանում է SRCFILE.opt-record.json.gz ֆայլը՝ որոշակի օպտիմալացումների օգտագործման վերաբերյալ որոշումների նկարագրությամբ: Նոր տարբերակը տարբերվում է «-fopt-info» ռեժիմից՝ ներառելով լրացուցիչ մետատվյալներ, օրինակ՝ պրոֆիլի և ներկառուցված շղթաների մասին տեղեկությունները.
  • Ավելացվել են «-fipa-stack-alignment» և «-fipa-reference-addressable» տարբերակները` վերահսկելու stack-ի հավասարեցումը և հասցեավորման ռեժիմների օգտագործումը (միայն գրել կամ կարդալ-ճշգրիտ) ստատիկ փոփոխականների համար միջընթացակարգային օպտիմալացումների ժամանակ.
  • Ներկառուցված նոր գործառույթներ են ներդրվել՝ վերահսկելու հատկանիշի կապը, ինչպես նաև ճյուղերի կանխատեսման և սպեկուլյատիվ հրահանգների կատարման հետ կապված վարքագիծը.__կառուցված_ունի_հատկանիշ«,«__կառուցված_ակնկալում_հավանականությամբ«Եվ»__կառուցված_սպեկուլյացիա_անվտանգ_արժեք«. Նոր հատկանիշ է ավելացվել ֆունկցիաների, փոփոխականների և տեսակների համար պատճենել;
  • Fortran լեզվի համար իրականացվել է ասինխրոն մուտքի/ելքի ամբողջական աջակցություն;
  • Solaris 10 (*-*-solaris2.10) և Cell/B.E (Cell Broadband Engine SPU) հարթակների աջակցությունը հնացել է և կհեռացվի հաջորդ հիմնական թողարկումում: Armv2, Armv3, Armv5 և Armv5E ճարտարապետությունների աջակցությունը դադարեցվել է։ Intel MPX-ի (Memory Protection Extensions) աջակցությունը դադարեցվել է:

Source: opennet.ru

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