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Ä.

Foto no
РнаŃ
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

Slaids no
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.
PÄrskatu slaidi ir pieejami Å”ajÄ saitÄ:
Ģeneratori, korutīnas un citi smadzenes atritinoŔi saldumi, Adi Shavit

Slaids no
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.

Slaids no
Å 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.
MateriÄli:
- Slaidi no C++ Krievijas ā
C++ triki no Yandex.Taxi, Antons Poluhins
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.
#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_;
};Å 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.
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_;
};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:
~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Ä 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.
MežizstrÄde un parsÄÅ”ana Ŕķita mazÄk iespaidÄ«ga, tÄpÄc Å”ajÄ pÄrskatÄ tÄ netiks pieminÄta.
PÄrskatu slaidi ir pieejami Å”ajÄ saitÄ:
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:
assert(a == any_of(IDLE, CONNECTED, DISCONNECTED));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:
enum state_type { IDLE, CONNECTED, DISCONNECTED };
template <typename ... Ts>
bool is_any_of(state_type s, const Ts& ... ts) {
return ((s == ts) || ...);
}
Å is starprezultÄts ir neapmierinoÅ”s. PagaidÄm kods nav kļuvis lasÄmÄks:
assert(is_any_of(state, IDLE, DISCONNECTING, DISCONNECTED)); Netipa veidÅu parametri palÄ«dzÄs nedaudz uzlabot situÄciju. Ar viÅu palÄ«dzÄ«bu mÄs pÄrsÅ«tÄ«sim uzskaitÄmos enum elementus uz veidnes parametru sarakstu:
template <state_type ... states>
bool is_any_of(state_type t) {
return ((t == states) | ...);
}
assert(is_any_of<IDLE, DISCONNECTING, DISCONNECTED>(state)); 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:
template <auto ... alternatives, typename T>
bool is_any_of(const T& t) {
return ((t == alternatives) | ...);
}Izmantojot Å”os secÄ«gos uzlabojumus, tiek sasniegta vÄlamÄ plÅ«stoÅ”a pÄrbaužu sintakse:
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);
Å 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Ä.
SÄ«kÄku informÄciju skatÄ«t lekciju materiÄlos:
- ZiÅot par slaidiem:
Mūsu iespaidi
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 .
Paldies, ka lasÄ«jÄt, un mÄs ceram, ka mÅ«su notikumu atkÄrtojums bija noderÄ«gs!
Avots: www.habr.com
