Paglabas ng GCC 9 compiler suite

Pagkatapos ng isang taon ng pag-unlad nalathala paglabas ng isang libreng hanay ng mga compiler GCC 9.1, ang unang pangunahing release sa bagong sangay ng GCC 9.x. Alinsunod sa bagong scheme mga numero ng release, bersyon 9.0 ay ginamit sa proseso ng pag-develop, at ilang sandali bago ang paglabas ng GCC 9.1, ang sangay ng GCC 10.0 ay nagsanga na, batay sa kung saan ang susunod na makabuluhang release, ang GCC 10.1, ay mabubuo.

Ang GCC 9.1 ay kapansin-pansin para sa pagpapatatag ng suporta para sa pamantayang C++17, patuloy na pagpapatupad ng mga kakayahan ng hinaharap na pamantayang C++20 (codenamed C++2a), pagsasama sa frontend para sa wikang D, bahagyang suporta para sa OpenMP 5.0 , halos kumpletong suporta para sa OpenACC 2.5, pataasin ang scalability ng interprocedural optimizations at optimizations sa binding stage, pagpapalawak ng diagnostic tool at pagdaragdag ng mga bagong babala, backend para sa OpenRISC, C-SKY V2 at AMD GCN GPU.

Ang pangunahing pagbabago:

  • Nagdagdag ng suporta para sa D programming language. Kasama sa GCC ang frontend na may compiler GDC (Gnu D Compiler) at mga runtime na aklatan (libphobos), na nagbibigay-daan sa iyong gumamit ng karaniwang GCC para bumuo ng mga program sa D programming language. Ang proseso ng pagpapagana ng D language support sa GCC nagsimula na noong 2011, ngunit kinaladkad dahil sa pangangailangang dalhin ang code sa pagsunod sa mga kinakailangan ng GCC at mga problema sa paglilipat ng mga karapatan sa intelektwal na ari-arian sa Digital Mars, na bumubuo ng D programming language;
  • Ang mga pagpapabuti ay ginawa sa generator ng code. Halimbawa, ang paggamit ng iba't ibang mga diskarte para sa pagpapalawak ng mga expression ng Switch (jump table, bit test, decision tree) depende sa mga sitwasyon ay ipinatupad. Idinagdag ang kakayahang mag-transform ng mga linear na function na may kasamang Switch expression gamit ang "-ftree-switch-conversion" optimization (halimbawa, isang set ng mga kundisyon tulad ng "case 2: how = 205; break; case 3: how = 305; break ;” ay mako-convert sa "100 * how + 5";
  • Mga pinahusay na interprocedural optimization. Ang mga setting ng inline na deployment ay inangkop para sa mga modernong C++ codebase at pinalawak gamit ang mga bagong parameter na max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns at uninlined -thunk-time. Pinahusay na katumpakan at pagiging agresibo ng paghihiwalay ng malamig/mainit na code. Pinahusay na scalability para sa napakalaki mga yunit ng pagsasalin (halimbawa, kapag nag-aaplay ng pag-optimize sa yugto ng pagli-link sa malalaking programa);
  • Ang mekanismo ng optimization batay sa mga resulta ng code profiling (PGO - Profile-guided optimization) ay napabuti, na bumubuo ng mas pinakamainam na code batay sa pagsusuri ng mga katangian ng code execution. opsyon sa buod "-fprofile-gamitin" Kasama na ngayon ang mga mode ng pag-optimize na "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" at "-ftree-loop-distribution". Inalis ang pagsasama ng mga histogram na may mga counter sa mga file, na nagpabawas sa laki ng mga file na may mga profile (nabubuo na ngayon ang mga histogram nang mabilis kapag nagsasagawa ng mga pag-optimize habang nagli-link);
  • Pinahusay na Linking Time Optimizations (LTO). Ang pagpapasimple ng mga uri ay ibinigay bago bumuo ng resulta, na naging posible upang makabuluhang bawasan ang laki ng mga file ng object ng LTO, bawasan ang pagkonsumo ng memorya sa yugto ng pagbubuklod, at pagbutihin ang parallelization ng mga operasyon. Ang bilang ng mga partisyon (-param lto-partitions) ay nadagdagan mula 32 hanggang 128, na nagpapabuti sa pagganap sa mga system na may malaking bilang ng mga thread ng CPU. Ang isang parameter ay idinagdag upang kontrolin ang bilang ng mga proseso ng optimizer
    "-param lto-max-streaming-parallelism";

    Bilang resulta, kumpara sa GCC 8.3, ang mga pag-optimize na ipinakilala sa GCC 9 pinapayagan bawasan ang oras ng compilation ng Firefox 5 at LibreOffice 66 ng humigit-kumulang 6.2.3%. Ang laki ng mga object file ay nabawasan ng 7%. Bumaba ng 8% ang oras ng pagbubuklod sa isang 11-core CPU. Ang sequential optimization stage ng linking stage ay 28% na mas mabilis at 20% na mas kaunting memory ang ginagamit. Ang pagkonsumo ng memorya ng bawat processor ng parallelized na yugto ng LTO ay bumaba ng 30%;

  • Karamihan sa mga parallel programming specification ay ipinatupad para sa C, C++ at Fortran na mga wika OpenACC 2.5, na tumutukoy sa mga tool para sa pag-offload ng mga operasyon sa mga GPU at mga dalubhasang processor gaya ng NVIDIA PTX;
  • Ang bahagyang suporta para sa pamantayan ay ipinatupad para sa C at C++ Buksan ang MP 5.0 (Open Multi-Processing), na tumutukoy sa API at mga paraan ng paglalapat ng mga parallel programming method para sa C, C++ at Fortran na mga wika sa mga multi-core at hybrid (CPU+GPU/DSP) system na may shared memory at vectorization units (SIMD) ;
  • Ang mga bagong babala ay idinagdag para sa wikang C: "-Waddress-of-packed-member" (hindi nakahanay na pointer value sa isang naka-pack na miyembro ng isang istraktura o unyon) at
    Β«-Wabsolute-halaga" (kapag nag-a-access ng mga function para sa pagkalkula ng isang ganap na halaga, kung mayroong isang mas angkop na function para sa tinukoy na argumento, halimbawa, fabs(3.14) ang dapat gamitin sa halip na abs(3.14). Idinagdag ang mga bagong babala para sa C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" at "-Wclass-conversion". Maraming naunang magagamit na mga babala ang pinalawak;

  • Nagdagdag ng pang-eksperimentong suporta para sa bahagi ng hinaharap na pamantayan ng wikang C, na may codenamed C2x. Upang paganahin ang suporta sa C2x, gamitin ang mga opsyon na "-std=c2x" at "-std=gnu2x" (upang paganahin ang mga extension ng GNU). Ang pamantayan ay nasa isang maagang yugto pa ng pag-unlad, samakatuwid, sa mga kakayahan nito, tanging ang ekspresyong _Static_assert na may isang argumento ang sinusuportahan (_Static_assert na may dalawang argumento ang na-standardize sa C11);
  • Ang suporta para sa pamantayang C++17 ay idineklara nang matatag. Sa frontend, ang mga kakayahan sa wika ng C++17 ay ganap na ipinatupad, at sa libstdc++, ang mga function ng library na tinukoy sa pamantayan ay malapit sa ganap na pagpapatupad;
  • Patuloy pagpapatupad mga elemento ng hinaharap na pamantayan ng C++2a. Halimbawa, idinagdag ang kakayahang magsama ng mga saklaw sa panahon ng pagsisimula, ipinatupad ang mga extension para sa mga expression ng lambda, naidagdag ang suporta para sa mga walang laman na miyembro ng mga istruktura ng data at naidagdag ang malamang/hindi malamang na mga katangian, ibinigay ang kakayahang tumawag sa mga virtual na function sa mga conditional na expression. , atbp.
    Upang paganahin ang suporta sa C++2a, gamitin ang mga opsyon na "-std=c++2a" at "-std=gnu++2a". Nagdagdag ng bit at version header file sa libstdc++ para sa C++2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible at std::type_identity traits, std::midpoint, std:: , std::bind_front,
    std::visit, std::is_constant_evaluated at std::assume_aligned, nagdagdag ng suporta para sa uri ng char8_t, ipinatupad ang kakayahang suriin ang prefix at suffix ng mga string (starts_with, ends_with);

  • Nagdagdag ng suporta para sa mga bagong processor ng ARM
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ malaki.LITTLE at Neoverse N1. Nagdagdag ng suporta para sa mga tagubiling ipinakilala sa Armv8.3-A para sa pagtatrabaho sa mga kumplikadong numero, pseudo-random number generation (rng) at memory tagging (memtag), pati na rin ang mga tagubilin para sa pagharang sa mga pag-atake na nauugnay sa speculative execution at operasyon ng branch prediction unit . Para sa arkitektura ng AArch64, may idinagdag na mode ng proteksyon mga intersection ng stack at heap (β€œ-fstack-clash-protection”). Para magamit ang mga feature ng Armv8.5-A architecture, idinagdag ang opsyong β€œ-march=armv8.5-a”

  • May kasama itong backend para sa pagbuo ng code para sa mga AMD GPU batay sa GCN microarchitecture. Kasalukuyang limitado ang pagpapatupad sa pagsasama-sama ng mga single-threaded na application (suporta para sa pagsasagawa ng mga multi-threaded na kalkulasyon sa pamamagitan ng OpenMP at OpenACC ay iaalok sa ibang pagkakataon) at suporta para sa GPU Fiji at Vega 10;
  • Nagdagdag ng bagong backend para sa mga processor OpenRISC;
  • Nagdagdag ng backend para sa mga processor C-SKY V2, na ginawa ng kumpanyang Tsino na may parehong pangalan para sa iba't ibang mga consumer device;
  • Ang lahat ng mga pagpipilian sa command line na nagpapatakbo ng mga halaga ng byte ay sumusuporta sa mga suffix na kb, KiB, MB, MiB, GB at GiB;
  • Ipinatupad ang opsyong β€œ-flive-patching=[inline-only-static|inline-clone]” ay nagbibigay-daan sa iyong makamit ang ligtas na compilation para sa mga live-patching system dahil sa multi-level na kontrol sa paggamit ng interprocedural (IPA) mga pag-optimize;
  • Nagdagdag ng opsyong "--completion" para sa pinong kontrol ng pagkumpleto ng opsyon kapag gumagamit ng bash;
  • Ang mga diagnostic tool ay nagbibigay ng mga pagpapakita ng mga sipi ng pinagmulang teksto na nagsasaad ng numero ng linya at biswal na pagmamarka ng kaugnay na impormasyon, gaya ng mga uri ng operand. Upang hindi paganahin ang pagpapakita ng mga numero at label ng linya, ang mga opsyon na "-fno-diagnostics-show-line-numbers" at "-fno-diagnostics-show-labels" ay ibinibigay;

    Paglabas ng GCC 9 compiler suite

  • Pinalawak mga tool para sa pag-diagnose ng mga error sa C++ code, pinahusay na pagiging madaling mabasa ng impormasyon tungkol sa mga sanhi ng mga error at pag-highlight ng mga may problemang parameter;

    Paglabas ng GCC 9 compiler suite

  • Idinagdag ang opsyon na "-fdiagnostics-format=json", na nagbibigay-daan sa pagbuo ng diagnostic output sa machine-readable na format (JSON);
  • Nagdagdag ng mga bagong opsyon sa pag-profile "-fprofile-filter-files" at "-fprofile-exclude-files" upang pumili ng mga source na file na ipoproseso;
  • Nagbibigay ang AddressSanitizer ng pagbuo ng mas compact na verification code para sa mga awtomatikong variable, na binabawasan ang pagkonsumo ng memory ng executable file na sinusuri;
  • Pinahusay na output sa "-fopt-infoΒ» (detalyadong impormasyon tungkol sa mga idinagdag na pag-optimize). Nagdagdag ng mga bagong prefix na "optimized" at "missed", bilang karagdagan sa dating available na prefix na "note". Nagdagdag ng output ng impormasyon tungkol sa paggawa ng desisyon sa inline-unfolding at vectorization ng mga cycle;
  • Idinagdag ang opsyong "-fsave-optimization-record", kapag tinukoy, sine-save ng GCC ang SRCFILE.opt-record.json.gz file na may paglalarawan ng mga desisyon sa paggamit ng ilang partikular na pag-optimize. Naiiba ang bagong opsyon sa mode na "-fopt-info" sa pamamagitan ng pagsasama ng karagdagang metadata, gaya ng impormasyon tungkol sa profile at mga inline na chain;
  • Nagdagdag ng mga opsyon na "-fipa-stack-alignment" at "-fipa-reference-addressable" upang kontrolin ang stack alignment at ang paggamit ng mga mode ng addressing (write-only o read-exact) para sa mga static na variable sa panahon ng interprocedural optimizations;
  • Ang mga bagong built-in na function ay ipinakilala upang kontrolin ang katangian na nagbubuklod pati na rin ang pag-uugali na nauugnay sa hula ng sangay at pagsasagawa ng speculative na pagtuturo: "__builtin_has_attributeΒ«,Β«__builtin_expect_with_probability"At"__builtin_speculation_safe_value". Isang bagong katangian ang naidagdag para sa mga function, variable at uri kopyahin;
  • Ang buong suporta para sa asynchronous na input/output ay ipinatupad para sa wikang Fortran;
  • Ang suporta para sa mga platform ng Solaris 10 (*-*-solaris2.10) at Cell/BE (Cell Broadband Engine SPU) ay hindi na ginagamit at aalisin sa susunod na pangunahing release. Ang suporta para sa mga arkitekturang Armv2, Armv3, Armv5 at Armv5E ay hindi na ipinagpatuloy. Ang suporta para sa Intel MPX (Memory Protection Extension) ay hindi na ipinagpatuloy.

Pinagmulan: opennet.ru

Magdagdag ng komento