C++ Russja: kif ġara

Jekk fil-bidu tad-dramm tgħid li hemm kodiċi C++ imdendel mal-ħajt, allura sa l-aħħar huwa marbut li jisparak fis-sieq.

Bjarne Stroustrup

Mill-31 ta 'Ottubru sal-1 ta' Novembru, il-konferenza C++ Russia Piter saret f'San Pietruburgu - waħda mill-konferenzi ta 'programmazzjoni fuq skala kbira fir-Russja, organizzata minn JUG Ru Group. Kelliema mistiedna jinkludu membri tal-Kumitat tal-Istandards C++, kelliema CppCon, awturi tal-kotba O'Reilly, u manutenzjoni ta 'proġetti bħal LLVM, libc++, u Boost. Il-konferenza hija mmirata għal żviluppaturi C++ b'esperjenza li jixtiequ japprofondixxu l-kompetenza tagħhom u jiskambjaw esperjenzi fil-komunikazzjoni diretta. Studenti, studenti gradwati u għalliema universitarji huma pprovduti bi skontijiet sbieħ ħafna.

L-edizzjoni ta’ Moska tal-konferenza se tkun disponibbli biex iżuru minn April tas-sena d-dieħla, iżda sadanittant l-istudenti tagħna jgħidulek x’affarijiet interessanti tgħallmu fl-aħħar avveniment. 

C++ Russja: kif ġara

Ritratt minn album tal-konferenza

dwarna

Żewġ studenti mill-Iskola Għolja tal-Ekonomija tal-Università Nazzjonali tar-Riċerka - San Pietruburgu ħadmu fuq din il-kariga:

  • Liza Vasilenko hija studenta tar-raba' sena li tistudja Lingwi ta' Programmazzjoni bħala parti mill-programm tal-Matematika Applikata u x-Xjenza tal-Kompjuter. Wara li sirt familjari mal-lingwa C++ fl-ewwel sena tiegħi fl-università, sussegwentement ksibt esperjenza ta' xogħol magħha permezz ta' apprendistati fl-industrija. Il-passjoni għal-lingwi tal-ipprogrammar b'mod ġenerali u l-ipprogrammar funzjonali b'mod partikolari ħalliet il-marka tagħha fuq l-għażla tar-rapporti fil-konferenza.
  • Danya Smirnov hija studenta tal-ewwel sena tal-programm tal-master "Programmazzjoni u Analiżi tad-Data". Waqt li kont għadni l-iskola, ktibt problemi tal-Olympiad f'C++, u mbagħad b'xi mod ġara li l-lingwa kontinwament ħarġet f'attivitajiet edukattivi u eventwalment saret il-lingwa ewlenija tax-xogħol. Iddeċidejt li nipparteċipa fil-konferenza biex intejjeb l-għarfien tiegħi u nitgħallem ukoll dwar opportunitajiet ġodda.

Fin-newsletter, it-tmexxija tal-fakultà spiss taqsam informazzjoni dwar avvenimenti edukattivi relatati mal-ispeċjalità tagħna. F'Settembru rajna informazzjoni dwar C++ Russja u ddeċidejna li nirreġistraw bħala semmiegħa. Din hija l-ewwel esperjenza tagħna ta’ parteċipazzjoni f’konferenzi bħal dawn.

Struttura tal-konferenza

  • Rapporti

Matul jumejn, l-esperti qraw 30 rapport, li jkopru ħafna suġġetti jaħarqu: użi inġenjużi tal-karatteristiċi tal-lingwa biex isolvu problemi applikati, aġġornamenti tal-lingwa li jmiss b'rabta mal-istandard il-ġdid, kompromessi fid-disinn C++ u prekawzjonijiet meta jaħdmu bil-konsegwenzi tagħhom, eżempji ta' arkitettura interessanti tal-proġett, kif ukoll xi dettalji ta' taħt il-kappa tal-infrastruttura tal-lingwa. Tliet wirjiet saru simultanjament, ħafna drabi tnejn bir-Russu u waħda bl-Ingliż.

  • Żoni ta' diskussjoni

Wara d-diskors, il-mistoqsijiet kollha mhux mitluba u d-diskussjonijiet mhux mitmuma ġew trasferiti f’żoni magħżula apposta għall-komunikazzjoni mal-kelliema, mgħammra b’marker boards. Mod tajjeb biex tieqaf il-waqfa bejn id-diskorsi b'konverżazzjoni pjaċevoli.

  • Taħditiet Lightning u diskussjonijiet informali

Jekk trid tagħti rapport qasir, tista’ tiffirma fuq il-whiteboard għat-Taħdita Lightning tal-lejla u tikseb ħames minuti ta’ ħin biex titkellem dwar xi ħaġa dwar is-suġġett tal-konferenza. Pereżempju, introduzzjoni ta 'malajr għal sanitizers għal C++ (għal xi wħud kienet ġdida) jew storja dwar bug fil-ġenerazzjoni tal-mewġ sine li tista' tinstema' biss, iżda ma tidhirx.

Format ieħor huwa l-panel ta’ diskussjoni “With a Heart to Heart Committee.” Fuq il-palk hemm xi membri tal-kumitat ta 'standardizzazzjoni, fuq il-proġekter hemm nar (uffiċjalment - biex tinħoloq atmosfera sinċiera, iżda r-raġuni "għax KOLLOX HUWA NAR" tidher aktar umoristiċi), mistoqsijiet dwar l-istandard u l-viżjoni ġenerali ta' C++ , mingħajr diskussjonijiet tekniċi msaħħan u holiwars. Irriżulta li l-kumitat fih ukoll nies ħajjin li jistgħu ma jkunux kompletament żguri minn xi ħaġa jew forsi ma jafux xi ħaġa.

Għal fannijiet ta 'holivars, it-tielet avveniment baqa' fuq il-każ - is-sessjoni BOF "Mur vs. C++". Nieħdu dilettant tal-Go, dilettant tas-C++, qabel il-bidu tas-sessjoni huma flimkien jippreparaw 100500 slide fuq suġġett (bħal problemi b’pakketti f’C++ jew in-nuqqas ta’ ġeneriċi f’Go), u mbagħad ikollhom diskussjoni vivaċi bejniethom u mal-udjenza, u l-udjenza tipprova tifhem żewġ opinjonijiet f'daqqa. Jekk holivar jibda barra mill-kuntest, il-moderatur jintervjeni u jirrikonċilja l-partijiet. Dan il-format huwa vizzju: diversi sigħat wara l-bidu, nofs il-pjastri biss tlestew. It-tmiem kellu jiġi aċċellerat ħafna.

  • Stands tal-imsieħba

L-imsieħba tal-konferenza kienu rappreżentati fis-swali - fl-istands tkellmu dwar proġetti attwali, offrew apprendistati u impjieg, għamlu kwizzijiet u kompetizzjonijiet żgħar, u ħarġu wkoll premjijiet sbieħ. Fl-istess ħin, xi kumpaniji saħansitra offrew li jgħaddu mill-istadji inizjali tal-intervisti, li jistgħu jkunu utli għal dawk li ġew mhux biss biex jisimgħu r-rapporti.

Dettalji tekniċi tar-rapporti

Smajna rapporti iż-żewġ jiem. Xi drabi kien diffiċli li nagħżlu rapport wieħed minn dawk paralleli – qbilna li naqsmu u niskambjaw l-għarfien miksub waqt il-waqfien. U anke hekk, jidher li ħafna jitħalla barra. Hawnhekk nixtiequ nitkellmu dwar il-kontenut ta’ wħud mir-rapporti li sibna l-aktar interessanti

Eċċezzjonijiet f'C++ permezz tal-priżma tal-ottimizzazzjonijiet tal-kompilatur, Roman Rusyaev

C++ Russja: kif ġara
Żerżaq minn презентации

Kif jissuġġerixxi t-titlu, Roman ħares lejn ix-xogħol b'eċċezzjonijiet billi uża LLVM bħala eżempju. Fl-istess ħin, għal dawk li ma jużawx Clang fix-xogħol tagħhom, ir-rapport xorta jista 'jagħti xi idea ta' kif il-kodiċi jista 'potenzjalment jiġi ottimizzat. Dan huwa hekk minħabba li l-iżviluppaturi ta 'kompilaturi u libreriji standard korrispondenti jikkomunikaw ma' xulxin u ħafna soluzzjonijiet ta 'suċċess jistgħu jikkoinċidu.

Allura, biex timmaniġġja eċċezzjoni, trid tagħmel ħafna affarijiet: sejħa tal-kodiċi tal-immaniġġjar (jekk hemm) jew riżorsi b'xejn fil-livell attwali u dawwar il-munzell ogħla. Dan kollu jwassal għall-fatt li l-kompilatur iżid struzzjonijiet addizzjonali għal sejħiet li potenzjalment jarmu eċċezzjonijiet. Għalhekk, jekk l-eċċezzjoni ma titqajjem fil-fatt, il-programm xorta se jwettaq azzjonijiet mhux meħtieġa. Sabiex b'xi mod tnaqqas l-overhead, LLVM għandu diversi euristiċi għad-determinazzjoni ta 'sitwazzjonijiet fejn il-kodiċi tal-immaniġġjar tal-eċċezzjoni ma jkunx jeħtieġ li jiżdied jew in-numru ta' struzzjonijiet "extra" jista 'jitnaqqas.

Il-kelliem jeżamina madwar tużżana minnhom u juri kemm sitwazzjonijiet fejn jgħinu biex titħaffef l-eżekuzzjoni tal-programm, kif ukoll dawk fejn dawn il-metodi mhumiex applikabbli.

Għalhekk, Roman Rusyaev iwassal lill-istudenti għall-konklużjoni li l-kodiċi li fih l-immaniġġjar ta 'eċċezzjonijiet mhux dejjem jista' jiġi eżegwit b'overhead żero, u jagħti l-parir li ġej:

  • meta jiġu żviluppati l-libreriji, ta' min jabbandunaw l-eċċezzjonijiet fil-prinċipju;
  • jekk għad hemm bżonn eċċezzjonijiet, allura kull meta jkun possibbli ta 'min iżżid noexcept (u const) modifikaturi kullimkien sabiex il-kompilatur ikun jista' jottimizza kemm jista' jkun.

B'mod ġenerali, il-kelliem ikkonferma l-fehma li l-eċċezzjonijiet huma l-aħjar użati għall-minimu jew abbandunati għal kollox.

Is-slajds tar-rapport huma disponibbli fil-link li ġejja: [“Eċċezzjonijiet C++ mil-lenti tal-ottimizzazzjonijiet tal-kompilaturi LLVM”]

Ġeneraturi, coroutines u ħlewwa oħra li tiżvolġi l-moħħ, Adi Shavit

C++ Russja: kif ġara
Żerżaq minn презентации

Wieħed mill-ħafna rapporti f'din il-konferenza ddedikati għall-innovazzjonijiet f'C++20 kien memorabbli mhux biss għall-preżentazzjoni ikkulurita tiegħu, iżda wkoll għall-identifikazzjoni ċara tiegħu ta 'problemi eżistenti bil-loġika tal-ipproċessar tal-ġbir (għal loop, callbacks).

Adi Shavit jenfasizza dan li ġej: il-metodi disponibbli bħalissa jgħaddu mill-ġbir kollu u ma jipprovdux aċċess għal xi stat intermedju intern (jew jagħmlu fil-każ ta 'callbacks, iżda b'numru kbir ta' effetti sekondarji spjaċevoli, bħal Callback Hell) . Jidher li hemm iteraturi, iżda anke magħhom kollox mhux daqshekk bla xkiel: m'hemmx punti ta' dħul u ħruġ komuni (begin → end versus rbegin → rend u l-bqija), mhux ċar kemm se ngħaddu? Nibdew b'C++20, dawn il-problemi huma solvuti!

L-ewwel għażla: firxiet. Billi tgeżwir iteraturi, aħna tikseb interface komuni għall-bidu u t-tmiem ta 'iterazzjoni, u aħna wkoll tikseb l-abbiltà li jikkomponu. Dan kollu jagħmilha faċli biex jinbnew pipelines tal-ipproċessar tad-dejta sħiħ. Iżda mhux kollox huwa daqshekk bla xkiel: parti mill-loġika tal-kalkolu tinsab ġewwa l-implimentazzjoni ta 'iteratur speċifiku, li jista' jikkumplika l-kodiċi biex tifhem u tiddibaggja.

C++ Russja: kif ġara
Żerżaq minn презентации

Ukoll, għal dan il-każ, C ++ 20 żied coroutines (funzjonijiet li l-imġieba tagħhom hija simili għal ġeneraturi f'Python): l-eżekuzzjoni tista 'tiġi differita billi jirritorna xi valur kurrenti filwaqt li jiġi ppreservat stat intermedju. Għalhekk, aħna niksbu mhux biss naħdmu mad-dejta kif tidher, iżda wkoll li nkapsulaw il-loġika kollha ġewwa coroutine speċifiku.

Iżda hemm fly fl-ingwent: bħalissa huma parzjalment appoġġjati biss minn kompilaturi eżistenti, u wkoll mhumiex implimentati pulit kif nixtiequ: per eżempju, għadu mhux ta 'min juża referenzi u oġġetti temporanji f'coroutines. Barra minn hekk, hemm xi restrizzjonijiet fuq x'jistgħu jkunu coroutines, u l-funzjonijiet constexpr, il-kostrutturi/distrutturi, u l-main mhumiex inklużi f'din il-lista.

Għalhekk, coroutines isolvu parti sinifikanti tal-problemi bis-sempliċità tal-loġika tal-ipproċessar tad-dejta, iżda l-implimentazzjonijiet attwali tagħhom jeħtieġu titjib.

Materjali:

C++ tricks minn Yandex.Taxi, Anton Polukhin

Fl-attivitajiet professjonali tiegħi, xi kultant ikolli nimplimenta affarijiet purament awżiljarji: tgeżwir bejn l-interface interna u l-API ta 'xi librerija, illoggjar jew parsing. F'dan il-każ, ġeneralment ma jkun hemm l-ebda ħtieġa għal xi ottimizzazzjoni addizzjonali. Imma x'jiġri jekk dawn il-komponenti jintużaw f'xi wħud mis-servizzi l-aktar popolari fuq ir-RuNet? F'sitwazzjoni bħal din, ser ikollok tipproċessa terabytes kull siegħa ta 'zkuk waħdu! Imbagħad kull millisekonda tgħodd u għalhekk trid tirrikorri għal diversi tricks - tkellem dwarhom Anton Polukhin.

Forsi l-aktar eżempju interessanti kien l-implimentazzjoni tal-mudell 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_; 
};

F'dan l-eżempju, l-ewwel irrid neħles mill-fajls header ta 'libreriji esterni - dan se jikkompila aktar malajr, u tista' tipproteġi lilek innifsek minn kunflitti ta 'isem possibbli u żbalji oħra simili. 

Tajjeb, aħna mċaqalqa #include għall-fajl .cpp: neħtieġu dikjarazzjoni bil-quddiem tal-API mgeżwra, kif ukoll std::unique_ptr. Issa għandna allokazzjonijiet dinamiċi u affarijiet oħra spjaċevoli bħal dejta mifruxa fuq mazz ta 'dejta u garanziji mnaqqsa. std::aligned_storage jista' jgħin f'dan kollu. 

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

L-unika problema: għandna bżonn nispeċifikaw id-daqs u l-allinjament għal kull tgeżwir - ejja nagħmlu l-mudell pimpl tagħna bil-parametri , uża xi valuri arbitrarji u żid verifika lid-destruttur li aħna bdejt kollox sew : 

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

Peress li T hija diġà definita meta tipproċessa d-destruttur, dan il-kodiċi se jiġi analizzat b'mod korrett u fl-istadju tal-kumpilazzjoni se joħroġ id-daqs meħtieġ u l-valuri tal-allinjament li jeħtieġ li jiddaħħlu bħala żbalji. Għalhekk, għall-ispiża ta 'ġirja ta' kumpilazzjoni waħda addizzjonali, neħilsu mill-allokazzjoni dinamika ta 'klassijiet imgeżwer, naħbu l-API f'fajl .cpp bl-implimentazzjoni, u niksbu wkoll disinn li huwa aktar adattat għall-caching mill-proċessur.

Il-qtugħ u l-parsing dehru inqas impressjonanti u għalhekk mhux se jissemmew f'din ir-reviżjoni.

Is-slajds tar-rapport huma disponibbli fil-link li ġejja: ["C++ tricks minn Taxi"]

Tekniki moderni biex iżżomm il-kodiċi tiegħek DRY, Björn Fahller

F'din it-taħdita, Björn Fahller juri diversi modi differenti biex jiġġieled id-difett stilistiku ta' kontrolli ripetuti tal-kundizzjoni:

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

Ħoss familjari? Billi tuża diversi tekniki C++ qawwija introdotti fl-istandards riċenti, tista 'timplimenta l-istess funzjonalità b'mod eleganti mingħajr ebda penali għall-prestazzjoni. Qabbel:   

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

Biex timmaniġġja numru mhux fiss ta 'kontrolli, għandek bżonn immedjatament tuża mudelli variadic u espressjonijiet darbiet. Ejja nassumu li rridu niċċekkjaw l-ugwaljanza ta 'diversi varjabbli għall-element state_type tal-enum. L-ewwel ħaġa li tiġi f'moħħna hija li tikteb funzjoni helper 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) || ...); 
}

Dan ir-riżultat intermedju huwa diżappuntanti. S'issa l-kodiċi mhux qed isir aktar leġibbli:

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

Parametri tal-mudell mhux tat-tip se jgħinu biex itejbu ftit is-sitwazzjoni. Bl-għajnuna tagħhom, se nittrasferixxu l-elementi enumerabbli tal-enum għal-lista tal-parametri tal-mudell: 

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

Billi tuża auto f'parametru tal-mudell mhux tat-tip (C++17), l-approċċ sempliċement jiġġeneralizza għal paraguni mhux biss ma 'elementi state_type, iżda wkoll ma' tipi primittivi li jistgħu jintużaw bħala parametri tal-mudell mhux tat-tip:


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

Permezz ta’ dan it-titjib suċċessiv, tinkiseb is-sintassi fluwenti mixtieqa għall-kontrolli:


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

F'dan l-eżempju, il-gwida tat-tnaqqis isservi biex tissuġġerixxi l-parametri tal-mudell tal-istruttura mixtieqa lill-kompilatur, li jaf it-tipi tal-argumenti tal-kostruttur. 

Aktar - aktar interessanti. Bjorn jgħallem kif jiġġeneralizza l-kodiċi li jirriżulta għal operaturi ta 'tqabbil lil hinn minn ==, u mbagħad għal operazzjonijiet arbitrarji. Tul it-triq, karatteristiċi bħall-attribut no_unique_address (C++20) u l-parametri tal-mudell fil-funzjonijiet lambda (C++20) huma spjegati bl-użu ta 'eżempji ta' użu. (Iva, issa s-sintassi tal-lambda hija saħansitra aktar faċli biex tiftakar - dawn huma erba 'pari konsekuttivi ta' parentesi ta 'kull tip.) Is-soluzzjoni finali li tuża funzjonijiet bħala dettalji tal-kostruttur verament issaħħan ir-ruħ tiegħi, biex ma nsemmux l-espressjoni tuple fl-aħjar tradizzjonijiet ta' lambda kalkulu.

Fl-aħħar, tinsiex tillustraha:

  • Ftakar li lambdas huma constexpr b'xejn; 
  • Ejja nżidu t-twassil perfett u nħarsu lejn is-sintassi ikrah tagħha fir-rigward tal-pakkett tal-parametri fl-għeluq tal-lambda;
  • Ejja nagħtu lill-kompilatur aktar opportunitajiet għal ottimizzazzjonijiet b'noexcept kondizzjonali; 
  • Ejja nieħdu ħsieb output ta 'żbalji li jinftiehem aktar fil-mudelli grazzi għal valuri ta' ritorn espliċiti tal-lambdas. Dan se jġiegħel lill-kompilatur jagħmel aktar kontrolli qabel ma l-funzjoni tal-mudell fil-fatt tissejjaħ - fl-istadju tal-iċċekkjar tat-tip. 

Għad-dettalji, jekk jogħġbok irreferi għall-materjali tal-lecture: 

L-impressjonijiet tagħna

L-ewwel parteċipazzjoni tagħna f'C++ Russja kienet memorabbli għall-intensità tagħha. Sibt l-impressjoni ta 'C++ Russja bħala avveniment sinċier, fejn il-linja bejn it-taħriġ u l-komunikazzjoni diretta hija kważi imperċettibbli. Kollox, mill-burdata tal-kelliema sal-kompetizzjonijiet mill-imsieħba tal-avveniment, iwassal għal diskussjonijiet jaħarqu. Il-kontenut tal-konferenza, li jikkonsisti f'rapporti, ikopri firxa pjuttost wiesgħa ta' suġġetti inklużi innovazzjonijiet C++, studji ta' każijiet ta' proġetti kbar u konsiderazzjonijiet arkitettoniċi ideoloġiċi. Iżda jkun inġust li jiġi injorat il-komponent soċjali tal-avveniment, li jgħin biex jingħelbu l-ostakli tal-lingwa fir-rigward mhux biss tas-C++.

Nirringrazzjaw lill-organizzaturi tal-konferenzi għall-opportunità li jipparteċipaw f'avveniment bħal dan!
Jista' jkun li rajt il-post tal-organizzaturi dwar il-passat, il-preżent u l-futur ta' C++ Russja fuq il-blog tal-JUG Ru.

Grazzi tal-qari, u nittamaw li l-ġrajjiet mill-ġdid tagħna kien ta’ għajnuna!

Sors: www.habr.com

Żid kumment