C++ Русия: ин чӣ гуна рӯй дод

Агар дар оғози бозӣ гӯед, ки дар девор рамзи C++ овезон аст, пас дар охир ҳатман ба пои шумо тир холӣ мекунад.

Бярн Строструп

Аз 31 октябр то 1 ноябр конфронси C++ Russia Piter дар Санкт-Петербург - яке аз конфронсҳои густурдаи барномасозӣ дар Русия баргузор шуд, ки аз ҷониби JUG Ru Group ташкил карда шудааст. Ба ҳайати меҳмонон аъзои Кумитаи стандартҳои C++, баромадкунандагон CppCon, муаллифони китобҳои O'Reilly ва нигоҳдорони лоиҳаҳо ба монанди LLVM, libc++ ва Boost дохил мешаванд. Конфронс ба таҳиягарони ботаҷрибаи C++ нигаронида шудааст, ки мехоҳанд таҷрибаи худро амиқтар кунанд ва дар муоширати зинда табодули таҷриба кунанд. Ба донишҷӯён, аспирантҳо ва муаллимони донишгоҳҳо тахфифҳои хеле хуб дода мешаванд.

Нашри Маскави конфронс ҳанӯз моҳи апрели соли оянда дастрас хоҳад шуд, аммо дар ҳамин ҳол донишҷӯёни мо ба шумо нақл мекунанд, ки дар чорабинии охирин чӣ чизҳои ҷолибро омӯхтаанд. 

C++ Русия: ин чӣ гуна рӯй дод

Акс аз албоми конференция

Дар бораи мо

Дар ин вазифа ду донишҷӯи Мактаби олии иқтисодии Донишгоҳи миллии тадқиқотӣ - Санкт-Петербург кор карданд:

  • Лиза Василенко донишҷӯи соли 4-ум аст, ки дар доираи барномаи математикаи амалӣ ва илмҳои компютерӣ забонҳои барномасозиро меомӯзад. Дар соли аввали дар донишгоҳ буданам бо забони C++ ошно шудам, баъдан ман тавассути таҷрибаомӯзӣ дар соҳа таҷрибаи кор бо он пайдо кардам. Ҳавас ба забонҳои барномасозӣ дар маҷмӯъ ва бахусус барномасозии функсионалӣ дар интихоби гузоришҳо дар конфронс тамғаи худро гузошт.
  • Даня Смирнов донишҷӯи курси 1-уми барномаи магистрии «Барномасозӣ ва таҳлили маълумот» мебошад. Ҳанӯз дар мактаб, ман масъалаҳои олимпиадаро бо забони C++ менавиштам, ва он гоҳ ба гунае рӯй дод, ки ин забон пайваста дар фаъолиятҳои таълимӣ баромад ва дар ниҳоят ба забони асосии корӣ табдил ёфт. Ман тасмим гирифтам, ки дар конфронс иштирок кунам, то донишамро такмил диҳам ва инчунин дар бораи имкониятҳои нав шинос шавам.

Дар бюллетени ахбор рохбарияти факултет зуд-зуд дар бораи чорабинихои таълимии вобаста ба ихтисоси мо маълумот медихад. Моҳи сентябр мо маълумотро дар бораи C++ Русия дидем ва тасмим гирифтем, ки ҳамчун шунаванда сабти ном шавем. Ин аввалин таҷрибаи иштироки мо дар чунин конфронсҳост.

Сохтори конференсия

  • Ҳисоботҳо

Дар тӯли ду рӯз коршиносон 30 гузоришро хонданд, ки мавзӯъҳои доғро дар бар мегиранд: истифодаи оқилонаи хусусиятҳои забон барои ҳалли мушкилоти амалӣ, навсозиҳои дарпешистодаи забон дар робита бо стандарти нав, созишҳо дар тарҳрезии C++ ва чораҳои эҳтиётӣ ҳангоми кор бо оқибатҳои онҳо, мисолҳо меъмории ҷолиби лоиҳа, инчунин баъзе тафсилоти зерсохтори инфрасохтори забон. Се намоиш ҳамзамон сурат гирифт, аксаран ду намоиш ба забони русӣ ва як намоиш ба забони англисӣ буданд.

  • Минтақаҳои баҳс

Пас аз суханронӣ тамоми саволҳои нопурра ва баҳсҳои нотамом барои муошират бо баромадкунандагон, ки бо лавҳаҳои маркерӣ муҷаҳҳаз шудаанд, гузаронида шуданд. Як роҳи хубе барои истироҳат дар байни суханронӣ бо сӯҳбати гуворо.

  • Сӯҳбатҳои Lightning ва муҳокимаҳои ғайрирасмӣ

Агар шумо хоҳед, ки гузориши кӯтоҳе пешниҳод кунед, шумо метавонед дар тахтаи сафед барои сӯҳбати бегоҳии барқ ​​​​пайваст шавед ва панҷ дақиқа вақтро барои сӯҳбат дар бораи ҳар як мавзӯи конфронс гиред. Масалан, муқаддимаи зуд ба санитаризаторҳо барои C++ (барои баъзеҳо он нав буд) ё ҳикоя дар бораи хато дар тавлиди мавҷи синус, ки танҳо шунида мешавад, аммо дида намешавад.

Формати дигар ин мубоҳисаи панелии «Бо як кумитаи дил ба дил» мебошад. Дар саҳна баъзе аъзои кумитаи стандартизатсия ҳастанд, дар проектор оташдон (расмӣ - барои эҷод кардани фазои самимӣ, аммо сабаби "чун ҳама чиз дар оташ аст" хандаовартар ба назар мерасад), саволҳо дар бораи стандарт ва биниши умумии C++ , бе мубохисахои тезу тунди техникй ва холйвархо. Маълум шуд, ки дар хайати комитет одамони зиндае низ хастанд, ки шояд ба чизе комилан боварй надоранд ва ё чизеро намедонанд.

Барои мухлисони холиварҳо, ҳодисаи сеюм дар парванда боқӣ монд - сессияи BOF "Go vs. C++". Мо як дӯстдори Go, як дӯстдори C++-ро мегирем, пеш аз оғози сессия онҳо якҷоя 100500 слайдро дар мавзӯъ омода мекунанд (масалан, мушкилот бо бастаҳо дар C++ ё набудани генерикҳо дар Go) ва сипас онҳо дар байни худ як баҳси ҷолиб доранд ва бо тамошобинон ва тамошобин кушиш мекунад, ки ду нуктаи назарро якбора фахмад. Агар холивар аз контекст оғоз шавад, модератор дахолат мекунад ва тарафҳоро оштӣ медиҳад. Ин формат ба одатдаромада аст: чанд соат пас аз оғоз, танҳо нисфи слайдҳо анҷом дода шуданд. Хотимаро хеле тезондан лозим омад.

  • Шарик истода

Дар толорҳо шарикони конфронс намояндагӣ карда шуданд - дар стендҳо дар бораи лоиҳаҳои ҷорӣ суханронӣ карданд, таҷрибаомӯзӣ ва шуғл пешниҳод карданд, викторинаҳо ва озмунҳои хурд баргузор карданд, инчунин тӯҳфаҳои хуб супорида шуданд. Дар баробари ин, баъзе ширкатҳо ҳатто пешниҳод карданд, ки марҳилаҳои ибтидоии мусоҳибаҳоро гузаранд, ки ин метавонад барои онҳое, ки на танҳо барои шунидани гузоришҳо омадаанд, муфид бошад.

Тафсилоти техникии гузоришҳо

Мо хар ду руз хисоботро шунидем. Баъзан аз гузоришҳои параллелӣ интихоб кардани як гузориш душвор буд - мо розӣ шудем, ки донишҳои дар вақти танаффус гирифташударо тақсим кунем ва мубодила кунем. Ва бо вуҷуди ин, ба назар мерасад, ки бисёр чизҳо дар канор мондаанд. Дар ин чо мехостем дар бораи мазмуни баъзе гузоришхое сухан ронем, ки ба мо бештар шавковар буд

Истисноҳо дар C++ тавассути призмаи оптимизатсияи компилятор, Роман Русяев

C++ Русия: ин чӣ гуна рӯй дод
Лағжиш аз муаррифӣ

Тавре ки аз унвон бармеояд, Роман ба кор бо истисноҳо бо истифода аз LLVM ҳамчун намуна назар кард. Ҳамзамон, барои онҳое, ки Clang-ро дар кори худ истифода намебаранд, гузориш то ҳол метавонад каме тасаввурот диҳад, ки чӣ гуна кодро эҳтимолан оптимизатсия кардан мумкин аст. Ин аз он сабаб аст, ки таҳиягарони компиляторҳо ва китобхонаҳои стандартии мувофиқ бо ҳамдигар муошират мекунанд ва бисёр ҳалли муваффақ метавонанд мувофиқат кунанд.

Ҳамин тавр, барои ҳалли истисно, шумо бояд бисёр корҳоро анҷом диҳед: рамзи коркард (агар мавҷуд бошад) ё захираҳои ройгонро дар сатҳи ҷорӣ даъват кунед ва стекро баландтар гардонед. Ҳамаи ин ба он оварда мерасонад, ки компилятор дастурҳои иловагиро барои зангҳое илова мекунад, ки эҳтимолан истисноҳоро мепартоянд. Аз ин рӯ, агар истисно воқеан бардошта нашавад, барнома ҳанӯз ҳам амалҳои нолозимро иҷро мекунад. Бо мақсади кам кардани хароҷоти изофӣ, LLVM якчанд эвристикаро барои муайян кардани ҳолатҳое дорад, ки дар он рамзи коркарди истисноҳо илова кардан лозим нест ё шумораи дастурҳои "иловагӣ" кам карда мешавад.

Маърузачй кариб дах нафари онхоро дида мебарояд ва хар ду вазъиятеро нишон медихад, ки онхо ба тезондани ичрои программа ёрй мерасонанд ва ходисахоеро, ки ин усулхо ба кор бурда намешаванд.

Ҳамин тариқ, Роман Русяев донишҷӯёнро ба хулосае меорад, ки коди дорои коркарди истисноҳо на ҳамеша бо сифри изофӣ иҷро карда мешавад ва маслиҳати зерин медиҳад:

  • ҳангоми таҳияи китобхонаҳо ба таври принципӣ аз истисноҳо даст кашидан лозим аст;
  • агар истисноҳо то ҳол лозим бошанд, пас ба қадри имкон илова кардани тағирдиҳандаҳои noexcept (ва const) дар ҳама ҷо бамаврид аст, то компилятор то ҳадди имкон оптимизатсия кунад.

Умуман, маърузачй чунин фикрро тасдик кард, ки истиснохо ба таври бояду шояд истифода бурда мешаванд ё тамоман тарк карда мешаванд.

Слайдҳои гузориш дар истиноди зерин дастрасанд: ["Истисноҳои C++ тавассути линзаи оптимизатсияи компилятори LLVM"]

Генераторҳо, корутинҳо ва дигар шириниҳои мағзи сар, Ади Шавит

C++ Русия: ин чӣ гуна рӯй дод
Лағжиш аз муаррифӣ

Яке аз гузоришҳои сершумори ин конфронс, ки ба навоварӣ дар C++20 бахшида шуда буд, на танҳо бо муаррифии рангини худ, балки инчунин барои мушаххас кардани мушкилоти мавҷуда бо мантиқи коркарди коллексия (for loop, callbacks) хотирмон буд.

Ади Шавит чизҳои зеринро таъкид мекунад: усулҳои мавҷуда аз тамоми коллексия мегузаранд ва дастрасӣ ба баъзе ҳолати фосилавии дохилиро таъмин намекунанд (ё онҳо дар сурати зангҳои бозпас, аммо бо шумораи зиёди таъсири манфии ногувор, ба монанди Callback Hell) . Чунин ба назар мерасад, ки итераторҳо вуҷуд доранд, аммо ҳатто бо онҳо ҳама чиз он қадар ҳамвор нест: ягон нуқтаи умумии даромаду баромад вуҷуд надорад (оғоз → анҷом бар зидди rbegin → ренд ва ғайра), маълум нест, ки мо то кай такрор мекунем? Аз C++20 сар карда, ин мушкилот ҳал карда мешаванд!

Варианти аввал: диапазонҳо. Бо печонидани итераторҳо, мо интерфейси умумиро барои оғоз ва охири итератсия ба даст меорем ва инчунин қобилияти эҷод карданро ба даст меорем. Ҳамаи ин сохтани қубурҳои мукаммали коркарди маълумотро осон мекунад. Аммо на ҳама чиз он қадар ҳамвор аст: як қисми мантиқи ҳисобкунӣ дар дохили татбиқи итератори мушаххас ҷойгир аст, ки метавонад рамзро барои фаҳмидан ва ислоҳ кардани он душвор гардонад.

C++ Русия: ин чӣ гуна рӯй дод
Лағжиш аз муаррифӣ

Хуб, барои ин ҳолат, C++20 корутинҳоро илова кард (функсияҳое, ки рафторашон ба генераторҳо дар Python монанд аст): иҷроишро тавассути баргардонидани баъзе арзиши ҷорӣ ҳангоми нигоҳ доштани ҳолати фосилавӣ ба таъхир андохтан мумкин аст. Ҳамин тариқ, мо на танҳо кор бо додаҳо тавре ба назар мерасад, ноил мешавем, балки тамоми мантиқро дар дохили корутини мушаххас фаро гирифтаем.

Аммо дар атрафшон пашша вуҷуд дорад: дар айни замон онҳо аз ҷониби компиляторҳои мавҷуда танҳо қисман дастгирӣ карда мешаванд ва инчунин он тавре, ки мо мехоҳем, ба таври дақиқ иҷро карда намешаванд: масалан, ҳоло дар корутинҳо истифода бурдани маълумотномаҳо ва объектҳои муваққатӣ лозим нест. Илова бар ин, баъзе маҳдудиятҳо дар бораи корутинҳо вуҷуд доранд ва функсияҳои constexpr, созандаҳо/деструкторҳо ва main ба ин рӯйхат дохил карда нашудаанд.

Ҳамин тариқ, корутинҳо қисми зиёди мушкилотро бо соддагии мантиқи коркарди додаҳо ҳал мекунанд, аммо татбиқи кунунии онҳо такмилро талаб мекунад.

Маводҳо:

Суратҳои C++ аз Yandex.Taxi, Антон Полухин

Дар фаъолияти касбии худ, баъзан ман маҷбур мешавам, ки чизҳои ёрирасонро амалӣ кунам: бастабандӣ байни интерфейси дохилӣ ва API-и баъзе китобхонаҳо, сабт ё таҳлил. Дар ин ҳолат, одатан ҳеҷ гуна оптимизатсияи иловагӣ лозим нест. Аммо чӣ мешавад, агар ин ҷузъҳо дар баъзе хидматҳои маъмултарин дар RuNet истифода шаванд? Дар чунин вазъият, шумо бояд танҳо терабайтҳоро дар як соат коркард кунед! Пас ҳар як миллисония ҳисоб мешавад ва бинобар ин шумо бояд ба ҳилаҳои гуногун муроҷиат кунед - Антон Полухин дар бораи онҳо нақл кард.

Шояд намунаи ҷолибтарин ин татбиқи намунаи нишондиҳанда ба татбиқ (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_; 
};

Дар ин мисол, аввал ман мехоҳам аз файлҳои сарлавҳаи китобхонаҳои беруна халос шавам - ин тезтар тартиб медиҳад ва шумо метавонед худро аз ихтилофоти эҳтимолии номҳо ва дигар хатогиҳои шабеҳ муҳофизат кунед. 

Хуб, мо #include -ро ба файли .cpp кӯчидем: ба мо эъломияи пешбурди API-и печонидашуда ва инчунин std::unique_ptr лозим аст. Ҳоло мо тақсимоти динамикӣ ва дигар чизҳои ногувор дорем, ба монанди маълумоте, ки дар як миқдори маълумот пароканда шудаанд ва кафолатҳои камшуда. std::aligned_storage метавонад дар ин ҳама кӯмак кунад. 

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

Ягона мушкилот: мо бояд ҳаҷм ва ҳамоҳангиро барои ҳар як парпеч муайян кунем - биёед қолаби pimpl-и худро бо параметрҳои созем, баъзе арзишҳои ихтиёриро истифода барем ва ба вайронкунанда чек илова кунем, ки мо ҳама чизро дуруст тахмин кардаем. : 

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

Азбаски T ҳангоми коркарди харобкунанда аллакай муайян карда шудааст, ин код дуруст таҳлил карда мешавад ва дар марҳилаи компиляция он арзишҳои зарурии андоза ва ҳамоҳангиро мебарорад, ки бояд ҳамчун хато ворид карда шаванд. Ҳамин тариқ, бо арзиши як иҷроиши иловагӣ, мо аз тақсимоти динамикии синфҳои печонидашуда халос мешавем, API-ро дар файли .cpp бо татбиқ пинҳон мекунем ва инчунин тарҳеро ба даст меорем, ки барои кэш аз ҷониби протсессор бештар мувофиқ бошад.

Гузариш ва таҳлил камтар таъсирбахш ба назар мерасид ва аз ин рӯ дар ин барраси зикр карда намешавад.

Слайдҳои гузориш дар истиноди зерин дастрасанд: ["Ҳиллаҳои C++ аз Такси"]

Усулҳои муосир барои нигоҳ доштани рамзи шумо DRY, Björn Fahller

Дар ин нутқ Бёрн Фаллер якчанд роҳҳои гуногуни мубориза бо нуқсони услубии санҷиши ҳолати такрориро нишон медиҳад:

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

Садо шинос? Бо истифода аз якчанд усулҳои пурқудрати C++, ки дар стандартҳои охирин ҷорӣ карда шудаанд, шумо метавонед ҳамон функсияро бе ягон ҷазои иҷроиш шево амалӣ кунед. Муқоиса кунед:   

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

Барои идора кардани шумораи номуайяни чекҳо, шумо бояд фавран қолабҳои вариадикиро истифода баред ва ифодаҳои қабатро истифода баред. Фарз мекунем, ки мо мехоҳем баробарии якчанд тағирёбандаҳоро бо унсури state_type enum тафтиш кунем. Аввалин чизе, ки ба хотир меояд, ин навиштани функсияи ёрирасон аст_any_of:


enum state_type { IDLE, CONNECTED, DISCONNECTED };

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

Ин натиҷаи мобайнӣ ноумедкунанда аст. То ба ҳол код бештар хонданӣ намешавад:

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

Параметрҳои қолаби ғайринавбатӣ ба беҳтар шудани вазъият каме кумак мекунанд. Бо ёрии онҳо, мо унсурҳои номбаршудаи рақамиро ба рӯйхати параметрҳои шаблон интиқол медиҳем: 

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

Бо истифода аз худкор дар параметри қолаби ғайринавбатӣ (C++17), равиш танҳо муқоисаро на танҳо бо унсурҳои_type_state, балки бо намудҳои ибтидоӣ, ки метавонанд ҳамчун параметрҳои қолаби ғайринамуд истифода шаванд, умумӣ мекунад:


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

Тавассути ин такмилдиҳии пайдарпай, синтаксиси озоди дилхоҳ барои чекҳо ба даст оварда мешавад:


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

Дар ин мисол, дастури тарҳ барои пешниҳод кардани параметрҳои қолаби сохтори дилхоҳ ба компилятор хидмат мекунад, ки намудҳои аргументҳои созандаро медонад. 

Минбаъд - ҷолибтар. Bjorn таълим медиҳад, ки чӣ тавр ба умумӣ рамзи натиҷа барои операторҳои муқоиса берун аз ==, ва сипас барои амалиёти худсарона. Дар баробари ин, чунин хусусиятҳо ба монанди аттрибути no_unique_address (C++20) ва параметрҳои шаблон дар функсияҳои лямбда (C++20) бо истифода аз мисолҳои истифода шарҳ дода мешаванд. (Бале, ҳоло дар хотир нигоҳ доштани синтаксиси лямбда боз ҳам осонтар аст - инҳо чор ҷуфти пайдарпайи қавсҳои ҳама намудҳо мебошанд.) Ҳалли ниҳоӣ бо истифода аз функсияҳо ҳамчун ҷузъиёти созанда рӯҳи маро гарм мекунад, на ба ёдоварӣ аз ифодаи tuple дар анъанаҳои беҳтарини ламбда. ҳисоб.

Дар охир, тоза кардани онро фаромӯш накунед:

  • Дар хотир доред, ки lambdas constexpr ройгон мебошанд; 
  • Биёед интиқоли комилро илова кунем ва синтаксиси зишти онро дар робита бо бастаи параметрҳо дар бастаи ламбда бубинем;
  • Биёед ба компилятор барои оптимизатсия бо шарти noexcept имкониятҳои бештар диҳем; 
  • Биёед ба туфайли арзишҳои возеҳи баргардонидани ламбдаҳо дар бораи хатогиҳои фаҳмотар дар қолабҳо ғамхорӣ кунем. Ин компиляторро маҷбур мекунад, ки пеш аз он ки функсияи шаблон воқеан даъват шавад, дар марҳилаи санҷиши намуд санҷишҳои бештар анҷом диҳад. 

Барои тафсилот ба маводҳои лексия муроҷиат намоед: 

Таассуроти мо

Иштироки аввалини мо дар C++ Русия бо шиддатнокии худ хотирмон буд. Ман таассуроти C++ Русияро ҳамчун як чорабинии самимӣ пайдо кардам, ки дар он хати байни омӯзиш ва муоширати зинда қариб ноаён аст. Ҳама чиз, аз рӯҳияи баромадкунандагон то озмунҳои шарикони чорабинӣ, барои баҳсҳои гарм мусоид аст. Мазмуни конфронс, ки аз гузоришҳо иборат аст, доираи хеле васеи мавзӯъҳоро дар бар мегирад, аз ҷумла инноватсияҳои C++, омӯзиши мисолҳои лоиҳаҳои калон ва мулоҳизаҳои меъмории идеологӣ. Аммо нодида гирифтани ҷузъи иҷтимоии чорабинӣ, ки барои бартараф кардани монеаҳои забонӣ на танҳо дар робита бо C++ кӯмак мекунад, беадолатона мебуд.

Мо ба созмондиҳандагони конфронс барои имкони ширкат дар чунин чорабинӣ миннатдорем!
Шумо шояд мақолаи созмондиҳандагонро дар бораи гузашта, имрӯз ва ояндаи C++ Русия дидаед дар блоги JUG Ru.

Ташаккур барои хондан ва мо умедворем, ки такрори рӯйдодҳои мо муфид буд!

Манбаъ: will.com

Илова Эзоҳ