Russia C++: quomodo factum est

Si in principio fabulae dixeris esse C++ codicem in pariete pendere, a fine necesse est te in pede mittere.

Bjarne Stroustrup

A XXXI Octobris ad I Novembrem, colloquium C++ Piter in Russia habitum est Petropoli - unum e magnarum programmatum collationibus in Russia, a JUG Ru Group constituto. Invitati oratores membra C++ Signorum Committee, CppCon oratorum, O'Reilly libri auctorum, assertores consiliorum, ut LLVM, libc++, et Boost. Colloquium spectat ad peritos C++ tincidunt, qui profundiorem suam peritiam et experientias commutationis in communicatione vivant volunt. Discipuli, alumni et universitariae doctores admodum infringo sunt praediti.

Moscuae colloquii editio praesto erit primo Aprili anno proximo visitare, sed interea discipuli nostri narrabunt quae res iucundas ultimo eventu didicerint. 

Russia C++: quomodo factum est

Photo from colloquium album

О нас

Duo discipuli ex Universitate Nationali Research superiore schola oeconomica - St. Petersburg in hac statione laboraverunt:

  • Liza Vasilenko est 4 annus adipiscing studiosus linguam programmandi studens ut pars Mathematicae et Scientiae Computer programmatis. Cum in primo anno apud universitatem linguam C++ cognoscerem, postea expertus sum operando per industrias in industria. Cupidus meus programmandi linguas generatim et operando in particulari programmandi notam suam in electione relationum in colloquio reliquit.
  • Danya Smirnov est 1 annus studiosus programmatis magistri "Programmatio et Data Analysis". Cum adhuc in schola essent, scripsi problemata Olympias in C++, et tunc aliquo modo accidit ut lingua constanter ascendat in opera scholastica et tandem factus est praecipuus laborans linguarum. Placuit colloquio participare ut scientiam meam emendaret ac etiam novas opportunitates cognosceret.

In ipso nuntio, facultas ducis saepe informationes communicat de eventibus educationis ad nostrum proprium pertinentibus. Mense Septembri nuntios de C++ Russia vidimus et auditores mandare decrevimus. Haec nostra prima experientia est huiusmodi colloquia participandi.

Conference structure

  • Renuntiationes

Per duorum dierum decursum periti legerunt 30 rumores, multa argumenta calida operientes: ingeniosi usus linguae lineamenta ad solvendas quaestiones applicatas, opportunas linguae in nexu cum novo vexillo, in C++ consilio et cautiones, cum operando cum consequentibus, exemplis de architectura projecti interesting, nec non de singulis substructione linguae infrastructurae. Tria opera simul fiebant, plerumque duo Russice et una Anglice.

  • Discussion zonis

Post orationem, omnes quaestiones poscit et inperfectae disputationes transferuntur ad loca specialia designata ad communicationem cum oratoribus, cum tabularum titulo instructi. Bona via est ut absumat inter oratiunculas cum dulci colloquio.

  • Fulgur Sermones ac disputationibus informal

Si brevem relationem dare vis, signum in albo tabulae vespertinae Fulguri Loqui potes et quinque minuta temporis ad aliquid loqui de re in colloquio. Exempli gratia, introductio velox ad sanitizers pro C++ (ali- busdam erat nova) vel narratio de cimex in sine generatione fluctus, quae modo audiri potest, sed non videri.

Alia forma est tabula disputationis "Cum Cor ad Cor Committee." In scaenicis quaedam membra sunt normae normae, in proiecto foco est (officiose - ad sinceram atmosphaeram creare, sed ratio "quia OMNIA IGNE" videtur funnier), interrogationes de vexillo et visione generali C++ non calefacta technicae disputationes et sanctimoniales. Contigit etiam ut homines vivos continerent, qui omnino certi esse non possunt vel aliquid scire non possunt.

Ad fans holivarorum, tertius eventus remansit in casu - sessionis BOF "Ite vs. C++". Amantem Go amans, a C++ amans, ante sessionis initium simul praeparant 100500 labitur in themate (sicut problemata cum fasciculis in C++ vel generis defectus in Go), et tunc inter se ac vivam disputationem habent. una cum auditorio et auditorio duo simul considerare conatur. Si e contextu holivar incipit, moderator intervenit et partes conciliat. Forma haec est addictiva: aliquot horae post initium, tantum dimidium labitur completa est. Finis erat vehementer acceleratus.

  • Socius obstat

Socii colloquii in atriis repraesentati sunt - ad bases loquebantur de inceptis currentibus, internships et functiones praebebant, certationes et certationes parvas habebant, et etiam praemia lepida circumibant. Eodem tempore nonnullae turmae etiam offeruntur per initia colloquiorum, quae usui esse possunt iis qui non solum audiendi audiendi causa veniebant.

Singula technicae relationum

Utrosque dies audiebamus nuntiantes. Interdum difficile erat unam relationem ex parallelis eligere - consensimus scindi et commutandi scientiam quae in rumpit. Atque ita multum omissum videtur. Hic loqui velimus de contentis quarundam relationum quas invenimus plus interesting

Exceptiones in C++ per prisma optimizations compilatoris, Romani Rusyaev

Russia C++: quomodo factum est
Slide from presentations

Ut titulus suggerit, Romanus LLVM exemplum inspiciebat cum exceptionibus utens. Eodem tempore, iis qui in opere suo Clang non utuntur, fama potest adhuc aliquam notionem dare quomodo signum in potentia optimized possit. Hoc ideo est, quia tincidunt compilatores et debitae bibliothecae normae inter se communicant et multae solutiones felicissimae coincidere possunt.

Itaque, exceptionem tractare, multa facere debes: codicem tractatum (si) vocant, vel facultates liberas in gradu currenti et acervum altius trahere. Haec omnia perducunt ad hoc quod compilator addit instructiones adiectas vocat quae potentialiter exceptiones iactant. Si ergo exceptio actu non elevatur, propositum adhuc actiones superfluas aget. Ut supra caput aliquo modo minuatur, LLVM plures heuristicos habet ad condiciones determinandas, in quibus exceptio codicis tractatio addi non indiget vel numerus instructionum "extra" reduci potest.

Orator circiter duodecim ex illis examinat et ostendit utrosque casus ubi progressio exsecutionis auxilium accelerant, et eas ubi hae methodi locum non habent.

Ita romanus Rusyaev discipulos ad conclusionem ducit, codicem continens exceptionem tractantem non posse semper cum nulla supra caput exsecutioni mandare, et hoc consilium dat:

  • quando bibliothecas enucleat, valet exceptiones in principio omissis;
  • si exceptiones adhuc necessariae sunt, quotiescumque fieri potest, noexceptis (et const) determinativis ubique addendo, ut compilator optimize quantum fieri potest.

In genere, orator confirmavit sententiam exceptiones optime usitatas esse vel minimas vel omnino relictas.

Renuntiatio labitur in promptu sunt ad nexum sequentem: ["C++ exceptiones per lens of LLVM optimizations compilator"]

Generantia, coroutines et alia dulcedo cerebri explicantis, Adi Shavit

Russia C++: quomodo factum est
Slide from presentations

Una e pluribus relationibus in hoc colloquio innovationibus in C++20 dicatis memorabilis fuit non solum propter variam praesentationem, sed etiam propter claram identitatem quaestionum exsistentium cum logica collectione processus (pro loop, callbacks).

Adi Shavit haec elucidat: methodi nunc available per totam collectionem ingrediuntur et accessum non praebent ad statum aliquem internum medium (vel in casu callbacks, sed cum pluribus effectibus molestis lateris, ut Callback Hell) . Videtur quod sint iteratores, sed etiam cum illis omnia non ita levia sunt: ​​non sunt communes introitus et exitus puncta (incipiunt → finis versus rbegin → scindendi et sic de aliis), non liquet quousque iteramus? Incipiens cum C++20, hae difficultates solvuntur!

Prima optio: iugis. Iteratores involuti, commune commercium accipimus pro initio et fine iterationis et facultatem componendi etiam obtinemus. Ex his omnibus facile est aedificare fistulas plenas processus cursoriae. Sed non omnia tam levia sunt: ​​pars logicae calculi intra exsecutionem cuiusdam iteratoris sita est, quae inpediunt codicem ad intelligendum et debug.

Russia C++: quomodo factum est
Slide from presentations

Bene, hoc casu, C++20 coroutinas addidit (munus, quarum mores in Pythone generantibus similes sunt): exsecutio differri potest, dum statum medium servans, aliquo praesenti valore reddens. Sic consequimur non solum operando cum notitia ut apparet, sed etiam omnem logicam intra coroutinam specificam encapsulans.

Sed musca in unguento est: momento tantum ex parte confirmantur exsistentibus compilatoribus, nec non aeque apte perficiuntur ut velimus: exempli gratia, nondum dignum est notationibus et rebus temporalibus uti in coroutinis. Plus, quaedam restrictiones sunt quae coroutines esse possunt, et functiones constextrices, constructores/destructores, et principales in hoc indice non comprehenduntur.

Ita coroutini notabilem quaestionem solvunt cum simplicitate datorum logicae processus, sed hodierni exsecutiones emendationem requirunt.

materiae:

C++ praestigiae ex Yandex.Taxi, Anton Polukhin

In mea professionali operatione, interdum res mere auxiliarias efficiendi habeo: involucrum inter faciem internam et API bibliothecae alicuius, colligationem vel parsingem. In hoc casu, nulla fere eget nulla addito optimizatione. Sed quid si haec membra in aliquibus popularibus officiis in RuNet adhibentur? In tali condicione, terabytes per hora lignorum solum procedere debebis! Tunc omnes milli secundorum comitum et ideo variis artificiis uti debes - Anton Polukhin de illis loquebatur.

Fortasse exemplum plurrimi interesting exemplum exsecutionis monstratoris ad exsecutionem (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_; 
};

In hoc exemplo, primum volo limaculas bibliothecarum externarum capitalium removere - hoc citius compigam, et a pugnis aliisque similibus erroribus possibilis nominis te tueri potes. 

Bene, #includunt ad .cpp fasciculi movimus: opus est deinceps declaratione involutae API, necnon std:: singulare_ptr. Nunc habemus prouincia dynamica et alia iniucunda sicut notitia dispersa per fasciculum notitiarum et cautiones imminutae. std :: aligned_storage adiuvare potest his omnibus. 

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

Sola quaestio: debes magnitudinem et alignment pro singulis fascia notare - faciamus nostrum pimpl templates cum parametris utere quibusdam valoribus arbitrariis et persecutori addere quod omnia ius habuimus: 

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

Cum T iam definitum est cum destructor processus, hoc signum recte dividetur et in scaena compilationum debitae magnitudinis et alignment valores, qui errores ineundos esse oportet, outputabit. Ita, curriculo unius additae compilationi sumptus, destinatio dynamica classium involutarum tollemus, API in .cpp lima cum exsequenda abscondimus, et etiam consilium quod a processore caching aptius accipimus.

Logging et parsing minus infigo visa sunt et ideo in hac recognitione non memorabuntur.

Renuntiatio labitur in promptu sunt ad nexum sequentem: ["C ++ dolis ex Taxi"]

Artificia moderna servandi codicem tuum ARIDUM, Björn Fahller

In hac colloquio, Björn Fahller pluribus modis ostendit pugnam stili uiti repetitae conditionis inhibet;

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

Sonus nota? Pluribus potentiis C++ technicis recentioribus signis adhibitis, eandem functionem sine ulla poena persecuta eleganter efficere potes. Compare:   

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

Ut infinitum numerum compescendo tractamus, statim opus est ut variis exemplis et plicationibus expressionibus. Ponamus nos velimus reprimere aequalitatem plurium variabilium ad elementi enum status_typi. Primum quod in mentem venit est scribere munus adiutorium 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) || ...); 
}

Hoc medium est, frustretur. Hactenus in codice non magis legenda est;

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

Non-type templates parametri adiuvabit condicionem paulo meliorem. Eorum auxilio elementa enumerabilia enum transferemus ad parametris indicem parametri: 

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

Utendo auto in parametris non-typis parametris (C ++ 17), accessus ad comparationes simpliciter generaliter non solum cum elementis state_type, sed etiam cum primitivis speciebus, quae parametris non-typis templates adhiberi possunt;


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

Per has successivas emendationes, syntaxum fluentem desideratum ad reprimendum obtinetur;


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

In hoc exemplo, dux deductionis optatam structuram parametri ad compilator suggerere inservit, qui rationes artificis argumentorum novit. 

Praeterea - plus interest. Bjorn docet quomodo codicem provenientem generaliter pro comparatione operariorum ultra ==, et deinde pro operationibus arbitrariis. In via, tales lineamenta ut no_unique_electronica attributa (C++20) et parametri in functionibus lambdae (C ++ 20) explicantur, adhibitis exemplis explicantur. (Ita, iam syntax lambda facilius memorari potest - haec quattuor paria parenthesi omnium generum consecutiva sunt.) Ultima solutio functionum quasi constructor singularium utens vere calefacit animam meam, ne dicam vocem tuple in optimis traditionibus de lambda. calculi.

In fine noli oblivisci eam expolire:

  • Memento quod lambdas gratis constexpr sunt; 
  • Adiciamus perfectam missionem et eius syntaxin deformis in relatione ad parametri sarcinam in lambda clausurae;
  • Plura demus compilator occasiones optimizations cum noexceptis conditionalibus; 
  • Curemus erroris facilioris emissi in templates per bonas lambdas expressas reddere. Hoc compilator coget ad plura compescere antequam munus Formulae actu vocatur - in typo reprimendo scaena. 

Ad singula, quaeso, ad materias lectionis referas: 

Nostrae impressiones

Prima nostra participatio C++ Russiae eius sedulo memorabilis fuit. C++ Russiam impressionem consecutus sum ut sincerus eventus, ubi linea inter institutionem et communicationem vivam fere imperceptibilis est. Omnia, ex modo loquentium ad certationes ab eventu socii, ad disputationes calefactas conducunt. Contentum conferentiae, quae ex relationibus constant, satis amplis argumentis comprehendit C++ innovationibus, studiorum causa magnarum inceptorum et considerationum architecturae ideologicae. At iniquum esset ignorare eventum socialem, qui adiuvat claustra linguae in relatione non solum ad C++ superare.

Gratias agimus conferentiarum auctorum occasionem talem eventum participandi!
Potes videre institutorum stationem de praeterito, praesenti et futuro C++ Russiae on the JUG Ru blog.

Gratias legendi, et spem nostram narrando adiuvabant!

Source: www.habr.com

Add a comment