Ja lugas sÄkumÄ tu saki, ka pie sienas karÄjÄs C++ kods, tad beigÄs tas noteikti ieÅ”aus tev kÄjÄ.
Bjarne Stroustrup
No 31. oktobra lÄ«dz 1. novembrim SanktpÄterburgÄ norisinÄjÄs C++ Russia Piter konference - viena no vÄrienÄ«gajÄm programmÄÅ”anas konferencÄm KrievijÄ, ko organizÄja JUG Ru Group. Vieslektoru vidÅ« ir C++ standartu komitejas locekļi, CppCon runÄtÄji, O'Reilly grÄmatu autori un tÄdu projektu uzturÄtÄji kÄ LLVM, libc++ un Boost. Konference ir paredzÄta pieredzÄjuÅ”iem C++ izstrÄdÄtÄjiem, kuri vÄlas padziļinÄt savas zinÄÅ”anas un apmainÄ«ties ar pieredzi dzÄ«vajÄ komunikÄcijÄ. Studentiem, maÄ£istrantiem un augstskolu pasniedzÄjiem tiek nodroÅ”inÄtas ļoti jaukas atlaides.
Konferences Maskavas izdevumu varÄs apmeklÄt jau nÄkamÄ gada aprÄ«lÄ«, bet tikmÄr mÅ«su studenti pastÄstÄ«s, ko interesantu viÅi uzzinÄja pÄdÄjÄ pasÄkumÄ.
Divi studenti no NacionÄlÄs pÄtniecÄ«bas universitÄtes AugstÄkÄs ekonomikas skolas SanktpÄterburgÄ strÄdÄja pie Ŕī amata:
Liza Vasiļenko ir 4. kursa bakalaura studente, kas LietiŔķÄs matemÄtikas un datorzinÄtÅu programmas ietvaros studÄ programmÄÅ”anas valodas. IepazÄ«stoties ar C++ valodu pirmajÄ augstskolas kursÄ, pÄc tam guvu pieredzi darbÄ ar to, stažÄjoties nozarÄ. Mana aizrauÅ”anÄs ar programmÄÅ”anas valodÄm kopumÄ un jo Ä«paÅ”i funkcionÄlo programmÄÅ”anu atstÄja savas pÄdas konferences referÄtu atlasÄ.
Danija Smirnova ir maÄ£istra programmas āProgrammÄÅ”ana un datu analÄ«zeā 1. kursa studente. VÄl mÄcoties skolÄ, es rakstÄ«ju olimpiÄdes uzdevumus C++ valodÄ, un tad kaut kÄ sanÄca tÄ, ka valoda nemitÄ«gi parÄdÄ«jÄs izglÄ«tÄ«bas pasÄkumos un galu galÄ kļuva par galveno darba valodu. NolÄmu piedalÄ«ties konferencÄ, lai pilnveidotu savas zinÄÅ”anas un arÄ« uzzinÄtu par jaunÄm iespÄjÄm.
BiļetenÄ fakultÄtes vadÄ«ba bieži dalÄs ar informÄciju par izglÄ«tÄ«bas pasÄkumiem, kas saistÄ«ti ar mÅ«su specialitÄti. SeptembrÄ« mÄs redzÄjÄm informÄciju par C++ Krieviju un nolÄmÄm reÄ£istrÄties kÄ klausÄ«tÄji. Å Ä« ir mÅ«su pirmÄ pieredze, piedaloties Å”ÄdÄs konferencÄs.
Konferences struktūra
PÄrskati
Divu dienu laikÄ eksperti nolasÄ«ja 30 ziÅojumus, aptverot daudzas aktuÄlas tÄmas: Ä£eniÄls valodas funkciju lietojums lietiŔķo problÄmu risinÄÅ”anai, gaidÄmie valodas atjauninÄjumi saistÄ«bÄ ar jauno standartu, kompromisi C++ dizainÄ un piesardzÄ«bas pasÄkumi, strÄdÄjot ar to sekÄm, piemÄri. interesantu projektu arhitektÅ«ru, kÄ arÄ« dažas valodas infrastruktÅ«ras detaļas. VienlaicÄ«gi notika trÄ«s izrÄdes, visbiežÄk divas krievu un viena angļu valodÄ.
Diskusiju zonas
PÄc uzstÄÅ”anÄs visi neuzdotie jautÄjumi un nepabeigtÄs diskusijas tika pÄrceltas uz speciÄli saziÅai ar runÄtÄjiem paredzÄtÄm zonÄm, kas aprÄ«kotas ar marÄ·ieru dÄļiem. Labs veids, kÄ atpÅ«sties starp runÄm ar patÄ«kamu sarunu.
Zibens sarunas un neformÄlas diskusijas
Ja vÄlaties sniegt Ä«su ziÅojumu, varat pierakstÄ«ties uz tÄfeles vakara zibens sarunÄm un iegÅ«t piecas minÅ«tes laika, lai runÄtu par jebko par konferences tÄmu. PiemÄram, Ä«ss ievads par dezinfekcijas lÄ«dzekļiem priekÅ” C++ (dažiem tas bija jaunums) vai stÄsts par sinusoidÄlÄ viļÅa Ä£enerÄÅ”anas kļūdu, kuru var tikai dzirdÄt, bet neredzÄt.
Cits formÄts ir paneļdiskusija āAr sirdi uz sirdi komitejaā. Uz skatuves ir daži standartizÄcijas komitejas locekļi, uz projektora ir kamÄ«ns (oficiÄli - lai radÄ«tu sirsnÄ«gu atmosfÄru, bet jocÄ«gÄks Ŕķiet iemesls "jo VISS dega"), jautÄjumi par standartu un C++ vispÄrÄjo redzÄjumu. , bez karstÄm tehniskÄm diskusijÄm un holivariem. IzrÄdÄ«jÄs, ka komitejÄ ir arÄ« dzÄ«vi cilvÄki, kuri var nebÅ«t par kaut ko lÄ«dz galam pÄrliecinÄti vai kaut ko nezinÄt.
Holivaru cienÄ«tÄjiem pie lietas palika treÅ”ais notikums - BOF sesija āGo vs. C++ā. MÄs uzÅemam Go mīļotÄju, C++ cienÄ«tÄju, pirms sesijas sÄkuma viÅi kopÄ sagatavo 100500 XNUMX slaidus par tÄmu (piemÄram, problÄmas ar pakotnÄm C++ vai vispÄrÄ«go lÄ«dzekļu trÅ«kums programmÄ Go), un pÄc tam viÅi savÄ starpÄ aktÄ«vi apspriežas. ar auditoriju, un auditorija mÄÄ£ina saprast divus viedokļus vienlaikus. Ja holivar sÄkas Ärpus konteksta, moderators iejaucas un samierina puses. Å is formÄts rada atkarÄ«bu: vairÄkas stundas pÄc starta tika pabeigta tikai puse no slaidiem. Beigas bija krietni jÄpaÄtrina.
Partneru stendi
Konferences partneri bija pÄrstÄvÄti zÄlÄs - stendos stÄstÄ«ja par aktuÄlajiem projektiem, piedÄvÄja prakses un nodarbinÄtÄ«bas vietas, rÄ«koja viktorÄ«nas un nelielus konkursus, kÄ arÄ« izlozÄja jaukas balvas. TajÄ paÅ”Ä laikÄ daži uzÅÄmumi pat piedÄvÄja iziet sÄkotnÄjos interviju posmus, kas varÄtu bÅ«t noderÄ«gi tiem, kas ieradÄs ne tikai klausÄ«ties reportÄžas.
PÄrskatu tehniskÄ informÄcija
Abas dienas klausÄ«jÄmies referÄtus. Brīžiem bija grÅ«ti izvÄlÄties vienu referÄtu no paralÄlajiem - vienojÄmies sadalÄ«ties un apmainÄ«ties ar iegÅ«tajÄm zinÄÅ”anÄm pÄrtraukumos. Un pat tÄ Å”Ä·iet, ka daudz kas ir izpalikts. Å eit mÄs vÄlÄtos runÄt par dažu ziÅojumu saturu, kas mums Ŕķita visinteresantÄkie
IzÅÄmumi valodÄ C++ caur kompilatoru optimizÄcijas prizmu, RomÄns Rusjajevs
KÄ liecina nosaukums, RomÄns aplÅ«koja darbu ar izÅÄmumiem, izmantojot LLVM piemÄru. TajÄ paÅ”Ä laikÄ tiem, kuri savÄ darbÄ neizmanto Clang, pÄrskats joprojÄm var sniegt priekÅ”statu par to, kÄ kodu varÄtu optimizÄt. Tas ir tÄpÄc, ka kompilatoru un atbilstoÅ”o standarta bibliotÄku izstrÄdÄtÄji sazinÄs savÄ starpÄ un daudzi veiksmÄ«gi risinÄjumi var sakrist.
TÄtad, lai apstrÄdÄtu izÅÄmumu, jums ir jÄdara daudzas lietas: jÄizsauc apstrÄdes kods (ja tÄds ir) vai jÄatbrÄ«vo resursi paÅ”reizÄjÄ lÄ«menÄ« un jÄpalielina steka. Tas viss noved pie tÄ, ka kompilators pievieno papildu norÄdÄ«jumus zvaniem, kas potenciÄli rada izÅÄmumus. TÄpÄc, ja izÅÄmums faktiski netiek izvirzÄ«ts, programma joprojÄm veiks nevajadzÄ«gas darbÄ«bas. Lai kaut kÄ samazinÄtu pieskaitÄmÄs izmaksas, LLVM ir vairÄkas heiristikas, lai noteiktu situÄcijas, kad izÅÄmumu apstrÄdes kods nav jÄpievieno vai var samazinÄt āpapilduā instrukciju skaitu.
RunÄtÄjs izskata apmÄram desmitus no tiem un parÄda gan situÄcijas, kurÄs tÄs palÄ«dz paÄtrinÄt programmas izpildi, gan tÄs, kurÄs Ŕīs metodes nav piemÄrojamas.
TÄdÄjÄdi RomÄns Rusjajevs liek studentiem secinÄt, ka kodu, kas satur izÅÄmumu apstrÄdi, ne vienmÄr var izpildÄ«t ar nulli, un sniedz Å”Ädu padomu:
attÄ«stot bibliotÄkas, principÄ ir vÄrts atteikties no izÅÄmumiem;
ja vÄl ir vajadzÄ«gi izÅÄmumi, tad kur vien iespÄjams ir vÄrts visur pievienot noexcept (un const) modifikatorus, lai kompilators varÄtu maksimÄli optimizÄt.
KopumÄ runÄtÄjs apstiprinÄja uzskatu, ka izÅÄmumus vislabÄk izmantot lÄ«dz minimumam vai atteikties no tiem vispÄr.
Viens no daudzajiem ziÅojumiem Å”ajÄ konferencÄ, kas bija veltÄ«ts jauninÄjumiem C++20, bija neaizmirstams ne tikai ar savu krÄsaino prezentÄciju, bet arÄ« ar skaidru esoÅ”o problÄmu identificÄÅ”anu kolekcijas apstrÄdes loÄ£ikÄ (cilpai, atzvanÄ«Å”anai).
Adi Å avits uzsver sekojoÅ”o: paÅ”laik pieejamÄs metodes iet cauri visai kolekcijai un nenodroÅ”ina piekļuvi kÄdam iekÅ”Äjam starpstÄvoklim (vai arÄ« tÄs nodroÅ”ina atzvanÄ«Å”anas gadÄ«jumÄ, bet ar lielu skaitu nepatÄ«kamu blakusparÄdÄ«bu, piemÄram, Callback Hell) . Å Ä·iet, ka ir iteratori, bet pat ar tiem viss nav tik gludi: nav kopÄ«gu ieejas un izejas punktu (sÄkums ā beigas pret rbegin ā rendÄt un tÄ tÄlÄk), nav skaidrs, cik ilgi mÄs atkÄrtosim? SÄkot ar C++20, Ŕīs problÄmas ir atrisinÄtas!
PirmÄ iespÄja: diapazoni. IesaiÅojot iteratorus, mÄs iegÅ«stam kopÄ«gu interfeisu iterÄcijas sÄkumam un beigÄm, kÄ arÄ« iegÅ«stam iespÄju komponÄt. Tas viss ļauj viegli izveidot pilnvÄrtÄ«gus datu apstrÄdes cauruļvadus. Bet ne viss ir tik gluds: daļa aprÄÄ·inu loÄ£ikas atrodas konkrÄta iteratora ievieÅ”anÄ, kas var sarežģīt koda izpratni un atkļūdoÅ”anu.
Å ajÄ gadÄ«jumÄ C++20 pievienoja korutÄ«nas (funkcijas, kuru darbÄ«ba ir lÄ«dzÄ«ga Python Ä£eneratoriem): izpildi var atlikt, atgriežot kÄdu paÅ”reizÄjo vÄrtÄ«bu, vienlaikus saglabÄjot starpstÄvokli. TÄdÄjÄdi mÄs panÄkam ne tikai darbu ar datiem, kÄdi tie parÄdÄs, bet arÄ« visas loÄ£ikas iekapsulÄÅ”anu noteiktÄ korutÄ«nÄ.
Bet tur ir muÅ”a: paÅ”laik tos tikai daļÄji atbalsta esoÅ”ie kompilatori, kÄ arÄ« nav ieviesti tik glÄ«ti, kÄ mÄs vÄlÄtos: piemÄram, pagaidÄm nav vÄrts izmantot atsauces un pagaidu objektus korutÄ«nÄs. TurklÄt ir daži ierobežojumi attiecÄ«bÄ uz to, kas var bÅ«t korutÄ«nas, un Å”ajÄ sarakstÄ nav iekļautas funkcijas constexpr, konstruktori/destruktori un galvenais.
TÄdÄjÄdi korutÄ«nas atrisina bÅ«tisku daļu problÄmu ar datu apstrÄdes loÄ£ikas vienkÄrŔību, taÄu to paÅ”reizÄjÄs realizÄcijas prasa uzlabojumus.
ProfesionÄlajÄ darbÄ«bÄ man dažreiz ir jÄievieÅ” tÄ«ri palÄ«glietas: iesaiÅojums starp iekÅ”Äjo interfeisu un kÄdas bibliotÄkas API, reÄ£istrÄÅ”ana vai parsÄÅ”ana. Å ajÄ gadÄ«jumÄ parasti nav nepiecieÅ”ama papildu optimizÄcija. Bet ko darÄ«t, ja Å”ie komponenti tiek izmantoti dažos populÄrÄkajos RuNet pakalpojumos? Å ÄdÄ situÄcijÄ jums bÅ«s jÄapstrÄdÄ terabaiti stundÄ vien žurnÄlu! Tad katra milisekunde ir svarÄ«ga un tÄpÄc nÄkas Ä·erties pie dažÄdiem trikiem ā par tiem stÄstÄ«ja Antons Poļuhins.
VarbÅ«t visinteresantÄkais piemÄrs bija norÄdes uz ievieÅ”anu (pimpl) modeļa ievieÅ”ana.
Å ajÄ piemÄrÄ vispirms es vÄlos atbrÄ«voties no ÄrÄjo bibliotÄku galvenes failiem - tas tiks apkopots ÄtrÄk, un jÅ«s varat pasargÄt sevi no iespÄjamiem nosaukumu konfliktiem un citÄm lÄ«dzÄ«gÄm kļūdÄm.
Labi, mÄs pÄrvietojÄm #include uz .cpp failu: mums ir nepiecieÅ”ama iesaiÅotÄ API uz priekÅ”u deklarÄcija, kÄ arÄ« std::unique_ptr. Tagad mums ir dinamiski pieŔķīrumi un citas nepatÄ«kamas lietas, piemÄram, dati, kas izkaisÄ«ti pa daudzÄm datu kopÄm, un samazinÄtas garantijas. std::aligned_storage var palÄ«dzÄt ar to visu.
VienÄ«gÄ problÄma: jums ir jÄnorÄda katra iesaiÅojuma izmÄrs un lÄ«dzinÄjums - izveidosim mÅ«su pimpl veidni ar parametriem , izmantojiet dažas patvaļīgas vÄrtÄ«bas un pievienojiet destruktoram pÄrbaudi, vai viss ir pareizi:
TÄ kÄ T jau ir definÄts, apstrÄdÄjot destruktoru, Å”is kods tiks pareizi parsÄts un kompilÄcijas stadijÄ izvadÄ«s nepiecieÅ”amo izmÄru un izlÄ«dzinÄÅ”anas vÄrtÄ«bas, kas jÄievada kÄ kļūdas. TÄdÄjÄdi uz vienas papildu kompilÄcijas darbÄ«bas rÄÄ·ina mÄs atbrÄ«vojamies no iesaiÅoto klaÅ”u dinamiskÄs pieŔķirÅ”anas, paslÄpjam API .cpp failÄ ar implementÄciju, kÄ arÄ« iegÅ«stam dizainu, kas ir vairÄk piemÄrots procesora keÅ”atmiÅai.
MÅ«sdienÄ«gas metodes koda saglabÄÅ”anai SAUSÄ, Bjƶrn Fahller
Å ajÄ runÄ Bjerns Fahlers parÄda vairÄkus dažÄdus veidus, kÄ cÄ«nÄ«ties pret atkÄrtotu stÄvokļa pÄrbaužu stilistiskajiem trÅ«kumiem:
assert(a == IDLE || a == CONNECTED || a == DISCONNECTED);
IzklausÄs pazÄ«stami? Izmantojot vairÄkas jaudÄ«gas C++ tehnikas, kas ieviestas jaunÄkajos standartos, jÅ«s varat eleganti ieviest to paÅ”u funkcionalitÄti bez veiktspÄjas soda. SalÄ«dzinÄt:
Lai apstrÄdÄtu nefiksÄtu pÄrbaužu skaitu, nekavÄjoties jÄizmanto dažÄdas veidnes un locÄ«Å”anas izteiksmes. PieÅemsim, ka vÄlamies pÄrbaudÄ«t vairÄku mainÄ«go vienÄdÄ«bu ar enum elementu state_type. PirmÄ lieta, kas nÄk prÄtÄ, ir uzrakstÄ«t palÄ«gfunkciju is_any_of:
Izmantojot auto netipa veidnes parametrÄ (C++17), pieeja vienkÄrÅ”i vispÄrina salÄ«dzinÄjumus ne tikai ar state_type elementiem, bet arÄ« ar primitÄ«viem tipiem, kurus var izmantot kÄ netipa veidnes parametrus:
Å ajÄ piemÄrÄ atskaitÄ«Å”anas rokasgrÄmata kalpo, lai kompilatoram ieteiktu vÄlamos struktÅ«ras veidnes parametrus, kas zina konstruktora argumentu veidus.
TÄlÄk - interesantÄk. Bjorns mÄca, kÄ iegÅ«to kodu vispÄrinÄt salÄ«dzinÄÅ”anas operatoriem, kas pÄrsniedz ==, un pÄc tam patvaļīgÄm darbÄ«bÄm. Izmantojot lietoÅ”anas piemÄrus, tiek izskaidrotas tÄdas funkcijas kÄ atribÅ«ts no_unique_address (C++20) un veidnes parametri lambda funkcijÄs (C++20). (JÄ, tagad lambda sintakse ir vÄl vieglÄk iegaumÄjama - tie ir Äetri secÄ«gi visu veidu iekavu pÄri.) GalÄ«gais risinÄjums, izmantojot funkcijas kÄ konstruktora detaļas, patieÅ”Äm sasilda manu dvÄseli, nemaz nerunÄjot par izteicienu kortežs labÄkajÄs lambda tradÄ«cijÄs. aprÄÄ·ins.
BeigÄs neaizmirstiet to noslÄ«pÄt:
Atcerieties, ka lambdas ir constexpr bez maksas;
Pievienosim perfektu pÄrsÅ«tÄ«Å”anu un paskatÄ«simies uz tÄs neglÄ«to sintaksi saistÄ«bÄ ar parametru pakotni lambda slÄdzenÄ;
Dosim kompilatoram vairÄk iespÄju optimizÄcijai ar nosacÄ«jumu noexcept;
ParÅ«pÄsimies par saprotamÄku kļūdu izvadi veidnÄs, pateicoties skaidrÄm lambdas atgrieÅ”anas vÄrtÄ«bÄm. Tas liks kompilatoram veikt vairÄk pÄrbaudes, pirms tiek faktiski izsaukta veidnes funkcija ā tipa pÄrbaudes stadijÄ.
MÅ«su pirmÄ dalÄ«ba C++ KrievijÄ palika atmiÅÄ ar savu intensitÄti. Par C++ Krieviju man radÄs iespaids kÄ par sirsnÄ«gu pasÄkumu, kur robeža starp treniÅiem un dzÄ«vo komunikÄciju ir gandrÄ«z nemanÄma. Viss, sÄkot no runÄtÄju noskaÅojuma un beidzot ar pasÄkuma partneru konkursiem, veicina asas diskusijas. Konferences saturs, kas sastÄv no ziÅojumiem, aptver diezgan plaÅ”u tÄmu loku, tostarp C++ inovÄcijas, lielu projektu gadÄ«jumu izpÄti un ideoloÄ£iskus arhitektÅ«ras apsvÄrumus. TaÄu bÅ«tu negodÄ«gi ignorÄt pasÄkuma sociÄlo komponentu, kas palÄ«dz pÄrvarÄt valodas barjeras ne tikai attiecÄ«bÄ uz C++.
Pateicamies konferences organizatoriem par iespÄju piedalÄ«ties Å”ÄdÄ pasÄkumÄ!
IespÄjams, esat redzÄjis organizatoru ierakstu par C++ Krievijas pagÄtni, tagadni un nÄkotni JUG Ru emuÄrÄ.
Paldies, ka lasÄ«jÄt, un mÄs ceram, ka mÅ«su notikumu atkÄrtojums bija noderÄ«gs!