C++ Russia: yadda abin ya faru

Idan a farkon wasan kun ce akwai lambar C++ da ke rataye a bango, to daga ƙarshe ya zama dole ya harbe ku a ƙafa.

Bjarne Stroustrup

Daga 31 ga Oktoba zuwa Nuwamba 1, an gudanar da taron C ++ Russia Piter a St. Petersburg - daya daga cikin manyan tarurrukan shirye-shirye a Rasha, wanda kungiyar JUG Ru ta shirya. Masu jawabai da aka gayyata sun haɗa da membobin Kwamitin Matsayi na C++, masu magana da CppCon, Marubutan littattafan O'Reilly, da masu kula da ayyuka kamar LLVM, libc++, da Boost. Taron yana nufin ƙwararrun masu haɓaka C ++ waɗanda ke son zurfafa ƙwarewarsu da musayar gogewa a cikin sadarwar kai tsaye. Dalibai, daliban da suka kammala karatun digiri da malaman jami'a ana ba su rangwame mai kyau.

Taron taron na Moscow zai kasance don ziyarta a farkon Afrilu na shekara mai zuwa, amma a halin yanzu ɗalibanmu za su gaya muku abubuwan ban sha'awa da suka koya a taron na ƙarshe. 

C++ Russia: yadda abin ya faru

Hoto daga kundin taro

О нас

Dalibai biyu daga Makarantar Harkokin Tattalin Arziki ta Jami'ar Bincike ta Ƙasa - St. Petersburg sun yi aiki a kan wannan matsayi:

  • Liza Vasilenko shekara ce ta 4 da ke karatun digiri na biyu da ke karatun Harsunan Shirye-shiryen a matsayin wani ɓangare na shirin Ilimin Lissafi da Kimiyyar Kwamfuta. Bayan na saba da yaren C++ a shekarar farko na a jami'a, daga baya na sami gogewa wajen yin aiki da shi ta hanyar horarwa a cikin masana'antu. Sha'awar da nake da shi ga harsunan shirye-shirye gabaɗaya da shirye-shirye na aiki musamman ya bar tambarin zaɓin rahotanni a taron.
  • Danya Smirnov dalibi ne na shekara ta 1 na babban shirin "Shirye-shiryen da Nazarin Bayanai". Yayin da nake makaranta, na rubuta matsalolin Olympiad a C++, sannan kuma ya faru ko ta yaya harshen ya kasance a cikin ayyukan ilimi kuma ya zama babban harshen aiki. Na yanke shawarar shiga cikin taron don inganta ilimina da kuma koyi game da sababbin damammaki.

A cikin wasiƙar, jagorancin malamai sukan raba bayanai game da abubuwan da suka shafi ilimi da suka shafi ƙwarewar mu. A watan Satumba mun ga bayanai game da C ++ Rasha kuma sun yanke shawarar yin rajista a matsayin masu sauraro. Wannan ita ce ƙwarewarmu ta farko na shiga irin waɗannan tarurrukan.

Tsarin taro

  • Rahotanni

A cikin kwanaki biyu, masana sun karanta rahotanni 30, suna rufe batutuwa masu zafi da yawa: ƙwarewar amfani da fasalolin harshe don magance matsalolin da ake amfani da su, sabunta harshe mai zuwa dangane da sabon ma'auni, yin sulhu a cikin ƙirar C ++ da taka tsantsan yayin aiki tare da sakamakonsu, misalai. na gine-ginen ayyuka masu ban sha'awa, da kuma wasu cikakkun bayanai na kayan aikin harshe. Wasanni guda uku sun gudana a lokaci guda, galibi biyu cikin Rashanci ɗaya kuma cikin Ingilishi.

  • Yankunan tattaunawa

Bayan jawabin, duk tambayoyin da ba a yi ba da tattaunawar da ba a gama ba an canza su zuwa wuraren da aka keɓe na musamman don sadarwa tare da masu magana, sanye da allunan alamar. Hanya mai kyau don yayin nesa da hutu tsakanin maganganu tare da tattaunawa mai dadi.

  • Tattaunawar Walƙiya da tattaunawa na yau da kullun

Idan kuna son bayar da taƙaitaccen rahoto, za ku iya yin rajista don Maganar Walƙiya maraice a kan farar allo kuma ku sami minti biyar na lokaci don yin magana game da wani abu akan batun taron. Misali, gabatarwa mai sauri ga masu hana ruwa don C++ (ga wasu sabo ne) ko labari game da bug a cikin tsarar raƙuman ruwa wanda kawai za a iya ji, amma ba a gani ba.

Wani tsari kuma shine taron tattaunawa "Tare da Kwamitin Zuciya zuwa Zuciya." A kan mataki akwai wasu mambobin kwamitin daidaitawa, a kan majigi shine murhu (a hukumance - don ƙirƙirar yanayi na gaskiya, amma dalilin "saboda KOWANE AKAN WUTA" alama ce mai ban sha'awa), tambayoyi game da ma'auni da hangen nesa na C ++ , ba tare da zazzafan tattaunawar fasaha da holiwars ba. Ya bayyana cewa kwamitin ya kuma kunshi mutane masu rai wadanda watakila ba su da cikakken tabbacin wani abu ko kuma ba su san wani abu ba.

Ga magoya bayan holivars, taron na uku ya kasance a kan lamarin - zaman BOF "Go vs. C ++". Mun dauki Masoya Go, masoyin C++, kafin a fara zaman tare suka shirya faifan bidiyo 100500 akan wani maudu'i (kamar matsalolin da ake samu a cikin C++ ko kuma rashin Generics a Go), sannan suka yi ta tattaunawa a tsakaninsu. tare da masu sauraro, kuma masu sauraro suna ƙoƙarin fahimtar ra'ayoyi biyu lokaci guda. Idan holivar ya fara ba tare da mahallin ba, mai gudanarwa ya shiga tsakani kuma ya sulhunta bangarorin. Wannan tsarin yana jaraba: sa'o'i da yawa bayan farawa, rabin nunin nunin faifai kawai aka kammala. Dole ne a ƙara haɓaka ƙarshensa sosai.

  • Abokin tarayya yana tsaye

Abokan hulɗar taron sun wakilci a cikin zauren - a wurin tsayawa sun yi magana game da ayyukan yau da kullum, ba da horo da aikin yi, gudanar da tambayoyi da ƙananan gasa, kuma sun ba da kyaututtuka masu kyau. A lokaci guda kuma, wasu kamfanoni ma sun ba da damar shiga cikin matakan farko na tambayoyin, wanda zai iya zama da amfani ga waɗanda suka zo ba kawai don sauraron rahotanni ba.

Bayanan fasaha na rahotanni

Mun saurari rahotanni kwanaki biyu. A wasu lokuta yana da wuya a zaɓi rahoto ɗaya daga cikin masu kamanceceniya - mun yarda mu rabu da musanyar ilimin da aka samu yayin hutu. Kuma duk da haka, da alama an bar abubuwa da yawa. Anan muna son yin magana game da abubuwan da ke cikin wasu rahotannin da muka fi jan hankali

Keɓancewa a cikin C ++ ta hanyar haɓaka haɓakar haɓakawa, Roman Rusyaev

C++ Russia: yadda abin ya faru
Zamewa daga gabatarwa

Kamar yadda take ya nuna, Roman ya kalli aiki tare da keɓancewa ta amfani da LLVM a matsayin misali. A lokaci guda, ga waɗanda ba sa amfani da Clang a cikin aikin su, rahoton na iya ba da wasu ra'ayi na yadda za a iya inganta lambar. Wannan ya faru ne saboda masu haɓaka masu tarawa da daidaitattun ɗakunan karatu suna sadarwa da juna kuma yawancin mafita masu nasara na iya daidaitawa.

Don haka, don sarrafa keɓancewa, kuna buƙatar yin abubuwa da yawa: kira lambar kulawa (idan akwai) ko albarkatu kyauta a matakin yanzu kuma ku zurfafa tari mafi girma. Duk wannan yana haifar da gaskiyar cewa mai tarawa yana ƙara ƙarin umarni don kira waɗanda ke iya jefa keɓantacce. Don haka, idan ban da gaske ba a tashe shi ba, shirin zai yi ayyukan da ba dole ba. Domin a rage ko ta yaya, LLVM tana da hidimomi da yawa don tantance yanayi inda keɓanta lambar sarrafa ba ta buƙatar ƙarawa ko za a iya rage adadin “ƙarin” umarnin.

Mai magana ya bincika kusan dozin daga cikinsu kuma ya nuna yanayin biyu inda suke taimakawa hanzarta aiwatar da shirin, da waɗanda waɗannan hanyoyin ba su da amfani.

Don haka, Roman Rusyaev ya jagoranci ɗalibai zuwa ga ƙarshe cewa lambar da ke ɗauke da keɓancewa ba za a iya aiwatar da su koyaushe tare da sifili ba, kuma yana ba da shawara mai zuwa:

  • lokacin haɓaka ɗakunan karatu, yana da kyau a watsar da keɓancewa bisa manufa;
  • idan har yanzu ana buƙatar keɓancewa, to, duk lokacin da zai yiwu yana da daraja ƙara noexcept (da const) masu gyara ko'ina domin mai tarawa zai iya haɓaka gwargwadon yiwuwa.

Gabaɗaya, mai magana ya tabbatar da ra'ayin cewa keɓantawa an fi amfani da su ga mafi ƙanƙanta ko watsi da su gaba ɗaya.

Ana samun nunin faifan rahoton a mahaɗin mai zuwa: ["C++ keɓance ta hanyar ruwan tabarau na inganta haɓakar masu tarawa na LLVM"]

Generators, coroutines da sauran kwakwalwa-zurfafa zaƙi, Adi Shavit

C++ Russia: yadda abin ya faru
Zamewa daga gabatarwa

Ɗaya daga cikin rahotanni da yawa a wannan taron da aka sadaukar don sababbin abubuwa a cikin C ++ 20 ya kasance abin tunawa ba kawai don gabatar da shi ba, amma har ma don gano matsalolin da ake ciki tare da dabarun sarrafa tarin (don madauki, kira baya).

Adi Shavit yana nuna abubuwan da ke biyowa: hanyoyin da ake da su a halin yanzu suna tafiya ta hanyar dukan tarin kuma ba su ba da damar yin amfani da wasu tsaka-tsakin tsaka-tsakin ciki (ko kuma suna yi a cikin yanayin kiran baya, amma tare da adadi mai yawa na illa mara kyau, irin su Callback Hell) . Zai yi kama da cewa akwai masu maimaitawa, amma ko da tare da su duk abin da ba shi da kyau sosai: babu wuraren shiga da fita na gama gari (fara → ƙarshe da rbegin → rend da sauransu), ba a bayyana tsawon lokacin da za mu sake maimaitawa ba? An fara da C ++20, ana magance waɗannan matsalolin!

Zaɓin farko: jeri. Ta hanyar naɗa masu ikirari, muna samun haɗin haɗin gwiwa don farkon da ƙarshen juzu'i, kuma muna samun ikon tsarawa. Duk wannan yana ba da sauƙi don gina cikakkun bututun sarrafa bayanai. Amma ba duk abin da yake da santsi ba: wani ɓangare na ƙididdigar ƙididdiga yana samuwa a cikin aiwatar da ƙayyadaddun ƙayyadaddun bayanai, wanda zai iya rikitar da lambar don fahimta da kuskure.

C++ Russia: yadda abin ya faru
Zamewa daga gabatarwa

Da kyau, don wannan yanayin, C ++20 ya ƙara coroutines (ayyukan da halayensu yayi kama da na'urorin samar da wutar lantarki a Python): ana iya jinkirta aiwatar da kisa ta hanyar dawo da wasu ƙima na yanzu yayin kiyaye matsakaicin matsakaici. Don haka, muna cimma ba kawai yin aiki tare da bayanai kamar yadda ya bayyana ba, har ma da ƙaddamar da duk dabaru a cikin takamaiman corutine.

Amma akwai gardama a cikin maganin shafawa: a halin yanzu ana tallafawa ne kawai ta hanyar masu tarawa na yanzu, kuma ba a aiwatar da su da kyau kamar yadda muke so: alal misali, har yanzu bai cancanci yin amfani da nassoshi da abubuwa na wucin gadi a cikin coroutines ba. Bugu da ƙari, akwai wasu ƙuntatawa akan abin da zai iya zama coroutines, da ayyukan constexpr, masu ginawa / masu lalata, da kuma manyan ba a haɗa su cikin wannan jeri ba.

Don haka, coroutines suna warware wani muhimmin ɓangare na matsalolin tare da sauƙi na dabarun sarrafa bayanai, amma aiwatar da su na yanzu yana buƙatar haɓakawa.

Abubuwa:

Dabarun C ++ daga Yandex.Taxi, Anton Polukhin

A cikin ayyukana na ƙwararru, wani lokaci dole ne in aiwatar da abubuwa masu taimako zalla: abin rufewa tsakanin abin dubawa na ciki da API na wasu ɗakin karatu, shiga ko fastoci. A wannan yanayin, yawanci babu buƙatar ƙarin haɓakawa. Amma idan an yi amfani da waɗannan abubuwan haɗin gwiwa a cikin wasu shahararrun sabis akan RuNet? A irin wannan yanayin, dole ne ku sarrafa terabytes a cikin sa'a guda na katako kadai! Sannan kowane millisecond yana ƙidaya don haka dole ne ku yi amfani da dabaru daban-daban - Anton Polukhin yayi magana game da su.

Wataƙila misali mafi ban sha'awa shine aiwatar da tsarin mai nuna-zuwa aiwatarwa (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_; 
};

A cikin wannan misali, da farko ina so in kawar da fayilolin rubutun na ɗakunan karatu na waje - wannan zai tattara sauri, kuma za ku iya kare kanku daga yiwuwar rikice-rikicen suna da sauran kurakurai masu kama. 

Da kyau, mun matsa #include zuwa fayil ɗin .cpp: muna buƙatar sanarwar gaba na API nannade, da kuma std :: musamman_ptr. Yanzu muna da ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun abubuwa da sauran abubuwa marasa daɗi kamar bayanan da aka warwatse cikin tarin bayanai da rage garanti. std :: aligned_storage na iya taimakawa da duk wannan. 

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

Matsalar kawai: kuna buƙatar ƙayyade girman da daidaitawa ga kowane abin rufewa - bari mu yi samfurin mu na pimpl tare da sigogi. , Yi amfani da wasu dabi'u na sabani kuma ƙara duba ga mai lalata cewa mun sami komai daidai: 

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

Tun da an riga an ayyana T lokacin sarrafa mai lalata, wannan lambar za a yi ta daidai kuma a matakin tattarawa zai fitar da girman da ake buƙata da ƙimar daidaitawa waɗanda ke buƙatar shigar da su azaman kurakurai. Don haka, a farashin ƙarin haɓakawa guda ɗaya, muna kawar da ƙayyadaddun rarraba azuzuwan nannade, ɓoye API a cikin fayil ɗin .cpp tare da aiwatarwa, kuma muna samun ƙirar da ta fi dacewa da caching ta hanyar sarrafawa.

Shiga da fassarori da alama ba su da ban sha'awa don haka ba za a ambata a cikin wannan bita ba.

Ana samun nunin faifan rahoton a mahaɗin mai zuwa: ["Dabarun C++ daga Taxi"]

Dabarun zamani don kiyaye lambar ku DRY, Björn Fahller

A cikin wannan magana, Björn Fahller ya nuna hanyoyi daban-daban don yaƙar aibi na maimaita yanayin sake dubawa:

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

Sauti saba? Ta amfani da dabarun C++ masu ƙarfi da yawa waɗanda aka gabatar a cikin ƙa'idodi na baya-bayan nan, zaku iya aiwatar da ayyuka iri ɗaya cikin ƙa'ida ba tare da wani hukunci na aiki ba. Kwatanta:   

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

Don sarrafa adadin cak ɗin da ba a kayyade ba, nan da nan kuna buƙatar amfani da samfura iri-iri da ninka maganganu. Bari mu ɗauka cewa muna son bincika daidaiton masu canji da yawa zuwa nau'in state_type na enum. Abu na farko da ke zuwa a zuciya shine rubuta aikin taimako shine_kowane_na:


enum state_type { IDLE, CONNECTED, DISCONNECTED };

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

Wannan matsakaicin sakamako abin takaici ne. Ya zuwa yanzu lambar ba ta zama abin karantawa ba:

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

Siffofin samfuri marasa nau'in nau'in za su taimaka inganta yanayin kaɗan. Tare da taimakonsu, za mu canja wurin abubuwa masu ƙima na enum zuwa jerin sigogin samfuri: 

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

Ta amfani da auto a cikin ma'aunin samfuri marasa nau'in nau'in (C++17), tsarin kawai yana ba da kwatancen kwatance ba kawai tare da abubuwan state_type ba, har ma da nau'ikan na asali waɗanda za a iya amfani da su azaman sigogin samfuri marasa nau'in:


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

Ta hanyar waɗannan ci gaba masu zuwa, ana samun cikakkiyar ma'anar da ake so don dubawa:


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

A cikin wannan misali, jagorar cirewa tana ba da shawarar sigogin samfuri da ake so ga mai tarawa, wanda ya san nau'ikan gardama na maginin. 

Bugu da ari - mafi ban sha'awa. Bjorn yana koyar da yadda ake haɗa lambar da aka samu don kwatancen masu aiki fiye da ==, sannan don ayyukan sabani. Tare da hanya, an bayyana irin waɗannan fasalulluka kamar sifa na no_unique_address (C++20) da sigogin samfuri a cikin ayyukan lambda (C++20) ta amfani da misalan amfani. (Eh, yanzu lambda syntax ya fi sauƙi don tunawa - waɗannan su ne nau'i-nau'i guda hudu na ƙididdiga na kowane nau'i.) Magani na ƙarshe ta yin amfani da ayyuka kamar yadda cikakkun bayanai masu ginawa suka ji daɗin raina, ba tare da ma'anar tuple a cikin mafi kyawun hadisai na lambda ba. lissafi.

A ƙarshe, kar a manta da goge shi:

  • Ka tuna cewa lambdas suna constexpr kyauta; 
  • Bari mu ƙara cikakkiyar isarwa kuma mu dubi ƙaƙƙarfan ma'anarsa dangane da fakitin siga a cikin ƙulli na lambda;
  • Bari mu ba mai tara ƙarin dama don ingantawa tare da sharadi sai dai; 
  • Bari mu kula da ƙarin fitowar kuskuren da za a iya fahimta a cikin samfuran godiya ga fayyace ƙimar lambdas. Wannan zai tilasta wa mai tarawa yin ƙarin bincike kafin a kira aikin samfuri a zahiri - a matakin duba nau'in. 

Don cikakkun bayanai, da fatan za a duba kayan karatun: 

Abubuwan da muke gani

Kasancewarmu na farko a C++ Rasha abin tunawa ne saboda ƙarfinsa. Na sami ra'ayi na C ++ Rasha a matsayin abin da ya faru na gaskiya, inda layin tsakanin horo da sadarwar kai tsaye ya kusan kusan rashin fahimta. Komai, daga yanayin masu magana zuwa gasa daga abokan taron, yana da kyau ga tattaunawa mai zafi. Abubuwan da ke cikin taron, wanda ya ƙunshi rahotanni, ya ƙunshi batutuwa da dama da suka haɗa da sabbin abubuwa na C++, nazarin shari'o'in manyan ayyuka da la'akari da tsarin gine-gine. Amma ba zai zama rashin adalci ba a yi watsi da sashin zamantakewa na taron, wanda ke taimakawa shawo kan matsalolin harshe dangane da C ++ kawai.

Muna gode wa masu shirya taron don damar shiga irin wannan taron!
Wataƙila kun ga post ɗin masu shirya game da baya, yanzu da makomar C++ Rasha a kan JUG Ru blog.

Mun gode da karantawa, kuma muna fatan sake bayyana abubuwan da suka faru ya taimaka!

source: www.habr.com

Add a comment