C++ Rossiya: bu qanday sodir bo'ldi

Agar spektakl boshida devorda C++ kodi osilib turibdi desangiz, oxirigacha u sizni oyog'ingizga otib yuborishi aniq.

Bjarne Stroustrup

31-oktabrdan 1-noyabrgacha Sankt-Peterburgda C++ Russia Piter konferensiyasi bo‘lib o‘tdi - bu Rossiyadagi yirik dasturlash konferensiyalaridan biri bo‘lib, JUG Ru Group tomonidan tashkil etilgan. Mehmon ma'ruzachilar orasida C++ standartlari qo'mitasi a'zolari, CppCon ma'ruzachilari, O'Reilly kitob mualliflari va LLVM, libc++ va Boost kabi loyihalarni qo'llab-quvvatlovchilar bor. Konferentsiya o'z tajribasini chuqurlashtirish va jonli muloqotda tajriba almashishni xohlaydigan tajribali C++ dasturchilariga qaratilgan. Talabalar, aspirantlar va universitet o'qituvchilariga juda yaxshi chegirmalar taqdim etiladi.

Konferentsiyaning Moskva nashriga kelasi yilning aprel oyida tashrif buyurish mumkin bo'ladi, ammo bu orada bizning talabalarimiz sizga oxirgi tadbirda qanday qiziqarli narsalarni o'rganganliklarini aytib berishadi. 

C++ Rossiya: bu qanday sodir bo'ldi

dan surat konferentsiya albomi

Biz haqimizda

Ushbu lavozimda Milliy tadqiqot universiteti - Sankt-Peterburg Oliy Iqtisodiyot maktabining ikki talabasi ishladi:

  • Liza Vasilenko “Amaliy matematika va informatika” dasturi doirasida dasturlash tillarini oʻrganayotgan bakalavriat 4-kurs talabasi. Universitetdagi birinchi kursimda C++ tili bilan tanishib, keyinchalik sohada amaliyot o‘tash orqali u bilan ishlash tajribasiga ega bo‘ldim. Umuman dasturlash tillariga, xususan, funktsional dasturlashga bo'lgan ishtiyoq konferentsiyadagi ma'ruzalarni tanlashda o'z izini qoldirdi.
  • Danya Smirnov “Dasturlash va ma’lumotlarni tahlil qilish” magistratura yo‘nalishining 1-kurs talabasi. Hali maktabda bo'lganimda men C++ tilida olimpiada masalalarini yozardim va keyin qandaydir tarzda bu til doimiy ravishda ta'lim faoliyatida paydo bo'ldi va oxir-oqibat asosiy ish tiliga aylandi. Men bilimlarimni oshirish, shuningdek, yangi imkoniyatlar haqida bilish uchun konferensiyada qatnashishga qaror qildim.

Axborot byulletenida fakultet rahbariyati tez-tez mutaxassisligimiz bilan bog'liq ta'lim tadbirlari haqida ma'lumot almashadi. Sentyabr oyida biz C++ Rossiya haqida ma'lumotni ko'rdik va tinglovchi sifatida ro'yxatdan o'tishga qaror qildik. Bu bizning bunday anjumanlarda ishtirok etishdagi ilk tajribamiz.

Konferentsiya tuzilishi

  • Hisobotlar

Ikki kun davomida ekspertlar ko'plab dolzarb mavzularni o'z ichiga olgan 30 ta hisobotni o'qib chiqdilar: amaliy muammolarni hal qilish uchun til xususiyatlaridan mohirona foydalanish, yangi standart bilan bog'liq bo'lajak til yangilanishlari, C++ dizaynidagi murosalar va ularning oqibatlari bilan ishlashda ehtiyot choralari, misollar. qiziqarli loyiha arxitekturasi, shuningdek, til infratuzilmasining ba'zi tafsilotlari. Bir vaqtning o'zida uchta spektakl bo'lib o'tdi, ko'pincha ikkitasi rus tilida va bittasi ingliz tilida.

  • Munozara zonalari

Ma’ruzadan so‘ng barcha berilmagan savollar va tugallanmagan muhokamalar ma’ruzachilar bilan muloqot qilish uchun maxsus ajratilgan, markerlar bilan jihozlangan joylarga o‘tkazildi. Yoqimli suhbat bilan nutqlar orasidagi tanaffusdan uzoqlashishning yaxshi usuli.

  • Lightning suhbatlari va norasmiy muhokamalar

Agar siz qisqacha ma'ruza qilmoqchi bo'lsangiz, oq doskada kechki "Lightning Talk" ga ro'yxatdan o'tishingiz va konferentsiya mavzusidagi har qanday mavzuda gaplashish uchun besh daqiqa vaqt olishingiz mumkin. Masalan, C++ uchun dezinfektsiyalash vositalariga qisqacha kirish (ba'zilar uchun bu yangi edi) yoki sinus to'lqin hosil bo'lishida faqat eshitiladigan, lekin ko'rinmaydigan xato haqida hikoya.

Yana bir format - "Yurakdan yurakka qo'mita" panel muhokamasi. Sahnada standartlashtirish qo'mitasining ba'zi a'zolari, proyektorda kamin (rasmiy ravishda - samimiy muhit yaratish uchun, lekin "hamma narsa yonayotgani uchun" kulgili ko'rinadi), C++ standarti va umumiy qarashlari haqida savollar. , qizg'in texnik munozaralar va bayramlarsiz. Ma’lum bo‘lishicha, qo‘mita tarkibida biror narsaga to‘liq ishonchi yo‘q yoki biror narsani bilmagan tirik odamlar ham bor ekan.

Holivar muxlislari uchun uchinchi voqea - BOF sessiyasi "Go vs. C++" bo'yicha qoldi. Biz Go ishqibozini, C++ ishqibozini olamiz, sessiya boshlanishidan oldin ular birgalikda mavzu bo'yicha 100500 XNUMX ta slayd tayyorlaydilar (masalan, C++ da paketlar bilan bog'liq muammolar yoki Go'da generiklarning yo'qligi), so'ngra ular o'zaro qizg'in muhokama qilishadi va tomoshabinlar bilan va tomoshabin bir vaqtning o'zida ikkita nuqtai nazarni tushunishga harakat qiladi. Agar xolivar kontekstdan tashqarida boshlansa, moderator aralashib, tomonlarni yarashtiradi. Ushbu format qo'shadi: boshlanganidan bir necha soat o'tgach, slaydlarning faqat yarmi bajarildi. Oxirini juda tezlashtirish kerak edi.

  • Hamkor stendlar

Konferensiya hamkorlari zallarda namoyish etildi - stendlarda ular joriy loyihalar haqida suhbatlashdi, amaliyot va ishga joylashishni taklif qilishdi, viktorinalar va kichik tanlovlar o'tkazdilar, shuningdek, yoqimli sovg'alar o'ynadilar. Shu bilan birga, ba'zi kompaniyalar hatto suhbatlarning dastlabki bosqichlaridan o'tishni taklif qilishdi, bu nafaqat hisobotlarni tinglash uchun kelganlar uchun foydali bo'lishi mumkin.

Hisobotlarning texnik tafsilotlari

Ikki kun ham hisobotlarni tingladik. Ba'zida parallel bo'lgan ma'ruzalardan bittasini tanlash qiyin edi - biz tanaffus paytida olingan bilimlarni bo'linishga va almashishga kelishib oldik. Va shunga qaramay, ko'p narsa chetda qolganga o'xshaydi. Bu erda biz eng qiziqarli bo'lgan ba'zi hisobotlarning mazmuni haqida gaplashmoqchimiz

Kompilyatorni optimallashtirish prizmasi orqali C++ da istisnolar, Roman Rusyaev

C++ Rossiya: bu qanday sodir bo'ldi
dan siljitish taqdimotlar

Sarlavhadan ko'rinib turibdiki, Roman misol sifatida LLVM yordamida istisnolar bilan ishlashni ko'rib chiqdi. Shu bilan birga, o'z ishlarida Clang-dan foydalanmaydiganlar uchun hisobot kodni qanday qilib optimallashtirish mumkinligi haqida ba'zi fikrlarni berishi mumkin. Buning sababi shundaki, kompilyatorlar va tegishli standart kutubxonalar ishlab chiquvchilari bir-biri bilan muloqot qilishadi va ko'plab muvaffaqiyatli echimlar mos kelishi mumkin.

Shunday qilib, istisnoni hal qilish uchun siz ko'p narsalarni qilishingiz kerak: ishlov berish kodini (agar mavjud bo'lsa) yoki joriy darajadagi bepul resurslarni chaqiring va stekni yuqoriga aylantiring. Bularning barchasi kompilyatorning istisnolarni keltirib chiqaradigan qo'ng'iroqlar uchun qo'shimcha ko'rsatmalarni qo'shishiga olib keladi. Shuning uchun, agar istisno haqiqatda ko'tarilmasa, dastur hali ham keraksiz harakatlarni bajaradi. Qo'shimcha xarajatlarni qandaydir tarzda kamaytirish uchun LLVM istisnolarni qayta ishlash kodini qo'shishni talab qilmaydigan yoki "qo'shimcha" ko'rsatmalar sonini kamaytirish mumkin bo'lgan vaziyatlarni aniqlash uchun bir nechta evristikaga ega.

Ma'ruzachi ularning o'nga yaqinini ko'rib chiqadi va dasturning bajarilishini tezlashtirishga yordam beradigan va bu usullar qo'llanilmaydigan holatlarni ko'rsatadi.

Shunday qilib, Roman Rusyaev talabalarni istisnolar bilan ishlashni o'z ichiga olgan kodni har doim ham nol qo'shimcha xarajatlar bilan bajarib bo'lmaydi degan xulosaga olib keladi va quyidagi maslahatlarni beradi:

  • kutubxonalarni ishlab chiqishda printsipial jihatdan istisnolardan voz kechishga arziydi;
  • agar istisnolar hali ham zarur bo'lsa, unda iloji boricha kompilyator iloji boricha optimallashtirishi uchun hamma joyda noexcept (va const) modifikatorlarini qo'shishga arziydi.

Umuman olganda, ma'ruzachi istisnolardan eng yaxshisi minimal darajada qo'llanilishi yoki butunlay tark etilishi haqidagi fikrni tasdiqladi.

Hisobot slaydlari quyidagi havolada mavjud: [“LLVM kompilyatorini optimallashtirish orqali C++ istisnolari”]

Generatorlar, koroutinlar va boshqa miyani ochadigan shirinliklar, Adi Shavit

C++ Rossiya: bu qanday sodir bo'ldi
dan siljitish taqdimotlar

C++ 20 tilidagi innovatsiyalarga bag‘ishlangan ushbu konferensiyadagi ko‘plab ma’ruzalardan biri nafaqat o‘zining rang-barang taqdimoti, balki yig‘ish jarayonini qayta ishlash mantig‘i bilan bog‘liq mavjud muammolarni aniq belgilab bergani (for loop, callbacks) bilan ham esda qolarli bo‘ldi.

Adi Shavit quyidagilarni ta'kidlaydi: hozirgi mavjud usullar butun to'plamdan o'tadi va ba'zi ichki oraliq holatga kirishni ta'minlamaydi (yoki ular qayta qo'ng'iroqlar bo'lsa, lekin ko'p sonli noxush yon ta'sirlar bilan, masalan, Callback Hell) . Iteratorlar borga o'xshaydi, lekin ular bilan ham hamma narsa unchalik silliq emas: umumiy kirish va chiqish nuqtalari yo'q (boshlash → tugatish va rbegin → rend va boshqalar), biz qancha vaqt takrorlashimiz noma'lum? C++ 20 dan boshlab, bu muammolar hal qilindi!

Birinchi variant: diapazonlar. Iteratorlarni o'rash orqali biz iteratsiyaning boshi va oxiri uchun umumiy interfeysga ega bo'lamiz, shuningdek, yozish qobiliyatiga ega bo'lamiz. Bularning barchasi ma'lumotlarni qayta ishlashning to'liq quvvatli quvurlarini qurishni osonlashtiradi. Ammo hamma narsa unchalik silliq emas: hisoblash mantig'ining bir qismi ma'lum bir iteratorni amalga oshirishda joylashgan bo'lib, kodni tushunish va disk raskadrovka qilishni murakkablashtirishi mumkin.

C++ Rossiya: bu qanday sodir bo'ldi
dan siljitish taqdimotlar

Xo'sh, bu holatda, C++ 20 koroutinlarini qo'shdi (xulq-atvori Python'dagi generatorlarga o'xshash funktsiyalar): oraliq holatni saqlab qolgan holda, ba'zi joriy qiymatlarni qaytarish orqali bajarilishini kechiktirish mumkin. Shunday qilib, biz nafaqat ma'lumotlar bilan ko'rinishida ishlashga, balki ma'lum bir koroutin ichidagi barcha mantiqni qamrab olishga ham erishamiz.

Ammo malhamda pashsha bor: hozirda ular mavjud kompilyatorlar tomonidan faqat qisman qo'llab-quvvatlanadi va biz xohlagan darajada aniq bajarilmaydi: masalan, koroutinlarda havolalar va vaqtinchalik ob'ektlardan foydalanish hali bunga loyiq emas. Bundan tashqari, koroutinlar bo'lishi mumkin bo'lgan ba'zi cheklovlar mavjud va constexpr funktsiyalari, konstruktorlar/destruktorlar va asosiy bu ro'yxatga kiritilmagan.

Shunday qilib, koroutinlar ma'lumotlarni qayta ishlash mantig'ining soddaligi bilan bog'liq muammolarning muhim qismini hal qiladi, ammo ularning joriy tatbiq etilishi takomillashtirishni talab qiladi.

Materiallar:

Yandex.Taksi, Anton Poluxindan C++ fokuslari

Kasbiy faoliyatimda ba'zida men faqat yordamchi narsalarni amalga oshirishim kerak: ichki interfeys va ba'zi kutubxonaning API o'rtasidagi o'rash, jurnalga yozish yoki tahlil qilish. Bunday holda, odatda qo'shimcha optimallashtirishga ehtiyoj qolmaydi. Ammo bu komponentlar RuNet-dagi eng mashhur xizmatlardan foydalanilsa-chi? Bunday vaziyatda siz faqat jurnallarni soatiga terabaytlarni qayta ishlashingiz kerak bo'ladi! Keyin har bir millisekund hisobga olinadi va shuning uchun siz turli xil fokuslarga murojaat qilishingiz kerak - Anton Poluxin ular haqida gapirdi.

Ehtimol, eng qiziqarli misol ko'rsatgichni amalga oshirish (pimpl) naqshini amalga oshirish edi. 

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

Ushbu misolda, birinchi navbatda, men tashqi kutubxonalarning sarlavha fayllaridan xalos bo'lishni xohlayman - bu tezroq kompilyatsiya qilinadi va siz o'zingizni nomlar bilan bog'liq bo'lgan nizolardan va boshqa shunga o'xshash xatolardan himoya qilishingiz mumkin. 

OK, biz #include faylini .cpp fayliga oʻtkazdik: bizga oʻralgan API va std::unique_ptrning oldingi deklaratsiyasi kerak. Endi bizda dinamik taqsimotlar va boshqa noxush narsalar mavjud, masalan, ma'lumotlar to'plami bo'ylab tarqalib ketgan va kafolatlar kamayadi. std::aligned_storage bularning barchasida yordam berishi mumkin. 

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

Yagona muammo: biz har bir o'ram uchun o'lcham va hizalanishni belgilashimiz kerak - keling, parametrlari bilan pimpl shablonimizni yarataylik, ba'zi bir ixtiyoriy qiymatlardan foydalaning va destruktorga biz hamma narsani to'g'ri taxmin qilganimizni tasdiqlaymiz. : 

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

Destruktorni qayta ishlashda T allaqachon aniqlanganligi sababli, ushbu kod to'g'ri tahlil qilinadi va kompilyatsiya bosqichida xato sifatida kiritilishi kerak bo'lgan kerakli o'lcham va hizalama qiymatlarini chiqaradi. Shunday qilib, bitta qo'shimcha kompilyatsiya ishga tushirilishi evaziga biz o'ralgan sinflarni dinamik taqsimlashdan xalos bo'lamiz, APIni amalga oshirish bilan .cpp faylida yashiramiz, shuningdek, protsessor tomonidan keshlash uchun ko'proq mos keladigan dizaynga ega bo'lamiz.

Jurnalga kiritish va tahlil qilish unchalik ta'sirli emas edi, shuning uchun bu sharhda eslatib o'tilmaydi.

Hisobot slaydlari quyidagi havolada mavjud: ["Taksidan C++ fokuslari"]

Kodingizni DRY saqlashning zamonaviy usullari, Björn Fahller

Ushbu nutqda Byorn Fahller takroriy holatni tekshirishning stilistik kamchiliklariga qarshi kurashishning turli usullarini ko'rsatadi:

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

Tanish eshitildimi? Oxirgi standartlarda joriy etilgan bir nechta kuchli C++ usullaridan foydalangan holda, siz bir xil funksiyani hech qanday ishlash jazosisiz nafis tarzda amalga oshirishingiz mumkin. Taqqoslash:   

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

Belgilanmagan miqdordagi tekshiruvlarni bajarish uchun siz darhol o'zgaruvchan shablonlardan va katlama ifodalaridan foydalanishingiz kerak. Faraz qilaylik, biz bir nechta o'zgaruvchilarning enumning state_type elementiga tengligini tekshirmoqchimiz. Aqlga keladigan birinchi narsa bu is_any_of yordamchi funksiyasini yozishdir:


enum state_type { IDLE, CONNECTED, DISCONNECTED };

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

Bu oraliq natija umidsizlikka olib keladi. Hozircha kod o'qilishi mumkin emas:

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

Turi bo'lmagan shablon parametrlari vaziyatni biroz yaxshilashga yordam beradi. Ularning yordami bilan biz raqamlarning sanab o'tilgan elementlarini shablon parametrlari ro'yxatiga o'tkazamiz: 

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

Turi bo'lmagan shablon parametrida (C++17) auto dan foydalangan holda yondashuv oddiygina davlat_turi elementlari bilan emas, balki nostandart shablon parametrlari sifatida ishlatilishi mumkin bo'lgan ibtidoiy turlar bilan taqqoslash uchun umumlashtiriladi:


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

Ushbu ketma-ket yaxshilanishlar orqali tekshiruvlar uchun kerakli ravon sintaksisga erishiladi:


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

Ushbu misolda chegirma qo'llanmasi konstruktor argumentlarining turlarini biladigan kompilyatorga kerakli struktura shablonlari parametrlarini taklif qilish uchun xizmat qiladi. 

Keyinchalik - qiziqroq. Byorn natijada olingan kodni == dan tashqari taqqoslash operatorlari uchun, keyin esa ixtiyoriy amallar uchun umumlashtirishni o'rgatadi. Yo'l davomida no_unique_address atributi (C++20) va lambda funksiyalarida shablon parametrlari (C++20) kabi xususiyatlar foydalanish misollari yordamida tushuntiriladi. (Ha, endi lambda sintaksisini eslab qolish yanada osonlashdi - bular barcha turdagi to'rtta ketma-ket qavslar.) Konstruktor detallari sifatida funktsiyalardan foydalanishning yakuniy yechimi, lambdaning eng yaxshi an'analaridagi to'p ifodasi haqida gapirmasa ham, qalbimni isitadi. hisob.

Oxirida uni jilolashni unutmang:

  • Lambdalar bepul constexpr ekanligini unutmang; 
  • Keling, mukammal yo'naltirishni qo'shamiz va lambda yopilishidagi parametrlar to'plamiga nisbatan uning xunuk sintaksisini ko'rib chiqamiz;
  • Keling, kompilyatorga shartli noexcept bilan optimallashtirish uchun ko'proq imkoniyatlar beraylik; 
  • Lambdalarning aniq qaytariladigan qiymatlari tufayli shablonlarda tushunarliroq xato chiqishi haqida g'amxo'rlik qilaylik. Bu kompilyatorni shablon funksiyasi aslida chaqirilgunga qadar - tipni tekshirish bosqichida ko'proq tekshirishga majbur qiladi. 

Tafsilotlar uchun ma'ruza materiallariga murojaat qiling: 

Bizning taassurotlarimiz

C++ Rossiyadagi birinchi ishtirokimiz o'zining intensivligi bilan esda qolarli bo'ldi. Menda C++ Rossiyasi samimiy voqea sifatida taassurot qoldirdi, bu erda mashg'ulotlar va jonli muloqot o'rtasidagi chegara deyarli sezilmaydi. Ma’ruzachilarning kayfiyatidan tortib, tadbir hamkorlarining musobaqalarigacha qizg‘in munozaralarga sabab bo‘ladi. Ma'ruzalardan iborat konferentsiya mazmuni juda keng mavzularni o'z ichiga oladi, jumladan C++ innovatsiyalari, yirik loyihalarning amaliy tadqiqotlari va g'oyaviy arxitektura mulohazalari. Ammo hodisaning nafaqat C++ ga nisbatan til to‘siqlarini yengib o‘tishga yordam beradigan ijtimoiy komponentini e’tiborsiz qoldirish adolatsizlik bo‘lar edi.

Bunday tadbirda ishtirok etish imkoniyati uchun konferensiya tashkilotchilariga minnatdorchilik bildiramiz!
Siz tashkilotchilarning C++ Rossiyaning o‘tmishi, buguni va kelajagi haqidagi postini ko‘rgan bo‘lsangiz kerak JUG Ru blogida.

O'qiganingiz uchun tashakkur va voqealarni takrorlash foydali bo'ldi deb umid qilamiz!

Manba: www.habr.com

DDoS himoyasi, VPS VDS serverlari bo'lgan saytlar uchun ishonchli hosting sotib oling 🔥 DDoS himoyasi, VPS VDS serverlari bilan ishonchli veb-sayt xostingini sotib oling | ProHoster