C++ Russia: giunsa kini nahitabo

Kung sa sinugdanan sa dula moingon ka nga adunay C ++ code nga nagbitay sa bungbong, unya sa katapusan kini kinahanglan nga mopusil kanimo sa tiil.

Bjarne Stroustrup

Gikan sa Oktubre 31 ngadto sa Nobyembre 1, ang C++ Russia Piter nga komperensya gihimo sa St. Petersburg - usa sa dagkong mga komperensya sa programming sa Russia, nga giorganisar sa JUG Ru Group. Ang giimbitar nga mga mamumulong naglakip sa mga miyembro sa C++ Standards Committee, CppCon speakers, O'Reilly book authors, ug maintainers sa mga proyekto sama sa LLVM, libc++, ug Boost. Ang komperensya gitumong sa mga eksperyensiyadong C++ developers nga gustong mopalalom sa ilang kahanas ug magbayloay og mga kasinatian sa live communication. Ang mga estudyante, graduate nga mga estudyante ug mga magtutudlo sa unibersidad gihatagan og nindot kaayo nga mga diskwento.

Ang Moscow nga edisyon sa komperensya mahimong magamit sa pagbisita sa sayo pa sa Abril sa sunod tuig, apan sa kasamtangan ang among mga estudyante mosulti kanimo unsa nga makapaikag nga mga butang ang ilang nakat-unan sa katapusan nga kalihokan. 

C++ Russia: giunsa kini nahitabo

Litrato gikan sa album sa komperensya

О нас

Duha ka estudyante gikan sa National Research University Higher School of Economics - St. Petersburg nagtrabaho niini nga post:

  • Si Liza Vasilenko usa ka 4th year undergraduate nga estudyante nga nagtuon sa Programming Languages ​​​​as bahin sa programa sa Applied Mathematics ug Computer Science. Nasinati nako ang C ++ nga lengguwahe sa akong unang tuig sa unibersidad, nakabaton ako og kasinatian sa pagtrabaho niini pinaagi sa mga internship sa industriya. Ang akong kahinam alang sa mga programming language sa kinatibuk-an ug functional programming sa partikular nagbilin sa marka niini sa pagpili sa mga taho sa komperensya.
  • Si Danya Smirnov usa ka 1st year nga estudyante sa programa sa master nga "Programming and Data Analysis". Samtang naa pa sa eskuylahan, gisulat nako ang mga problema sa Olympiad sa C ++, ug pagkahuman nahitabo nga ang pinulongan kanunay nga mitungha sa mga kalihokan sa edukasyon ug sa kadugayan nahimo nga panguna nga sinultian nga nagtrabaho. Nakahukom ko nga moapil sa komperensya aron mapalambo ang akong kahibalo ug makat-on usab bahin sa bag-ong mga oportunidad.

Sa newsletter, ang pamunuan sa faculty kanunay nga nagpaambit sa kasayuran bahin sa mga pang-edukasyon nga panghitabo nga may kalabotan sa among espesyalidad. Niadtong Septembre nakakita kami og impormasyon mahitungod sa C++ Russia ug nakahukom nga magparehistro isip tigpaminaw. Kini ang among unang kasinatian sa pag-apil sa maong mga komperensya.

Istruktura sa komperensya

  • Mga report

Sulod sa duha ka adlaw, gibasa sa mga eksperto ang 30 ka mga taho, nga naglangkob sa daghang mainit nga mga hilisgutan: mamugnaon nga paggamit sa mga bahin sa pinulongan aron masulbad ang mga problema nga gipadapat, umaabot nga mga update sa pinulongan kalabot sa bag-ong sumbanan, mga pagkompromiso sa disenyo sa C ++ ug mga pag-amping sa pagtrabaho sa ilang mga sangputanan, mga pananglitan sa makaiikag nga arkitektura sa proyekto, ingon man ang pipila ka mga detalye sa ilawom sa imprastraktura sa pinulongan. Tulo ka pasundayag ang dungan nga nahitabo, kasagaran duha sa Russian ug usa sa English.

  • Mga dapit sa panaghisgot

Human sa pakigpulong, ang tanan nga wala mapangutana nga mga pangutana ug wala mahuman nga mga diskusyon gibalhin ngadto sa espesyal nga gitudlo nga mga dapit alang sa komunikasyon uban sa mga mamumulong, nga adunay mga marker board. Usa ka maayong paagi sa pagpalayo sa pahulay tali sa mga pakigpulong nga adunay usa ka makapahimuot nga panag-istoryahanay.

  • Mga Pakigpulong sa Kilat ug dili pormal nga mga diskusyon

Kung gusto nimo maghatag usa ka mubo nga taho, mahimo kang magpalista sa whiteboard para sa Lightning Talk sa gabii ug makakuha ug lima ka minuto nga oras sa paghisgot bahin sa bisan unsang hilisgutan sa komperensya. Pananglitan, usa ka dali nga pagpaila sa mga sanitizer alang sa C ++ (para sa uban bag-o kini) o usa ka istorya bahin sa usa ka bug sa henerasyon sa sine wave nga madungog ra, apan dili makita.

Ang laing pormat mao ang panel discussion nga “With a Heart to Heart Committee.” Sa entablado mao ang pipila ka mga miyembro sa standardization committee, sa projector mao ang usa ka fireplace (opisyal nga - sa paghimo sa usa ka sinsero nga atmospera, apan ang rason "tungod kay ang tanan anaa sa kalayo" daw funnier), mga pangutana mahitungod sa sumbanan ug sa kinatibuk-ang panan-awon sa C ++ , nga walay init nga teknikal nga mga diskusyon ug mga holiwar. Nahibal-an nga ang komite naglangkob usab sa mga buhi nga mga tawo nga mahimo’g dili hingpit nga sigurado sa usa ka butang o mahimo’g wala’y nahibal-an.

Para sa mga fans sa holivar, ang ikatulo nga kalihokan nagpabilin sa kaso - ang BOF session "Go vs. C++". Gikuha namo ang usa ka Go lover, usa ka C++ lover, sa wala pa magsugod ang sesyon nag-uban sila sa pag-andam sa 100500 ka mga slide sa usa ka hilisgutan (sama sa mga problema sa mga pakete sa C ++ o ang kakulang sa generics sa Go), ug dayon sila adunay usa ka buhi nga diskusyon sa ilang mga kaugalingon ug uban sa mamiminaw, ug ang mamiminaw naningkamot sa pagsabot sa duha ka punto sa panglantaw sa usa ka higayon . Kung ang usa ka holivar magsugod sa gawas sa konteksto, ang moderator mangilabot ug makig-uli sa mga partido. Kini nga format makaadik: pipila ka oras pagkahuman sa pagsugod, katunga ra sa mga slide ang nahuman. Kinahanglang paspasan pag-ayo ang kataposan.

  • Mibarog ang kauban

Ang mga kauban sa komperensya girepresentahan sa mga hawanan - sa mga baroganan naghisgot sila bahin sa mga karon nga proyekto, nagtanyag mga internship ug trabaho, nagpahigayon mga quiz ug gagmay nga kompetisyon, ug nag-raffle usab sa mga nindot nga premyo. Sa samang higayon, ang pipila ka mga kompaniya mitanyag pa nga moagi sa unang mga yugto sa mga interbyu, nga mahimong mapuslanon alang niadtong mianhi dili lamang sa pagpaminaw sa mga taho.

Teknikal nga mga detalye sa mga taho

Kami naminaw sa mga taho sa duha ka adlaw. Usahay lisud ang pagpili sa usa ka taho gikan sa parehas nga mga taho - nagkasabot kami nga magbulag ug magbinayloay sa kahibalo nga nakuha sa mga pahulay. Ug bisan pa, ingon og daghan ang wala. Dinhi gusto namon nga hisgutan ang bahin sa sulud sa pipila nga mga taho nga among nakita nga labing makapaikag

Mga eksepsiyon sa C++ pinaagi sa prisma sa compiler optimizations, Roman Rusyaev

C++ Russia: giunsa kini nahitabo
Slide gikan sa mga presentasyon

Sama sa gisugyot sa titulo, gitan-aw ni Roman ang pagtrabaho nga adunay mga eksepsiyon gamit ang LLVM ingon usa ka pananglitan. Sa samang higayon, alang niadtong wala mogamit sa Clang sa ilang trabaho, ang taho makahatag gihapon ug ideya kon sa unsang paagi ma-optimize ang code. Kini tungod kay ang mga nag-develop sa mga compiler ug katugbang nga standard nga mga librarya nakigsulti sa usag usa ug daghang malampuson nga mga solusyon ang mahimong magkatakdo.

Mao nga, aron madumala ang usa ka eksepsiyon, kinahanglan nimo nga buhaton ang daghang mga butang: tawagan ang code sa pagdumala (kung naa) o libre nga mga kapanguhaan sa karon nga lebel ug i-spin up ang stack nga mas taas. Kining tanan nagdala ngadto sa kamatuoran nga ang compiler midugang og dugang nga mga instruksyon alang sa mga tawag nga posibleng maglabay sa mga eksepsiyon. Busa, kung ang eksepsiyon dili aktuwal nga gipataas, ang programa maghimo gihapon sa dili kinahanglan nga mga aksyon. Aron sa usa ka paagi makunhuran ang overhead, ang LLVM adunay daghang mga heuristics alang sa pagtino sa mga sitwasyon diin dili kinahanglan nga idugang ang code sa pagdumala sa eksepsiyon o ang gidaghanon sa "dugang" nga mga panudlo mahimong mapakunhod.

Gisusi sa mamumulong ang mga usa ka dosena niini ug gipakita ang duha nga mga sitwasyon diin makatabang sila nga mapadali ang pagpatuman sa programa, ug kadtong kung diin kini nga mga pamaagi dili magamit.

Busa, si Roman Rusyaev nangulo sa mga estudyante ngadto sa konklusyon nga ang code nga adunay exception handling dili kanunay nga ipatuman sa zero overhead, ug naghatag sa mosunod nga tambag:

  • sa pagpalambo sa mga librarya, angay nga biyaan ang mga eksepsiyon sa prinsipyo;
  • kung gikinahanglan pa ang mga eksepsiyon, nan kung mahimo kini angay nga idugang ang noexcept (ug const) nga mga modifier bisan asa aron ang compiler maka-optimize kutob sa mahimo.

Sa kinatibuk-an, gipamatud-an sa mamumulong ang pagtan-aw nga ang mga eksepsiyon labing maayo nga gigamit sa labing gamay o gibiyaan sa hingpit.

Ang mga slide sa report anaa sa mosunod nga link: [“C++ eksepsyon pinaagi sa lente sa LLVM compiler optimizations”]

Generators, coroutines ug uban pang utok-unrolling katam-is, Adi Shavit

C++ Russia: giunsa kini nahitabo
Slide gikan sa mga presentasyon

Usa sa daghang mga taho niini nga komperensya nga gipahinungod sa mga inobasyon sa C ++ 20 halandumon dili lamang alang sa iyang mabulukon nga presentasyon, apan alang usab sa tin-aw nga pag-ila sa kasamtangan nga mga problema sa lohika sa pagproseso sa koleksyon (alang sa loop, callbacks).

Gipasiugda ni Adi Shavit ang mga musunud: ang mga pamaagi nga magamit karon moagi sa tibuuk nga koleksyon ug wala maghatag pag-access sa pipila nga internal nga intermediate nga estado (o buhaton nila kung adunay mga callback, apan adunay daghang dili maayo nga mga epekto, sama sa Callback Hell) . Mopatim-aw nga adunay mga iterator, apan bisan pa sa kanila ang tanan dili kaayo hapsay: wala’y sagad nga mga punto sa pagsulod ug paggawas (pagsugod → katapusan kumpara sa rbegin → pag-rend ug uban pa), dili klaro kung kanus-a kita mag-uli? Sugod sa C++20, kini nga mga problema nasulbad!

Unang kapilian: range. Pinaagi sa pagputos sa mga iterator, nakakuha kami usa ka sagad nga interface alang sa pagsugod ug katapusan sa usa ka pag-uli, ug nakuha usab namon ang abilidad sa pag-compose. Kining tanan nagpasayon ​​sa paghimo sa hingpit nga mga linya sa pagproseso sa datos. Apan dili ang tanan hapsay kaayo: ang bahin sa kalkulasyon nga lohika nahimutang sa sulod sa pagpatuman sa usa ka piho nga iterator, nga makapakomplikado sa code aron masabtan ug ma-debug.

C++ Russia: giunsa kini nahitabo
Slide gikan sa mga presentasyon

Aw, alang niini nga kaso, C ++ 20 midugang coroutines (functions kansang kinaiya susama sa generators sa Python): execution mahimong malangan pinaagi sa pagbalik sa pipila ka kasamtangan nga bili samtang nagpreserbar sa usa ka intermediate nga kahimtang. Sa ingon, nakab-ot namon dili lamang ang pagtrabaho sa datos ingon nga kini makita, apan gilakip usab ang tanan nga lohika sa sulod sa usa ka piho nga coroutine.

Apan adunay usa ka langaw sa pahumot: sa pagkakaron sila partially suportado sa kasamtangan nga mga compiler, ug dili usab gipatuman sa hapsay nga ingon sa atong gusto: pananglitan, kini dili pa takus sa paggamit sa mga pakisayran ug temporaryo nga mga butang sa coroutines. Dugang pa, adunay pipila nga mga pagdili kung unsa ang mahimo nga mga coroutine, ug ang mga function sa constexpr, mga konstruktor / tigguba, ug panguna wala gilakip sa kini nga lista.

Sa ingon, ang mga coroutine nagsulbad sa usa ka hinungdanon nga bahin sa mga problema sa kayano sa pagproseso sa datos nga lohika, apan ang ilang mga pagpatuman karon nanginahanglan pag-ayo.

Mga Materyal:

C++ tricks gikan sa Yandex.Taxi, Anton Polukhin

Sa akong propesyonal nga mga kalihokan, usahay kinahanglan nakong ipatuman ang mga butang nga puro auxiliary: usa ka wrapper tali sa internal nga interface ug sa API sa pipila ka librarya, pag-log o pag-parse. Sa kini nga kaso, kasagaran dili kinahanglan ang bisan unsang dugang nga pag-optimize. Apan unsa man kung kini nga mga sangkap gigamit sa pipila nga labing inila nga serbisyo sa RuNet? Sa ingon nga kahimtang, kinahanglan nimo nga iproseso ang terabytes matag oras nga mga troso nga mag-inusara! Pagkahuman ang matag millisecond hinungdanon ug busa kinahanglan ka nga mogamit sa lainlaing mga limbong - Gihisgutan sila ni Anton Polukhin.

Tingali ang labing makaiikag nga pananglitan mao ang pagpatuman sa pattern sa 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_; 
};

Sa kini nga pananglitan, gusto nako nga tangtangon una ang mga file sa header sa mga eksternal nga librarya - mas paspas kini nga mag-compile, ug mapanalipdan nimo ang imong kaugalingon gikan sa posible nga mga panagbangi sa ngalan ug uban pang parehas nga mga sayup. 

Okay, gibalhin namo ang #include sa .cpp file: kinahanglan namo ang forward-declaration sa giputos nga API, ingon man ang std::unique_ptr. Karon kami adunay dinamikong mga alokasyon ug uban pang dili maayo nga mga butang sama sa datos nga nagkatag sa usa ka hugpong sa mga datos ug pagkunhod sa mga garantiya. std::aligned_storage makatabang niining tanan. 

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_; 
};

Ang bugtong problema: kinahanglan nimo nga ipiho ang gidak-on ug pag-align sa matag wrapper - atong himoon ang among pimpl template nga adunay mga parameter , gamita ang pipila ka arbitraryong mga kantidad ug pagdugang usa ka tseke sa tiglaglag nga nakuha namon ang tanan nga husto: 

~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"
    ); 
}

Tungod kay gihubit na ang T kung giproseso ang tiglaglag, kini nga code ma-parse sa husto ug sa yugto sa pag-compile kini magpagawas sa gikinahanglan nga gidak-on ug mga kantidad sa pag-align nga kinahanglan nga ibutang ingon mga sayup. Busa, sa gasto sa usa ka dugang nga compilation run, atong makuha ang dinamikong alokasyon sa mga giputos nga mga klase, itago ang API sa usa ka .cpp file uban sa pagpatuman, ug usab makakuha og usa ka disenyo nga mas angay alang sa caching sa processor.

Ang pag-log ug pag-parse ingon dili kaayo impresibo ug busa dili hisgutan sa kini nga pagrepaso.

Ang mga slide sa report anaa sa mosunod nga link: ["C++ tricks gikan sa Taxi"]

Modernong mga teknik sa pagpabilin sa imong code nga DRY, Björn Fahller

Niini nga pakigpulong, gipakita ni Björn Fahller ang ubay-ubay nga lainlaing mga paagi aron mabuntog ang istilo nga sayup sa gibalikbalik nga pagsusi sa kondisyon:

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

Daw pamilyar? Pinaagi sa paggamit sa pipila ka gamhanan nga mga teknik sa C++ nga gipaila sa bag-o nga mga sumbanan, mahimo nimong elegante nga ipatuman ang parehas nga gamit nga wala’y bisan unsang silot sa pasundayag. Itandi:   

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

Aron madumala ang usa ka dili mabag-o nga gidaghanon sa mga tseke, kinahanglan nimo nga gamiton dayon ang variadic templates ug fold expression. Ibutang nato nga gusto natong susihon ang pagkaparehas sa daghang mga variable sa state_type nga elemento sa enum. Ang una nga butang nga naa sa hunahuna mao ang pagsulat sa usa ka function sa katabang is_any_of:


enum state_type { IDLE, CONNECTED, DISCONNECTED };

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

Kini nga intermediate nga resulta makapahigawad. Sa pagkakaron ang code dili mahimong mas mabasa:

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

Ang dili tipo nga mga parameter sa template makatabang sa pagpauswag sa kahimtang sa gamay. Uban sa ilang tabang, among ibalhin ang maihap nga mga elemento sa enum sa lista sa mga parameter sa template: 

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

Pinaagi sa paggamit sa awto sa usa ka dili tipo nga template parameter (C++ 17), ang pamaagi yano nga nag-generalize sa mga pagtandi dili lamang sa state_type nga mga elemento, apan usab sa mga primitive nga tipo nga mahimong magamit ingon dili tipo nga mga parameter sa template:


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

Pinaagi niining sunud-sunod nga mga pag-uswag, ang gitinguha nga larino nga syntax alang sa mga tseke makab-ot:


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);

Sa kini nga pananglitan, ang giya sa pagkunhod nagsilbi aron isugyot ang gitinguha nga mga parameter sa template sa istruktura sa compiler, nga nahibal-an ang mga tipo sa mga argumento sa constructor. 

Dugang pa - mas makapaikag. Gitudloan ni Bjorn kung unsaon pag-generalize ang resulta nga code para sa mga operator sa pagtandi lapas sa ==, ug dayon alang sa arbitraryong mga operasyon. Sa dalan, ang mga feature sama sa no_unique_address attribute (C++20) ug template parameters sa lambda functions (C++20) gipatin-aw gamit ang mga pananglitan sa paggamit. (Oo, karon ang lambda syntax mas sayon ​​​​nga mahinumduman - kini mao ang upat ka sunod-sunod nga mga parisan sa parentheses sa tanan nga mga matang.) Ang katapusan nga solusyon sa paggamit sa mga gimbuhaton ingon nga mga detalye sa constructor makapainit gayud sa akong kalag, wala pay labot ang ekspresyon nga tuple sa labing maayo nga mga tradisyon sa lambda calculus.

Sa katapusan, ayaw kalimot sa pagpasinaw niini:

  • Hinumdumi nga ang mga lambdas constexpr nga libre; 
  • Atong idugang ang hingpit nga pagpasa ug tan-awon ang ngil-ad nga syntax niini kalabot sa parameter pack sa lambda closure;
  • Hatagan nato ang compiler og dugang mga oportunidad alang sa pag-optimize nga adunay conditional noexcept; 
  • Atong atimanon ang labi ka masabtan nga output sa sayup sa mga template salamat sa klaro nga mga kantidad sa pagbalik sa mga lambdas. Kini mopugos sa compiler sa pagbuhat sa dugang nga mga pagsusi sa dili pa ang template function sa tinuod nga gitawag - sa matang checking yugto. 

Para sa mga detalye, palihog tan-awa ang mga materyal sa lecture: 

Ang among mga impresyon

Ang among unang pag-apil sa C++ Russia halandumon tungod sa kakusog niini. Nakuha nako ang impresyon sa C ++ Russia isip usa ka sinsero nga panghitabo, diin ang linya tali sa pagbansay ug live nga komunikasyon halos dili makita. Ang tanan, gikan sa mood sa mga mamumulong hangtod sa mga kompetisyon gikan sa mga kauban sa kalihokan, maayo sa mainit nga mga diskusyon. Ang sulud sa komperensya, nga gilangkuban sa mga taho, naglangkob sa usa ka medyo halapad nga mga hilisgutan lakip ang mga inobasyon sa C ++, mga pagtuon sa kaso sa dagkong mga proyekto ug mga konsiderasyon sa ideolohikal nga arkitektura. Apan dili makiangayon ang pagbaliwala sa sosyal nga bahin sa kalihokan, nga makatabang sa pagbuntog sa mga babag sa pinulongan nga may kalabotan dili lamang sa C++.

Nagpasalamat kami sa mga nag-organisar sa komperensya sa higayon nga makaapil sa ingon nga kalihokan!
Tingali nakita nimo ang post sa mga organizer bahin sa nangagi, karon ug sa umaabot sa C++ Russia sa JUG Ru blog.

Salamat sa pagbasa, ug nanghinaut kami nga ang among pagsaysay pag-usab sa mga panghitabo nakatabang!

Source: www.habr.com

Idugang sa usa ka comment