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

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

GCC 10.1-ը աչքի է ընկնում C++ լեզվում C++20 ստանդարտի համար մշակված բազմաթիվ նորամուծություններով, ապագա C լեզվի ստանդարտի (C2x) հետ կապված բարելավումներով, կոմպիլյատորների հետին մասերում նոր օպտիմալացումներով և փորձարարական աջակցությամբ: ստատիկ վերլուծության ռեժիմ. Բացի այդ, նոր մասնաճյուղի պատրաստման ժամանակ նախագիծը պահեստարանը SVN-ից տեղափոխեց Git:

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

  • Ավելացված է Ստատիկ վերլուծության փորձարարական եղանակ»- ֆանալիզատոր«, որն իրականացնում է ծրագրում կոդի կատարման ուղիների և տվյալների հոսքերի ռեսուրսների ինտենսիվ միջընթացակարգային վերլուծություն: Ռեժիմը կարող է հայտնաբերել խնդիրներ կոմպիլյացիայի փուլում, օրինակ՝ կրկնակի զանգեր free() ֆունկցիայի համար մեկ հիշողության տարածքի համար, ֆայլերի նկարագրիչի արտահոսք, չհղում և փոխանցել զրոյական ցուցիչներ, մուտք գործել ազատված հիշողության բլոկներ, օգտագործել չնախապատրաստված արժեքներ և այլն: OpenSSL կոդի համար նոր ռեժիմի օգտագործումն արդեն հնարավորություն է տվել նույնականացնել վտանգավոր խոցելիություն.
  • Բարելավված միջգործընթացային օպտիմալացումներ: IPA-SRA (Interprocedural Scalar Shared Replacement) անցագիրը վերանախագծվել է, որպեսզի աշխատի կապի ժամանակ և, ի թիվս այլ բաների, այժմ հեռացնում է հաշվարկված և վերադարձված չօգտագործված արժեքները: «-O2» օպտիմիզացման ռեժիմում միացված է «-finline-functions» տարբերակը, որը վերագործարկվում է ավելի կոմպակտ կոդի համար, քան կատարողականը: Էվրիստիկայի աշխատանքը ներգծային ֆունկցիայի տեղակայման համար արագացվել է: Ներկառուցված ընդլայնման և ֆունկցիաների կլոնավորման էվրիստիկաներն այժմ կարող են օգտագործել արժեքների միջակայքերի մասին տեղեկատվություն՝ կանխատեսելու առանձին փոխակերպումների արդյունավետությունը: C++-ի համար տիպի վրա հիմնված այլանունների վերլուծության ճշգրտությունը բարելավվել է:
  • Ընդլայնված կապի ժամանակի օպտիմալացում (LTO): Ավելացվեց նոր գործարկիչ lto-dump LTO բայթկոդով օբյեկտի ֆայլերի մասին տեղեկատվությունը վերականգնելու համար: Զուգահեռ LTO անցումները ավտոմատ կերպով որոշում են միաժամանակ գործարկվող make առաջադրանքների քանակը և, եթե դրանք հնարավոր չէ որոշել, օգտագործեք CPU միջուկների քանակի մասին տեղեկատվությունը որպես զուգահեռացման գործոն: Ավելացվեց LTO բայթկոդը սեղմելու հնարավորություն՝ օգտագործելով zstd ալգորիթմը:
  • Կոդերի պրոֆիլավորման արդյունքների վրա հիմնված օպտիմալացման մեխանիզմը (PGO - Profile-guided optimization) բարելավվել է, որն ավելի օպտիմալ կոդ է ստեղծում՝ հիմնվելով կոդի կատարման բնութագրերի վերլուծության վրա: Բարելավված պրոֆիլի պահպանում կոմպիլյացիայի ժամանակ և տաք/սառը կոդերի տարանջատում: Տարբերակի միջոցով «-fprofile-արժեքներ» այժմ կարող է վերահսկել պրոֆիլի մինչև 4 արժեք, օրինակ՝ անուղղակի զանգերի և պրոֆիլի ավելի ճշգրիտ տեղեկատվություն տրամադրելու համար:
  • Զուգահեռ ծրագրավորման հստակեցում, որն իրականացվում է C, C++ և Fortran լեզուների համար OpenACC 2.6, որը սահմանում է GPU-ների և մասնագիտացված պրոցեսորների վրա գործառնությունների բեռնաթափման գործիքներ, ինչպիսիք են NVIDIA PTX-ը: Ստանդարտի ներդրումը գրեթե ավարտված է Բացեք MP 5.0-ը (Open Multi-Processing), որը սահմանում է API-ն և զուգահեռ ծրագրավորման մեթոդների կիրառման մեթոդները բազմամիջուկ և հիբրիդային (CPU+GPU/DSP) համակարգերում՝ ընդհանուր հիշողության և վեկտորացման միավորներով (SIMD): Ավելացվել են այնպիսի առանձնահատկություններ, ինչպիսիք են վերջին մասնավոր պայմանականները, սկանավորել և կապել հրահանգները, պատվիրել և use_device_addr արտահայտությունները: OpenMP-ի և OpenACC-ի համար ավելացվել է չորրորդ սերնդի (Ֆիջի) և հինգերորդ սերնդի AMD Radeon (GCN) GPU (VEGA 10/VEGA 20) գործողությունների բեռնաթափման աջակցություն:
  • C ընտանիքի լեզուների համար «մուտք» ֆունկցիան ավելացվել է, որպեսզի նկարագրի գործառույթի հասանելիությունը հղումով կամ ցուցիչով փոխանցված օբյեկտներին, և նման օբյեկտները կապակցեն օբյեկտների չափի մասին տեղեկատվություն պարունակող ամբողջ թվով արգումենտների հետ: «Մուտքի» հետ համատեղ աշխատելու համար «տիպ» հատկանիշն իրականացվում է օգտվողի գործառույթներից սխալ մուտքը հայտնաբերելու համար, օրինակ՝ զանգվածի սահմաններից դուրս գտնվող տարածք արժեքներ գրելիս: Նաև ավելացվել է «symver» հատկանիշը՝ ELF ֆայլում հատուկ տարբերակի համարներով սիմվոլների համակցման համար:
  • Ավելացվեցին նոր նախազգուշացումներ.
    • «-Wstring-compare» (միացված է «-Wextra») - զգուշացնում է արտահայտությունների առկայության մասին, որոնցում զրոն համեմատվում է strcmp և strncmp ֆունկցիաները կանչելու արդյունքի հետ, որը համարժեք է հաստատունի, քանի որ երկարությունը մեկ արգումենտի չափը մեծ է երկրորդ արգումենտի զանգվածի չափից:
    • «-Wzero-length-bounds» (միացված է «-Warray-bounds»-ով) - զգուշացնում է զրոյական երկարությամբ զանգվածի տարրեր մուտք գործելու մասին, ինչը կարող է հանգեցնել այլ տվյալների վերագրանցման:
    • «-Warray-bounds», «-Wformat-overflow», «-Wrestrict», «-Wreturn-local-addr» և «-Wstringop-overflow» նախազգուշացումները ընդլայնվել են՝ ընդլայնելու սահմաններից դուրս իրավիճակների թիվը: որոնք մշակվում են:
  • Իրականացրել է նույնացուցիչներում լայն նիշերը ուղղակիորեն նշելու հնարավորությունը՝ օգտագործելով ընթացիկ կոդավորումը (ըստ լռելյայն UTF-8), այլ ոչ թե UCN նշումը (\uNNNN կամ \UNNNNNNNN): Օրինակ:

    ստատիկ const int π = 3;
    int get_naïve_pi() {
    վերադարձ π;
    }

  • C լեզվի համար ներդրվել է C2X ստանդարտում մշակված նոր առանձնահատկությունների մի մասը (միացված է նշելով -std=c2x և -std=gnu2x). «[[]]» շարահյուսության աջակցությունը հայտնվել է ատրիբուտները սահմանելու համար, ինչպես C++ (օրինակ՝ [[gnu ::const]], [[հնացած]], [[fallthrough]] և [[maybe_unused]]: Ավելացվել է «u8» շարահյուսության աջակցություն՝ UTF-8 նիշերով հաստատուններ սահմանելու համար:
    Ավելացվեցին նոր մակրոներ -ում: strftime-ում ավելացվել են «%OB» և «%Ob» փոխարինումները:

  • Լռելյայնորեն, C-ն օգտագործում է «-fno-common» ռեժիմը, որը թույլ է տալիս ավելի արդյունավետ մուտք գործել գլոբալ փոփոխականներ որոշ հարթակներում:
  • C++-ի համար իրականացվել է շուրջ 16 փոփոխություն և նորամուծություն՝ մշակված C++20 ստանդարտում։ Ներառյալ «continit» ավելացված հիմնաբառը
    և կաղապարի ընդլայնումների աջակցությունն իրականացվել է "հայեցակարգը«. Հասկացությունները թույլ են տալիս սահմանել կաղապարի պարամետրերի պահանջների մի շարք, որոնք կոմպիլյացիայի ժամանակ սահմանափակում են արգումենտների շարքը, որոնք կարող են ընդունվել որպես կաղապարի պարամետրեր: Հասկացությունները կարող են օգտագործվել կաղապարում օգտագործվող տվյալների տեսակների հատկությունների և մուտքային պարամետրերի տվյալների տիպի հատկությունների միջև տրամաբանական անհամապատասխանություններից խուսափելու համար:

  • G++-ն ապահովում է անորոշ վարքագծի հայտնաբերում, որը պայմանավորված է constexpr-ի միջոցով հաստատուն օբյեկտների փոփոխությամբ: Կոմպիլյատորի կողմից կրճատվել է հիշողության սպառումը constexpr-ը հաշվարկելիս: Ավելացվել են նոր նախազգուշացումներ «-Wmismatched-tags» և «-Wredundant-tags»:
  • Առաջարկվել են հրամանի տողի նոր տարբերակներ.
    • «-fallocation-dce»՝ «նոր» և «ջնջել» օպերատորների ավելորդ զույգերը հեռացնելու համար:
    • «-fprofile-partial-training»՝ անջատելու չափի օպտիմիզացումը կոդի համար, որը չունի ուսուցման գործարկում:
    • «-fprofile-reproducible պրոֆիլի վերարտադրելիության մակարդակը վերահսկելու համար:
    • «-fprofile-prefix-path»՝ սահմանելու հիմնական աղբյուրի կառուցման գրացուցակը, որն օգտագործվում է առանձին պրոֆիլների ստեղծման համար («-fprofile-generate=profile_dir» և «-fprofile-use=profile_dir» համար):
  • Նշված տարբերակների նախազգուշացման տեքստում տրամադրվում են հիպերհղումներ, որոնք թույլ են տալիս անցնել այդ տարբերակների փաստաթղթերին: URL-ի փոխարինումը վերահսկվում է «-fdiagnostics-urls» տարբերակի միջոցով:
  • Ավելացվեց նախապրոցեսորային օպերատոր»__ունի_կառուցված«, որը կարող է օգտագործվել ներկառուցված գործառույթները ստուգելու համար:
  • Ավելացվեց նոր ներկառուցված «__builtin_roundeven» գործառույթը ISO/IEC TS 18661 բնութագրում սահմանված կլորացման գործառույթի իրականացմամբ, որը նման է «կլորին», բայց կլորացնում է 0.5-ից ավելի վերև (մինչև ավելի մեծ արժեք), 0.5-ից պակաս: - ներքև (մինչև զրոյի), և հավասար է 0.5-ի՝ սկսած նախավերջին թվանշանի հավասարությունից:
  • AArch64 ճարտարապետության համար ավելացվել է SVE2 ընդլայնման աջակցությունը և բարելավվել է SVE-ի (Scalable Vector Extension) աջակցությունը, ներառյալ ներկառուցված SVE ACLE գործառույթների և տեսակների աջակցությունը, ինչպես նաև վեկտորացման օգտագործումը: Ընդլայնվել է LSE (Large System Extensions) և TME (Transactional Memory Extension) աջակցությունը: Ավելացվել են Armv8.5-A-ում և Armv8.6-A-ում առաջարկված նոր հրահանգներ, ներառյալ պատահական թվերի ստեղծման, կլորացման, հիշողության պիտակների կապման հրահանգներ,
    bfloat16 և մատրիցային բազմապատկում: Ավելացվեց պրոցեսորի աջակցություն
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 և
    Marvell ThunderX3.

  • Ավելացվել է ABI FDPIC (32-բիթանոց ֆունկցիայի ցուցիչներ) աջակցություն ARM64-ի համար: Վերանախագծված և օպտիմիզացված 64-բիթանոց ամբողջ թվով գործողությունների մշակումը: Ավելացվեց պրոցեսորի աջակցություն
    Arm Cortex-A77,
    Arm Cortex-A76AE և
    Arm Cortex-M35P. Ընդլայնված աջակցություն ACLE տվյալների մշակման հրահանգներին, ներառյալ 32-բիթանոց SIMD, 16-բիթանոց բազմապատկում, սողնակային թվաբանություն և այլ DSP ալգորիթմի օպտիմալացում: Ավելացվեց փորձնական աջակցություն ACLE CDE (Custom Datapath Extension) հրահանգներին:

  • Զգալիորեն բարելավվել է կոդերի ստեղծումը և վեկտորացումը AMD GPU-ների հետին պլանում՝ հիմնված GCN միկրոճարտարապետության վրա:
  • Ավելացվել է AVR ճարտարապետության համար XMEGA-ի նման սարքերի աջակցություն
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808ATmega809 , ATmega1608, ATmega1609 3208, ATmega3209 և ATmega4808:

  • IA-32/x86-64 ճարտարապետության համար ավելացվել է Intel ENQCMD հրահանգների հավաքածուի նոր ընդլայնում (-menqcmd): Ավելացվել է Intel Cooperlake (-march=cooperlake, ներառում է AVX512BF16 ISA ընդլայնումը) և Tigerlake (-march=tigerlake, ներառում է MOVDIRI, MOVDIR64B և AVX512VP2INTERSECT ISA ընդլայնումներ) պրոցեսորների աջակցությունը:
  • HSAIL-ի (Հետերոգեն համակարգի ճարտարապետության միջանկյալ լեզու) ներդրումը HSA ճարտարապետության վրա հիմնված տարասեռ հաշվողական համակարգերի համար հնացած է և, հավանաբար, կհեռացվի ապագա թողարկումում:

Source: opennet.ru

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