ఒక సంవత్సరం అభివృద్ధి తర్వాత ప్రచురించిన కంపైలర్ల ఉచిత సెట్ విడుదల 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 కోసం బ్యాకెండ్లు.
D ప్రోగ్రామింగ్ లాంగ్వేజ్కు మద్దతు జోడించబడింది. GCC కంపైలర్తో ఫ్రంటెండ్ని కలిగి ఉంటుంది GDC (Gnu D కంపైలర్) మరియు రన్టైమ్ లైబ్రరీలు (libphobos), ఇది D ప్రోగ్రామింగ్ లాంగ్వేజ్లో ప్రోగ్రామ్లను రూపొందించడానికి ప్రామాణిక GCCని ఉపయోగించడానికి మిమ్మల్ని అనుమతిస్తుంది. GCCలో D లాంగ్వేజ్ మద్దతును ప్రారంభించే ప్రక్రియ మొదలైంది తిరిగి 2011లో, కానీ లాగబడిన GCC అవసరాలకు అనుగుణంగా కోడ్ను తీసుకురావాల్సిన అవసరం మరియు D ప్రోగ్రామింగ్ లాంగ్వేజ్ని అభివృద్ధి చేస్తున్న డిజిటల్ మార్స్కు మేధో సంపత్తి హక్కుల బదిలీకి సంబంధించిన సమస్యల కారణంగా;
కోడ్ జనరేటర్కు మెరుగుదలలు చేయబడ్డాయి. ఉదాహరణకు, పరిస్థితులను బట్టి స్విచ్ ఎక్స్ప్రెషన్లను (జంప్ టేబుల్, బిట్ టెస్ట్, డెసిషన్ ట్రీ) విస్తరించడానికి వివిధ వ్యూహాల ఉపయోగం అమలు చేయబడింది. “-ftree-switch-conversion” ఆప్టిమైజేషన్ ఉపయోగించి స్విచ్ వ్యక్తీకరణను కలిగి ఉండే లీనియర్ ఫంక్షన్లను మార్చగల సామర్థ్యం జోడించబడింది (ఉదాహరణకు, “కేస్ 2: how = 205; బ్రేక్; కేస్ 3: how = 305; బ్రేక్ వంటి షరతుల సమితి ;” "100 * ఎలా + 5"కి మార్చబడుతుంది;
మెరుగైన ఇంటర్ప్రొసీడ్యూరల్ ఆప్టిమైజేషన్లు. ఆధునిక C++ కోడ్బేస్ల కోసం ఇన్లైన్ విస్తరణ సెట్టింగ్లు స్వీకరించబడ్డాయి మరియు కొత్త పారామీటర్లతో max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns మరియు అన్లైన్డ్ పారామీటర్లతో విస్తరించబడ్డాయి. -ధంక్-టైమ్. కోల్డ్/హాట్ కోడ్ విభజన యొక్క మెరుగైన ఖచ్చితత్వం మరియు దూకుడు. చాలా పెద్ద కోసం మెరుగైన స్కేలబిలిటీ అనువాద యూనిట్లు (ఉదాహరణకు, పెద్ద ప్రోగ్రామ్లకు లింక్ చేసే దశలో ఆప్టిమైజేషన్ని వర్తింపజేసేటప్పుడు);
కోడ్ ప్రొఫైలింగ్ (PGO - ప్రొఫైల్-గైడెడ్ ఆప్టిమైజేషన్) ఫలితాల ఆధారంగా ఆప్టిమైజేషన్ మెకానిజం మెరుగుపరచబడింది, ఇది కోడ్ అమలు లక్షణాల విశ్లేషణ ఆధారంగా మరింత అనుకూలమైన కోడ్ను ఉత్పత్తి చేస్తుంది. సారాంశం ఎంపిక "-fprofile-ఉపయోగం" ఇప్పుడు ఆప్టిమైజేషన్ మోడ్లు "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" మరియు "-ftree-loop-distribution" ఉన్నాయి. ఫైల్లలో కౌంటర్లతో హిస్టోగ్రామ్లను చేర్చడం తీసివేయబడింది, ఇది ప్రొఫైల్లతో ఫైల్ల పరిమాణాన్ని తగ్గించింది (లింకింగ్ సమయంలో ఆప్టిమైజేషన్లను చేస్తున్నప్పుడు హిస్టోగ్రామ్లు ఇప్పుడు ఫ్లైలో ఉత్పత్తి చేయబడతాయి);
మెరుగైన లింకింగ్ టైమ్ ఆప్టిమైజేషన్లు (LTO). ఫలితాన్ని రూపొందించడానికి ముందు రకాల సరళీకరణ అందించబడింది, ఇది LTO ఆబ్జెక్ట్ ఫైల్ల పరిమాణాన్ని గణనీయంగా తగ్గించడం, బైండింగ్ దశలో మెమరీ వినియోగాన్ని తగ్గించడం మరియు ఆపరేషన్ల సమాంతరీకరణను మెరుగుపరచడం సాధ్యపడింది. విభజనల సంఖ్య (-param lto-partitions) 32 నుండి 128కి పెంచబడింది, ఇది పెద్ద సంఖ్యలో CPU థ్రెడ్లు ఉన్న సిస్టమ్లపై పనితీరును మెరుగుపరుస్తుంది. ఆప్టిమైజర్ ప్రక్రియల సంఖ్యను నియంత్రించడానికి ఒక పరామితి జోడించబడింది
"-పరం lto-max-streaming-parallelism";
ఫలితంగా, GCC 8.3తో పోలిస్తే, GCC 9లో ప్రవేశపెట్టబడిన ఆప్టిమైజేషన్లు అనుమతించబడింది Firefox 5 మరియు LibreOffice 66 సంకలన సమయాన్ని దాదాపు 6.2.3% తగ్గించండి. ఆబ్జెక్ట్ ఫైల్ల పరిమాణం 7% తగ్గింది. 8-కోర్ CPUలో బైండింగ్ సమయం 11% తగ్గింది. లింకింగ్ దశ యొక్క సీక్వెన్షియల్ ఆప్టిమైజేషన్ దశ ఇప్పుడు 28% వేగంగా ఉంది మరియు 20% తక్కువ మెమరీని వినియోగిస్తుంది. LTO యొక్క సమాంతర దశ యొక్క ప్రతి ప్రాసెసర్ యొక్క మెమరీ వినియోగం 30% తగ్గింది;
C, C++ మరియు Fortran భాషలకు సమాంతర ప్రోగ్రామింగ్ స్పెసిఫికేషన్ చాలా వరకు అమలు చేయబడుతుంది OpenACC 2.5, ఇది GPUలు మరియు NVIDIA PTX వంటి ప్రత్యేక ప్రాసెసర్లపై ఆఫ్లోడింగ్ కార్యకలాపాల కోసం సాధనాలను నిర్వచిస్తుంది;
ప్రమాణానికి పాక్షిక మద్దతు C మరియు C++ కోసం అమలు చేయబడింది MP 5.0ని తెరవండి (ఓపెన్ మల్టీ-ప్రాసెసింగ్), ఇది భాగస్వామ్య మెమరీ మరియు వెక్టరైజేషన్ యూనిట్లతో (SIMD) మల్టీ-కోర్ మరియు హైబ్రిడ్ (CPU+GPU/DSP) సిస్టమ్లపై C, C++ మరియు Fortran భాషల కోసం API మరియు సమాంతర ప్రోగ్రామింగ్ పద్ధతులను వర్తించే పద్ధతులను నిర్వచిస్తుంది. ;
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 ప్రమాణానికి మద్దతు స్థిరంగా ప్రకటించబడింది. ఫ్రంటెండ్లో, C++17 యొక్క భాషా సామర్థ్యాలు పూర్తిగా అమలు చేయబడతాయి మరియు libstdc++లో, స్టాండర్డ్లో నిర్వచించబడిన లైబ్రరీ ఫంక్షన్లు పూర్తి అమలుకు దగ్గరగా ఉంటాయి;
కొనసాగింది సాక్షాత్కారము భవిష్యత్ C++2a ప్రమాణం యొక్క అంశాలు. ఉదాహరణకు, ప్రారంభ సమయంలో పరిధులను చేర్చే సామర్థ్యం జోడించబడింది, లాంబ్డా వ్యక్తీకరణల కోసం పొడిగింపులు అమలు చేయబడ్డాయి, డేటా స్ట్రక్చర్ల యొక్క ఖాళీ సభ్యులకు మద్దతు మరియు అవకాశం/అసంభవనీయమైన లక్షణాలు జోడించబడ్డాయి, షరతులతో కూడిన వ్యక్తీకరణలలో వర్చువల్ ఫంక్షన్లను కాల్ చేసే సామర్థ్యం అందించబడింది. , మొదలైనవి
C++2a మద్దతును ప్రారంభించడానికి, "-std=c++2a" మరియు "-std=gnu++2a" ఎంపికలను ఉపయోగించండి. C++2a కోసం libstdc++కి బిట్ మరియు వెర్షన్ హెడర్ ఫైల్లు జోడించబడ్డాయి, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible మరియు std::type_identity traits::stdmi pointlerp: , std::bind_front,
std::visit, std::is_constant_evaluated మరియు std::assume_aligned, char8_t రకానికి మద్దతు జోడించబడింది, స్ట్రింగ్ల ఉపసర్గ మరియు ప్రత్యయాన్ని తనిఖీ చేసే సామర్థ్యాన్ని అమలు చేసింది (ప్రారంభం_విత్, ముగుస్తుంది_విత్);
కొత్త ARM ప్రాసెసర్లకు మద్దతు జోడించబడింది
Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE మరియు నియోవర్స్ N1. సంక్లిష్ట సంఖ్యలు, సూడో-రాండమ్ నంబర్ జనరేషన్ (rng) మరియు మెమరీ ట్యాగింగ్ (మెమ్ట్యాగ్), అలాగే బ్రాంచ్ ప్రిడిక్షన్ యూనిట్ యొక్క ఊహాజనిత అమలు మరియు ఆపరేషన్కు సంబంధించిన దాడులను నిరోధించే సూచనలతో పని చేయడానికి Armv8.3-Aలో ప్రవేశపెట్టిన సూచనలకు మద్దతు జోడించబడింది. . 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) ఆప్టిమైజేషన్లు;
బాష్ని ఉపయోగిస్తున్నప్పుడు ఎంపికను పూర్తి చేయడం యొక్క సూక్ష్మ నియంత్రణ కోసం "--పూర్తి" ఎంపిక జోడించబడింది;
రోగనిర్ధారణ సాధనాలు లైన్ నంబర్ను సూచించే సోర్స్ టెక్స్ట్ ఎక్సెర్ప్ట్ల డిస్ప్లేలను అందిస్తాయి మరియు ఆపరాండ్ రకాలు వంటి సంబంధిత సమాచారాన్ని దృశ్యమానంగా గుర్తు చేస్తాయి. లైన్ నంబర్లు మరియు లేబుల్ల ప్రదర్శనను నిలిపివేయడానికి, “-fno-diagnostics-show-line-numbers” మరియు “-fno-diagnostics-show-labels” ఎంపికలు అందించబడతాయి;
విస్తరించింది C++ కోడ్లో లోపాలను నిర్ధారించడానికి సాధనాలు, లోపాల కారణాల గురించి సమాచారం యొక్క మెరుగైన రీడబిలిటీ మరియు సమస్యాత్మక పారామితులను హైలైట్ చేయడం;
"-fdiagnostics-format=json" ఎంపిక జోడించబడింది, ఇది మెషిన్-రీడబుల్ ఫార్మాట్లో (JSON) డయాగ్నస్టిక్ అవుట్పుట్ను రూపొందించడానికి అనుమతిస్తుంది;
ప్రాసెస్ చేయవలసిన సోర్స్ ఫైల్లను ఎంచుకోవడానికి కొత్త ప్రొఫైలింగ్ ఎంపికలు “-fprofile-filter-files” మరియు “-fprofile-exclude-files” జోడించబడ్డాయి;
అడ్రస్ శానిటైజర్ ఆటోమేటిక్ వేరియబుల్స్ కోసం మరింత కాంపాక్ట్ వెరిఫికేషన్ కోడ్ను అందిస్తుంది, ఇది తనిఖీ చేయబడుతున్న ఎక్జిక్యూటబుల్ ఫైల్ మెమరీ వినియోగాన్ని తగ్గిస్తుంది;
"లో మెరుగైన అవుట్పుట్-fopt-info» (జోడించిన ఆప్టిమైజేషన్ల గురించి వివరణాత్మక సమాచారం). గతంలో అందుబాటులో ఉన్న "గమనిక" ఉపసర్గకు అదనంగా "ఆప్టిమైజ్" మరియు "తప్పిపోయిన" కొత్త ఉపసర్గలు జోడించబడ్డాయి. ఇన్లైన్-అన్ఫోల్డింగ్ మరియు సైకిల్స్ వెక్టరైజేషన్పై నిర్ణయం తీసుకోవడం గురించి సమాచారం యొక్క అవుట్పుట్ జోడించబడింది;
“-fsave-optimization-record” ఎంపిక జోడించబడింది, పేర్కొన్నప్పుడు, GCC SRCFILE.opt-record.json.gz ఫైల్ను నిర్దిష్ట ఆప్టిమైజేషన్ల ఉపయోగంపై నిర్ణయాల వివరణతో సేవ్ చేస్తుంది. ప్రొఫైల్ మరియు ఇన్లైన్ చైన్ల గురించి సమాచారం వంటి అదనపు మెటాడేటాను చేర్చడం ద్వారా కొత్త ఎంపిక “-fopt-info” మోడ్కు భిన్నంగా ఉంటుంది;
స్టాక్ అలైన్మెంట్ను నియంత్రించడానికి “-fipa-stack-alignment” మరియు “-fipa-reference-addressable” ఎంపికలు జోడించబడ్డాయి మరియు ఇంటర్ప్రొసీడ్యూరల్ ఆప్టిమైజేషన్ల సమయంలో స్టాటిక్ వేరియబుల్స్ కోసం అడ్రసింగ్ మోడ్లను (వ్రాయడానికి-మాత్రమే లేదా చదవడానికి-ఖచ్చితంగా) ఉపయోగించడం;
బ్రాంచ్ ప్రిడిక్షన్ మరియు స్పెక్యులేటివ్ ఇన్స్ట్రక్షన్ ఎగ్జిక్యూషన్కు సంబంధించిన అట్రిబ్యూట్ బైండింగ్ అలాగే ప్రవర్తనను నియంత్రించడానికి కొత్త అంతర్నిర్మిత ఫంక్షన్లు ప్రవేశపెట్టబడ్డాయి: "__బిల్టిన్_ఉంది_లక్షణం" 'సంభావ్యతతో_నిర్ధారణ_అంచనా"మరియు"__builtin_speculation_safe_value". ఫంక్షన్లు, వేరియబుల్స్ మరియు రకాల కోసం కొత్త లక్షణం జోడించబడింది కాపీని;
ఫోర్ట్రాన్ భాష కోసం అసమకాలిక ఇన్పుట్/అవుట్పుట్ కోసం పూర్తి మద్దతు అమలు చేయబడింది;
Solaris 10 (*-*-solaris2.10) మరియు సెల్/BE (సెల్ బ్రాడ్బ్యాండ్ ఇంజిన్ SPU) ప్లాట్ఫారమ్లకు మద్దతు నిలిపివేయబడింది మరియు తదుపరి ప్రధాన విడుదలలో తీసివేయబడుతుంది. Armv2, Armv3, Armv5 మరియు Armv5E ఆర్కిటెక్చర్లకు మద్దతు నిలిపివేయబడింది. Intel MPX (మెమరీ ప్రొటెక్షన్ ఎక్స్టెన్షన్స్)కి మద్దతు నిలిపివేయబడింది.