C ++ Russia: ukuthi kwenzeke kanjani

Uma ekuqaleni komdlalo uthi kunekhodi ye-C++ elenga odongeni, ngakho-ke ekugcineni izokudubula onyaweni.

UBjarne Stroustrup

Kusukela ngo-Okthoba 31 kuya kuNovemba 1, ingqungquthela ye-C ++ yaseRussia Piter yayibanjelwe eSt. Izikhulumi eziyizihambeli zifaka amalungu e-C++ Standards Committee, izikhulumi ze-CppCon, ababhali bezincwadi ze-O'Reilly, nabanakekeli bamaphrojekthi afana ne-LLVM, i-libc++, ne-Boost. Le ngqungquthela ihloselwe onjiniyela abanolwazi lwe-C++ abafuna ukujulisa ubuchwepheshe babo futhi bashintshisane ngolwazi ekuxhumaneni okubukhoma. Abafundi, abafundi abaneziqu kanye nothisha basenyuvesi banikezwa izaphulelo ezinhle kakhulu.

Uhlelo lwaseMoscow lwale ngqungquthela luzotholakala ukuze luvakashelwe ekuqaleni kuka-April ngonyaka ozayo, kodwa okwamanje abafundi bethu bazokutshela ukuthi yiziphi izinto ezithakazelisayo abazifunde emcimbini wokugcina. 

C ++ Russia: ukuthi kwenzeke kanjani

Isithombe esivela ku i-albhamu yenkomfa

О нас

Abafundi ababili abavela e-National Research University Higher School of Economics - St. Petersburg basebenze kulokhu okuthunyelwe:

  • U-Liza Vasilenko ungumfundi owenza unyaka wesine owenza iziqu ezifunda i-Programming Languages ​​njengengxenye yohlelo lwe-Applied Mathematics kanye ne-Computer Science. Ngemva kokujwayelana nolimi lwe-C++ ngonyaka wami wokuqala enyuvesi, kamuva ngathola isipiliyoni sokusebenzisana nalo ngama-internship embonini. Intshisekelo yokuhlela izilimi ngokujwayelekile kanye nohlelo olusebenzayo ikakhulukazi ishiye uphawu ekukhethweni kwemibiko engqungqutheleni.
  • UDanya Smirnov ungumfundi we-1st wohlelo lwe-master's "Programming and Data Analysis". Ngisesikoleni, ngabhala izinkinga ze-Olympiad ku-C++, kwathi ngandlela-thile kwenzeka ukuthi ulimi luhlale luvela emisebenzini yokufundisa futhi ekugcineni lwaba ulimi oluyinhloko olusebenzayo. Nginqume ukubamba iqhaza engqungqutheleni ukuze ngithuthukise ulwazi lwami futhi ngifunde nangamathuba amasha.

Encwadini yezindaba, ubuholi bobuhlakani buvame ukwabelana ngolwazi mayelana nemicimbi yezemfundo ehlobene nekhono lethu elikhethekile. NgoSepthemba sibone imininingwane nge-C++ Russia futhi sanquma ukubhalisa njengabalaleli. Lesi isipiliyoni sethu sokuqala sokubamba iqhaza ezingqungqutheleni ezinjalo.

Isakhiwo senkomfa

  • Imibiko

Phakathi nezinsuku ezimbili, ochwepheshe bafunde imibiko engama-30, ehlanganisa izihloko eziningi ezishisayo: ukusetshenziswa okuhlakaniphile kwezici zolimi ukuxazulula izinkinga ezisetshenzisiwe, izibuyekezo zolimi ezizayo mayelana nendinganiso entsha, ukuyekethisa ekwakhiweni kwe-C++ kanye nezindlela zokuphepha lapho kusebenza nemiphumela yazo, izibonelo. yezakhiwo ezithokozisayo zephrojekthi, kanye neminye imininingwane engaphansi kwengqalasizinda yolimi. Amakhonsathi amathathu ayenzeka ngesikhathi esisodwa, ngokuvamile amabili ngesiRashiya futhi owodwa ngesiNgisi.

  • Izindawo zezingxoxo

Ngemva kwenkulumo, yonke imibuzo engabuzwanga kanye nezingxoxo ezingakaphothulwa zidluliselwe ezindaweni eziqokelwe ngokukhethekile ukuxhumana nezikhulumi, ezihlonyiswe ngamabhodi omaka. Indlela enhle ngenkathi ungekho ikhefu phakathi kwezinkulumo ngengxoxo emnandi.

  • Izinkulumo zombani kanye nezingxoxo ezingakahleleki

Uma ufuna ukunikeza umbiko omfushane, ungabhalisa ebhodini elimhlophe ukuze uthole Inkulumo Yombani wakusihlwa futhi uthole imizuzu emihlanu yesikhathi sokukhuluma nganoma yini esihlokweni senkomfa. Isibonelo, isingeniso esisheshayo se-sanitizer ye-C++ (kwabanye ibiyintsha) noma indaba emayelana nesiphazamisi esizukulwaneni se-sine wave esingazwakala kuphela, kodwa esingabonakali.

Enye indlela kuyingxoxo yephaneli ethi “IKomiti Yenhliziyo Esuka Enhliziyweni.” Esiteji kukhona amanye amalungu ekomidi lokumisa, kuprojektha indawo yomlilo (ngokusemthethweni - ukudala umoya oqotho, kodwa isizathu sokuthi "ngoba KONKE KUSEMLILWENI" kubonakala kuhlekisa), imibuzo mayelana nezinga kanye nombono jikelele we-C ++ , ngaphandle kwezingxoxo zobuchwepheshe ezishisayo nama-holiwars. Kuvele ukuthi leli komiti liqukethe nabantu abaphilayo okungenzeka ukuthi abaqiniseki nhlobo ngokuthile noma abangazi okuthile.

Kubalandeli bamaholidi, umcimbi wesithathu wawusele ecaleni - iseshini ye-BOF “Hamba ngokumelene ne-C++”. Sithatha isithandwa se-Go, isithandwa se-C++, ngaphambi kokuqala kweseshini balungiselela ndawonye amaslayidi angu-100500 esihlokweni (njengezinkinga zamaphakheji ku-C++ noma ukuntuleka kwamajenerikhi ku-Go), bese baba nengxoxo emnandi phakathi kwabo futhi nezilaleli, futhi izethameli zizama ukuqonda imibono emibili ngesikhathi esisodwa . Uma i-holivar iqala ngaphandle komongo, umongameli uyangenelela futhi abuyisane abathintekayo. Le fomethi iyalutha: amahora ambalwa ngemuva kokuqala, kwaqedwa uhhafu wamaslayidi kuphela. Ukuphela kwakufanele kusheshiswe kakhulu.

  • Uzakwethu umile

Abalingani bengqungquthela bebemelwe emahholo - ezinkundleni bakhulume ngamaphrojekthi akhona, banikeza ama-internship nokuqashwa, babamba imibuzo nemincintiswano emincane, baphinde bahlomula ngemiklomelo emihle. Ngasikhathi sinye, ezinye izinkampani zaze zanikela ngokudlula ezigabeni zokuqala zezingxoxo, ezingaba usizo kulabo abeza hhayi ukuzolalela imibiko kuphela.

Imininingwane yobuchwepheshe yemibiko

Silalele imibiko ngazo zombili izinsuku. Kwesinye isikhathi kwakuba nzima ukukhetha umbiko owodwa kulena ehambisanayo - savumelana ngokuhlukana sicobelelane ngolwazi esiluthole ngesikhathi sekhefu. Futhi noma kunjalo, kubonakala sengathi kuningi okushiywe ngaphandle. Lapha sithanda ukukhuluma ngokuqukethwe kweminye yemibiko esiyithole ithakazelisa kakhulu

Okuhlukile ku-C++ ngokusebenzisa i-prism ye-comiler optimizations, i-Roman Rusyaev

C ++ Russia: ukuthi kwenzeke kanjani
Slayida usuka izethulo

Njengoba isihloko sibonisa, u-Roman ubheke ukusebenza ngaphandle kokusebenzisa i-LLVM njengesibonelo. Ngasikhathi sinye, kulabo abangasebenzisi i-Clang emsebenzini wabo, umbiko usenganikeza umbono wokuthi ikhodi ingathuthukiswa kanjani. Lokhu kungenxa yokuthi abathuthukisi babadidiyeli nemitapo yolwazi ehambisanayo bayaxhumana futhi izixazululo eziningi eziphumelelayo zingaqondana.

Ngakho-ke, ukuze uphathe okuhlukile, udinga ukwenza izinto eziningi: shayela ikhodi yokusingatha (uma ikhona) noma izinsiza zamahhala ezingeni lamanje bese uphenya isitaki phezulu. Konke lokhu kuholela eqinisweni lokuthi umdidiyeli wengeza imiyalo eyengeziwe yamakholi okungenzeka alahle okuhlukile. Ngakho-ke, uma okuhlukile kungaphakanyiswanga ngempela, uhlelo lusazokwenza izenzo ezingadingekile. Ukuze ngandlela thize kwehliswe i-overhead, i-LLVM inama-heuristics ambalwa okunquma izimo lapho ikhodi yokuphatha okuhlukile ingadingi ukungezwa noma inombolo yemiyalelo "eyengeziwe" ingancishiswa.

Isikhulumi sihlola cishe ishumi nambili lazo futhi sibonisa zombili izimo lapho zisiza khona ukusheshisa ukwenziwa kohlelo, nalezo lapho lezi zindlela zingasebenzi khona.

Ngakho-ke, u-Roman Rusyaev uholela abafundi esiphethweni sokuthi ikhodi equkethe ukuphathwa okuhlukile ayikwazi ukukhishwa njalo nge-overhead engu-zero, futhi inikeza iseluleko esilandelayo:

  • lapho kwakhiwa imitapo yolwazi, kufanelekile ukushiya okuhlukile ngokomgomo;
  • uma okuhlukile kusadingeka, khona-ke noma nini lapho kunokwenzeka kufanelekile ukungeza izilungisi ezi-noexcept (kanye ne-const) yonke indawo ukuze umhlanganisi akwazi ukufeza okuningi ngangokunokwenzeka.

Ngokuvamile, isikhulumi siqinisekise umbono wokuthi okuhlukile kusetshenziswe kangcono okungenani noma kuyekwe ngokuphelele.

Amaslayidi ombiko ayatholakala kulesi sixhumanisi esilandelayo: [“Okuhlukile kwe-C++ ngelensi yokulungiselelwa komhlanganisi we-LLVM”]

Amajeneretha, ama-coroutine nobunye ubumnandi obuvula ingqondo, i-Adi Shavit

C ++ Russia: ukuthi kwenzeke kanjani
Slayida usuka izethulo

Omunye wemibiko eminingi kule ngqungquthela enikelwe ekusungulweni ku-C++20 awukhumbuleki nje kuphela ngesethulo sawo esimibalabala, kodwa nangokuhlonza kwawo okucacile kwezinkinga ezikhona ngokucubungula okunengqondo kweqoqo (ku-loop, callbacks).

I-Adi Shavit igqamisa lokhu okulandelayo: izindlela ezitholakalayo njengamanje zidlula kulo lonke iqoqo futhi azinikezi ukufinyelela kwesinye isimo sangaphakathi esiphakathi (noma zikwenza uma kushayelwa ucingo, kodwa ngenani elikhulu lemiphumela emibi engathandeki, njenge-Callback Hell) . Kungase kubonakale sengathi kukhona abaphindaphindayo, kodwa ngisho nabo yonke into ayibushelelezi kangako: awekho amaphuzu avamile okungena nokuphuma (qala → ukuphela ngokumelene ne-rbegin → rend njalonjalo), akucaci ukuthi sizophinda isikhathi esingakanani? Kusukela ngo-C++20, lezi zinkinga ziyaxazululwa!

Inketho yokuqala: ububanzi. Ngokugoqa ama-iterators, sithola isixhumi esibonakalayo esivamile sokuqala nesiphetho sokuphindaphinda, futhi sithola nekhono lokuqamba. Konke lokhu kwenza kube lula ukwakha amapayipi okucubungula idatha agcwele. Kodwa akuyona yonke into ebushelelezi: ingxenye ye-logic yokubala itholakala ngaphakathi kokuqaliswa kwe-iterator ethile, engenza ikhodi ibe nzima ukuyiqonda futhi isuse iphutha.

C ++ Russia: ukuthi kwenzeke kanjani
Slayida usuka izethulo

Nokho, kuleli cala, i-C++20 yengeze ama-coroutines (imisebenzi eziphatha ngendlela efana namajeneretha ku-Python): ukukhishwa kungahlehliswa ngokubuyisela inani lamanje ngenkathi kugcinwa isimo esimaphakathi. Ngakho-ke, asizuzi nje kuphela ukusebenza ngedatha njengoba ibonakala, kodwa futhi sihlanganisa yonke i-logic ngaphakathi kwe-coroutine ethile.

Kodwa kukhona impukane emafutheni: okwamanje asekelwa kancane kuphela ngabahlanganisi abakhona, futhi futhi akusetshenziswanga kahle ngendlela esingathanda ngayo: isibonelo, akukafaneli ukusebenzisa izinkomba nezinto zesikhashana kuma-coroutines. Futhi, kunemikhawulo ethile kulokho okungaba ama-coroutines, futhi imisebenzi ye-constexpr, abakhi/ababhubhisi, kanye nokuyinhloko akufakiwe kulolu hlu.

Ngakho, ama-coroutines axazulula ingxenye ebalulekile yezinkinga ngobulula bokucubungula idatha, kodwa ukuqaliswa kwawo kwamanje kudinga ukuthuthukiswa.

Izinto zokwakha:

Amaqhinga we-C++ avela ku-Yandex.Taxi, u-Anton Polukhin

Emisebenzini yami yobungcweti, kwesinye isikhathi kufanele ngenze izinto ezisizayo kuphela: ukugoqa phakathi kokusebenzelana kwangaphakathi ne-API yomtapo wolwazi othile, ukugawula noma ukuhlukanisa. Kulokhu, ngokuvamile asikho isidingo sanoma yikuphi ukulungiselelwa okwengeziwe. Kodwa kuthiwani uma lezi zingxenye zisetshenziswa kwezinye zezinsizakalo ezidume kakhulu ku-RuNet? Esimeni esinjalo, kuzodingeka ucubungule ama-terabyte ngehora lezingodo wedwa! Khona-ke yonke i-millisecond ibala futhi ngakho-ke kufanele usebenzise amaqhinga ahlukahlukene - u-Anton Polukhin wakhuluma ngawo.

Mhlawumbe isibonelo esithakazelisa kakhulu kwakuwukuqaliswa kwephethini ye-pointer-to-implementation (pimpl). 

#include <third_party/json.hpp> //PROBLEMS! 
struct Value { 
    Value() = default; 
    Value(Value&& other) = default; 
    Value& operator=(Value&& other) = default; 
    ~Value() = default; 

    std::size_t Size() const { return data_.size(); } 

private: 
    third_party::Json data_; 
};

Kulesi sibonelo, okokuqala ngifuna ukususa amafayela enhlokweni wemitapo yolwazi yangaphandle - lokhu kuzohlanganisa ngokushesha, futhi ungazivikela ekungqubuzaneni kwamagama okungenzeka namanye amaphutha afanayo. 

Kulungile, sihambise okuthi #include kufayela le-.cpp: sidinga isimemezelo esingaphambili se-API esongwe, kanye ne-std::unique_ptr. Manje sinokunikezwa okuguquguqukayo nezinye izinto ezingajabulisi njengedatha esabalele kwinqwaba yedatha neziqinisekiso ezincishisiwe. std::aligned_storage ingasiza kukho konke lokhu. 

struct Value { 
// ... 
private: 
    using JsonNative = third_party::Json; 
    const JsonNative* Ptr() const noexcept; 
    JsonNative* Ptr() noexcept; 

    constexpr std::size_t kImplSize = 32; 
    constexpr std::size_t kImplAlign = 8; 
    std::aligned_storage_t<kImplSize, kImplAlign> data_; 
};

Inkinga kuphela: sidinga ukucacisa usayizi nokuqondanisa kwe-wrapper ngayinye - masenze ithempulethi yethu ye-pimpl ngamapharamitha , sisebenzise amanani angenangqondo bese sengeza isheke kumbhubhisi ukuthi siqagele ukuthi konke kulungile. : 

~FastPimpl() noexcept { 
    validate<sizeof(T), alignof(T)>(); 
    Ptr()->~T(); 
}

template <std::size_t ActualSize, std::size_t ActualAlignment>
static void validate() noexcept { 
    static_assert(
        Size == ActualSize, 
        "Size and sizeof(T) mismatch"
    ); 
    static_assert(
        Alignment == ActualAlignment, 
        "Alignment and alignof(T) mismatch"
    ); 
}

Njengoba i-T isivele ichaziwe lapho kucutshungulwa umbhubhisi, le khodi izocutshungulwa ngendlela efanele futhi esigabeni sokuhlanganiswa izokhipha usayizi odingekayo namanani wokuqondanisa adinga ukufakwa njengamaphutha. Ngakho-ke, ngezindleko zokwenziwa okukodwa kokuhlanganiswa okungeziwe, sisusa ukwabiwa okuguquguqukayo kwamakilasi asongiwe, sifihle i-API kufayela le-.cpp ngokusetshenziswa, futhi sithole nomklamo ofaneleka kakhulu ukugcinwa kunqolobane yi-processor.

Ukugawula nokuhlukanisa kubonakale kungathandeki ngakho-ke ngeke kukhulunywe ngakho kulokhu kubuyekezwa.

Amaslayidi ombiko ayatholakala kulesi sixhumanisi esilandelayo: ["Amaqhinga ka-C++ etekisini"]

Amasu wesimanje wokugcina ikhodi yakho SOMILE, Björn Fahller

Kule nkulumo, u-Björn Fahller ukhombisa izindlela ezimbalwa ezihlukene zokulwa nephutha lesitayela lokuhlolwa kwesimo okuphindaphindiwe:

assert(a == IDLE || a == CONNECTED || a == DISCONNECTED);

Uzwakala ujwayelekile? Ngokusebenzisa izindlela ezimbalwa ezinamandla ze-C++ ezethulwe kumazinga akamuva, ungakwazi ukusebenzisa kahle umsebenzi ofanayo ngaphandle kwesijeziso sokusebenza. Qhathanisa:   

assert(a == any_of(IDLE, CONNECTED, DISCONNECTED));

Ukuze uphathe inani elingalungisiwe lokuhlola, udinga ngokushesha ukusebenzisa izifanekiso ze-variadic nezinkulumo ezigoqa. Ake sicabange ukuthi sifuna ukuhlola ukulingana kokuguquguquka okuningana kusici se-state_type se-enum. Into yokuqala efika emqondweni ukubhala umsebenzi womsizi uthi_noma yikuphi_ku:


enum state_type { IDLE, CONNECTED, DISCONNECTED };

template <typename ... Ts>
bool is_any_of(state_type s, const Ts& ... ts) { 
    return ((s == ts) || ...); 
}

Lo mphumela ophakathi uyadumaza. Kuze kube manje ikhodi ayisafundeki kakhulu:

assert(is_any_of(state, IDLE, DISCONNECTING, DISCONNECTED)); 

Izinhlaka zesifanekiso ezingezona uhlobo zizosiza ukuthuthukisa isimo kancane. Ngosizo lwabo, sizodlulisela izakhi ze-enum ohlwini lwamapharamitha wesifanekiso: 

template <state_type ... states>
bool is_any_of(state_type t) { 
    return ((t == states) | ...); 
}
	
assert(is_any_of<IDLE, DISCONNECTING, DISCONNECTED>(state)); 

Ngokusebenzisa okuzenzakalelayo kupharamitha yesifanekiso esingelona uhlobo (C++17), indlela yokwenza imane ilinganisele ekuqhathaniseni hhayi kuphela nezinto ze-state_type, kodwa futhi nezinhlobo zakudala ezingasetshenziswa njengamapharamitha ezifanekiso ezingezona uhlobo:


template <auto ... alternatives, typename T>
bool is_any_of(const T& t) {
    return ((t == alternatives) | ...);
}

Ngalokhu kuthuthuka okulandelanayo, i-syntax efiselekayo yokuhlola iyafinyelelwa:


template <class ... Ts>
struct any_of : private std::tuple<Ts ...> { 
// поленимся и унаследуем конструкторы от tuple 
        using std::tuple<Ts ...>::tuple;
        template <typename T>
        bool operator ==(const T& t) const {
                return std::apply(
                        [&t](const auto& ... ts) {
                                return ((ts == t) || ...);
                        },
                        static_cast<const std::tuple<Ts ...>&>(*this));
        }
};

template <class ... Ts>
any_of(Ts ...) -> any_of<Ts ... >;
 
assert(any_of(IDLE, DISCONNECTING, DISCONNECTED) == state);

Kulesi sibonelo, umhlahlandlela wokudonswa kwemali usebenzela ukuphakamisa amapharamitha esifanekiso sesakhiwo esifunekayo kumhlanganisi, owazi izinhlobo zezimpikiswano zomakhi. 

Okwengeziwe - okuthakazelisayo kakhulu. I-Bjorn ifundisa ukuthi yenziwa kanjani ngokujwayelekile ikhodi ewumphumela yokuqhathanisa opharetha ngale kwe-==, bese kuba nemisebenzi engafanele. Endleleni, izici ezifana ne-no_unique_address attribute (C++20) kanye nemingcele yesifanekiso emisebenzini ye-lambda (C++20) zichazwa kusetshenziswa izibonelo zokusetshenziswa. (Yebo, manje i-syntax ye-lambda kulula nakakhulu ukuyikhumbula - lawa amapheya amane alandelanayo abakaki bazo zonke izinhlobo.) Isixazululo sokugcina sisebenzisa imisebenzi njengemininingwane yomakhi iyawufudumeza ngempela umphefumulo wami, ingasaphathwa eyenkulumo ethi tuple kumasiko angcono kakhulu we-lambda. isibali.

Ekugcineni, ungakhohlwa ukuyipholisha:

  • Khumbula ukuthi ama-lambda angama-constexpr mahhala; 
  • Ake sengeze ukudlulisela phambili okuphelele futhi sibheke i-syntax yayo embi ngokuphathelene nephakethe lepharamitha ekuvaleni kwe-lambda;
  • Ake sinikeze umdidiyeli amathuba engeziwe okuthuthukisa ngokungafani nemibandela; 
  • Masinakekele ukuphuma kwephutha okuqondakala kakhudlwana kuzifanekiso ngenxa yamanani okubuyisela asobala we-lambdas. Lokhu kuzophoqa umhlanganisi ukuthi enze ukuhlola okwengeziwe ngaphambi kokuthi umsebenzi wesifanekiso ubizwe ngempela - esigabeni sokuhlola uhlobo. 

Ukuze uthole imininingwane, sicela ubheke izinto zokufunda: 

Imibono yethu

Ukubamba kwethu iqhaza kokuqala ku-C++ Russia kwakukhumbuleka ngokuqina kwayo. Ngithole umbono we-C ++ Russia njengomcimbi oqotho, lapho umugqa phakathi kokuqeqeshwa nokuxhumana okubukhoma ucishe ungabonakali. Konke, kusukela emoyeni wezikhulumi kuya emiqhudelwaneni kusukela kozakwethu bomcimbi, kulungele izingxoxo ezishisayo. Okuqukethwe kwengqungquthela, okuhlanganisa imibiko, kuhlanganisa izihloko eziningi ezihlanganisa ukuqanjwa kabusha kwe-C++, izibonelo zamaphrojekthi amakhulu nokucatshangelwa kwemibono yezakhiwo. Kodwa kungaba okungalungile ukungaziba ingxenye yenhlalo yomcimbi, esiza ukunqoba izithiyo zolimi maqondana hhayi kuphela ne-C++.

Sibonga abahleli benkomfa ngethuba lokubamba iqhaza kumcimbi onjalo!
Kungenzeka ukuthi ukubonile okuthunyelwe kwabahleli mayelana nesikhathi esedlule, samanje nekusasa le-C++ Russia kubhulogi ye-JUG Ru.

Siyabonga ngokufunda, futhi sithemba ukuthi ukulandisa kwethu kabusha kwemicimbi kube usizo!

Source: www.habr.com

Engeza amazwana