GCC 10 хөрвүүлэгчийн багцыг гаргасан

Жилийн хөгжлийн дараа нийтэлсэн хөрвүүлэгчийн үнэгүй багцыг гаргах GCC 10.1, шинэ GCC 10.x салбарын анхны томоохон хувилбар. -ын дагуу шинэ схем хувилбарын дугаар, 10.0 хувилбарыг боловсруулах явцад ашигласан бөгөөд GCC 10.1-ийг гаргахаас өмнөхөн GCC 11.0 салбар аль хэдийн салбарласан байсан бөгөөд үүний үндсэн дээр дараагийн чухал хувилбар болох GCC 11.1-ийг бий болгох болно.

GCC 10.1 нь C++ 20 стандартад зориулан боловсруулсан C++ хэлэнд олон шинэчлэлийг хэрэгжүүлсэн, ирээдүйн Си хэлний стандарт (C2x)-тай холбоотой сайжруулалт, хөрвүүлэгчийн арын хэсгийн шинэ оновчлол, туршилтын дэмжлэг зэргээрээ онцлог юм. статик шинжилгээний горим. Нэмж дурдахад, шинэ салбарыг бэлтгэх явцад төсөл нь репозиторийг SVN-ээс Гит рүү шилжүүлсэн.

Үндсэн өөрчлөлт:

  • Нэмсэн статик шинжилгээний туршилтын горим "- фанализатор", энэ нь програм дахь кодын гүйцэтгэх замууд болон өгөгдлийн урсгалд нөөц их шаарддаг процедур хоорондын дүн шинжилгээ хийдэг. Энэ горим нь санах ойн нэг талбарт зориулсан free() функц руу давхар дуудлага хийх, файлын тодорхойлогч алдагдлыг арилгах, хоосон заагчийг шилжүүлэх, суллагдсан санах ойн блокуудад хандах, эхлээгүй утгыг ашиглах гэх мэт асуудлуудыг эмхэтгэх үе шатанд илрүүлэх чадвартай. OpenSSL кодын шинэ горимыг ашигласнаар таних боломжтой болсон аюултай эмзэг байдал.
  • Процедур хоорондын оновчлолыг сайжруулсан. IPA-SRA (Interprocedural Scalar Shared Replacement) дамжуулалтыг хүлээлтийн цагт ажиллахаар дахин зохион бүтээсэн бөгөөд бусад зүйлсээс гадна тооцоолсон болон буцаагдсан ашиглагдаагүй утгуудыг устгадаг. "-O2" оновчлолын горимд "-finline-functions" сонголтыг идэвхжүүлсэн бөгөөд энэ нь гүйцэтгэлийн гүйцэтгэлээс илүү авсаархан кодыг илүүд үзэхийн тулд дахин тохируулагдсан болно. Inline функцийг байршуулах эвристикийн ажлыг хурдасгасан. Дотор өргөтгөл болон функц хувилах эвристик нь одоо хувь хүний ​​хувиргалтын үр нөлөөг урьдчилан таамаглахад утгын хүрээний талаарх мэдээллийг ашиглах боломжтой болсон. C++-ийн хувьд төрөлд суурилсан alias задлан шинжлэхийн нарийвчлал сайжирсан.
  • Сайжруулсан холбох цагийг оновчтой болгох (LTO). Шинэ гүйцэтгэх файлыг нэмсэн lto-dump LTO байт код бүхий объектын файлуудын талаарх мэдээллийг дахин тохируулах. Зэрэгцээ LTO дамжуулалт нь нэгэн зэрэг ажиллаж байгаа хийх ажлуудын тоог автоматаар тодорхойлдог бөгөөд хэрэв тэдгээрийг тодорхойлох боломжгүй бол CPU-ийн цөмийн тооны талаарх мэдээллийг зэрэгцээ болгох хүчин зүйл болгон ашигладаг. Zstd алгоритмыг ашиглан LTO байт кодыг шахах чадварыг нэмсэн.
  • Кодын профайл (PGO - Profile-guided optimization) үр дүнд суурилсан оновчлолын механизмыг сайжруулсан бөгөөд энэ нь кодын гүйцэтгэлийн шинж чанаруудын дүн шинжилгээнд үндэслэн илүү оновчтой кодыг үүсгэдэг. Эмхэтгэх, халуун/хүйтэн кодыг ялгах явцад профайлын засвар үйлчилгээ сайжирсан. Сонголтоор дамжуулан "-fprofile-утгууд» одоо 4 хүртэлх профайлын утгыг хянах боломжтой, жишээлбэл шууд бус дуудлага хийх, профайлын илүү нарийвчлалтай мэдээлэл өгөх.
  • C, C++ болон Fortran хэлнүүдэд хэрэгжсэн зэрэгцээ програмчлалын тодорхойлолт OpenACC 2.6, энэ нь GPU болон NVIDIA PTX зэрэг тусгай процессорууд дээрх ачааллыг буулгах үйлдлүүдийг тодорхойлох хэрэгслүүдийг тодорхойлдог. Стандартын хэрэгжилт бараг дууссан MP 5.0-ийг нээх (Open Multi-Processing) нь хуваалцсан санах ой, векторжуулалтын нэгж (SIMD) бүхий олон цөмт болон холимог (CPU+GPU/DSP) системүүд дээр зэрэгцээ програмчлалын аргуудыг хэрэглэх API болон аргуудыг тодорхойлдог. Lastprivate нөхцөл, скан хийх болон давталтын удирдамж, захиалга болон use_device_addr илэрхийлэл зэрэг функцуудыг нэмсэн. OpenMP болон OpenACC-ийн хувьд дөрөв дэх үеийн (Фижи) болон тав дахь үеийн AMD Radeon (GCN) GPU (VEGA 10/VEGA 20) дээрх ачааллыг буулгах ажиллагааг дэмжих дэмжлэг нэмэгдсэн.
  • Си гэр бүлийн хэлнүүдийн хувьд лавлагаа эсвэл заагчаар дамжуулагдсан объектуудад функцийн хандалтыг тайлбарлах, эдгээр объектуудыг объектын хэмжээний талаарх мэдээллийг агуулсан бүхэл тоон аргументуудтай холбох зорилгоор "хандах" функцийг нэмсэн. "Хандалт" -тай хамтран ажиллахын тулд "төрөл" шинж чанарыг хэрэглэгчийн функцээс буруу хандалтыг илрүүлэх зорилгоор хэрэгжүүлдэг, жишээлбэл, массивын хязгаараас гадуурх хэсэгт утгыг бичих үед. Мөн ELF файл дахь тэмдэгтүүдийг тодорхой хувилбарын дугаартай холбох "symver" шинж чанарыг нэмсэн.
  • Шинэ сэрэмжлүүлэг нэмсэн:
    • "-Wstring-харьцуулах" ("-Wextra"-р идэвхжүүлсэн) - strcmp болон strncmp функцийг дуудсаны үр дүнд тэгийг харьцуулсан илэрхийлэл байгаа эсэхийг анхааруулж, урт нь тогтмол утгатай тэнцүү байна. нэг аргументын хэмжээ нь хоёр дахь аргумент дахь массивын хэмжээнээс их байна.
    • "-Wzero-length-bounds" ("-Warray-bounds"-ээр идэвхжсэн) - тэг урттай массивын элементүүдэд хандахыг анхааруулж, энэ нь бусад өгөгдлийг дарж бичихэд хүргэж болзошгүй юм.
    • "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" болон "-Wstringop-overflow" сэрэмжлүүлгийг хязгаараас гадуурх нөхцөл байдлын тоог нэмэгдүүлэх зорилгоор өргөтгөсөн. зохицуулагддаг.
  • UCN тэмдэглэгээний (\uNNNN эсвэл \UNNNNNNNN) оронд одоогийн кодчилол (анхдагчаар UTF-8) ашиглан танигч дахь өргөн тэмдэгтүүдийг шууд зааж өгөх боломжийг хэрэгжүүлсэн. Жишээлбэл:

    статик const int π = 3;
    int get_naïve_pi() {
    буцах π;
    }

  • Си хэлний хувьд C2X стандартын хүрээнд боловсруулсан шинэ функцүүдийн зарим хэсгийг хэрэгжүүлсэн (-std=c2x ба -std=gnu2x-ийг зааж өгснөөр идэвхжүүлсэн): "[[]]" синтакс нь дараах шинж чанаруудыг тодорхойлоход зориулагдсан болно. C++ (жишээ нь, [[gnu ::const]], [[хуучирсан]], [[fallthrough]] болон [[maybe_unused]]. UTF-8 тэмдэгт бүхий тогтмолуудыг тодорхойлох "u8" синтаксийн дэмжлэг нэмэгдсэн.
    Шинэ макронууд нэмсэн . strftime-д "%OB" болон "%Ob" орлуулалтыг нэмсэн.

  • Си хэлний анхдагч горим нь "-fno-common" бөгөөд энэ нь зарим платформ дээрх глобал хувьсагчдад илүү үр дүнтэй хандах боломжийг олгодог.
  • C++-ийн хувьд C++16 стандартад боловсруулсан 20 орчим өөрчлөлт, шинэчлэлтийг хэрэгжүүлсэн. "constinit" гэсэн түлхүүр үг орсон
    загвар өргөтгөлүүдийн дэмжлэгийг хэрэгжүүлсэн "үзэл баримтлал". Үзэл баримтлал нь хөрвүүлэх үед загварын параметр болгон хүлээн зөвшөөрөгдөх аргументуудын багцыг хязгаарлах загвар параметрийн шаардлагуудын багцыг тодорхойлох боломжийг танд олгоно. Загвар дотор ашиглагдаж буй өгөгдлийн төрлүүдийн шинж чанарууд болон оролтын параметрүүдийн өгөгдлийн төрлийн шинж чанаруудын хооронд логик үл нийцэх байдлаас зайлсхийхийн тулд ойлголтуудыг ашиглаж болно.

  • 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" сонголтыг ашиглан хянадаг.
  • Урьдчилан процессорын оператор нэмсэн "__ барьсан", энэ нь суулгагдсан функцуудыг шалгахад ашиглаж болно.
  • ISO/IEC TS 18661 стандартад тодорхойлсон бөөрөнхийлөлт функцийг хэрэгжүүлсэн шинэ суурилуулсан "__builtin_roundeven" функцийг нэмсэн. Энэ нь "дугуй"-тай төстэй боловч хэсэг нь 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.

  • ARM32-д зориулсан ABI FDPIC (64 битийн функцын заагч) дэмжлэгийг нэмсэн. 64 битийн бүхэл тоон үйлдлийн боловсруулалтыг дахин боловсруулж, оновчтой болгосон. CPU-ийн дэмжлэгийг нэмсэн
    Arm Cortex-A77,
    Arm Cortex-A76AE ба
    Arm Cortex-M35P. 32 битийн SIMD, 16 битийн үржүүлэх, түгжээний арифметик болон бусад DSP алгоритмын оновчлол зэрэг ACLE өгөгдөл боловсруулах зааварчилгааг өргөтгөсөн дэмжлэг. ACLE CDE (Custom Datapath Extension) зааврын туршилтын дэмжлэгийг нэмсэн.

  • GCN бичил архитектур дээр суурилсан AMD GPU-ийн арын хэсэгт код үүсгэх, векторжуулалтыг мэдэгдэхүйц сайжруулсан.
  • AVR архитектурт зориулсан XMEGA-тай төстэй төхөөрөмжүүдийн дэмжлэгийг нэмсэн
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmegaAT808, ATmega809game, ATtiny1608me 1609, ATmega3208, ATmega3209 4808, ATmega4809 болон ATmegaXNUMX.

  • IA-32/x86-64 архитектурт зориулж Intel ENQCMD-н шинэ зааварчилгааны архитектурын өргөтгөл (-menqcmd) нэмэгдсэн. Intel Cooperlake (-march=cooperlake, AVX512BF16 ISA өргөтгөлийг багтаасан) болон Tigerlake (-march=tigerlake, MOVDIRI, MOVDIR64B болон AVX512VP2INTERSECT ISA өргөтгөлүүдийг багтаасан) CPU-ийн дэмжлэгийг нэмсэн.
  • HSA архитектурт суурилсан нэг төрлийн бус тооцооллын системд зориулсан HSAIL (гетероген системийн архитектурын завсрын хэл)-ийн хэрэгжилт хуучирсан бөгөөд ирээдүйн хувилбарт устгагдах магадлалтай.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх