Mar a dh’eadar-theangaich sinn 10 millean loidhne de chòd C++ gu inbhe C++14 (agus an uairsin gu C++17)

O chionn beagan ùine (as t-fhoghar 2016), ri linn leasachadh an ath dhreach den àrd-ùrlar teicneòlas 1C: Iomairt, dh ’èirich a’ cheist taobh a-staigh an sgioba leasachaidh mu bhith a ’toirt taic don inbhe ùr C ++ 14 anns a' chòd againn. Bheireadh gluasad gu inbhe ùr, mar a bha sinn a’ gabhail ris, cothrom dhuinn mòran rudan a sgrìobhadh ann an dòigh nas eireachdail, nas sìmplidh agus nas earbsaiche, agus dhèanadh e nas sìmplidhe taic agus cumail suas a’ chòd. Agus tha e coltach nach eil dad iongantach anns an eadar-theangachadh, mura h-eil airson sgèile bunait a 'chòd agus feartan sònraichte ar còd.

Dhaibhsan aig nach eil eòlas, tha 1C: Iomairt na àrainneachd airson leasachadh luath air tagraidhean gnìomhachais tar-àrd-ùrlar agus ùine ruith airson an cur gu bàs air diofar OSes agus DBMSs. San fharsaingeachd, tha an toradh a ’toirt a-steach:

Feuchaidh sinn ris an aon chòd a sgrìobhadh airson diofar shiostaman obrachaidh cho mòr ‘s as urrainn dhuinn - tha bunait còd an fhrithealaiche 99% cumanta, tha bunait còd teachdaiche timcheall air 95%. Tha an àrd-ùrlar teicneòlas 1C: Iomairt air a sgrìobhadh sa mhòr-chuid ann an C ++ agus tha feartan còd tuairmseach air an toirt seachad gu h-ìosal:

  • 10 millean loidhne de chòd C ++,
  • 14 mìle faidhle,
  • 60 mìle clas,
  • leth mhillean dòigh.

Agus dh'fheumadh an stuth seo uile a bhith air eadar-theangachadh gu C ++14. An-diugh innsidh sinn dhut mar a rinn sinn seo agus na thachair dhuinn sa phròiseas.

Mar a dh’eadar-theangaich sinn 10 millean loidhne de chòd C++ gu inbhe C++14 (agus an uairsin gu C++17)

Àicheadh

Tha a h-uile dad a tha sgrìobhte gu h-ìosal mu obair slaodach / luath, (chan e) caitheamh cuimhne mòr le buileachadh chlasaichean àbhaisteach ann an grunn leabharlannan a’ ciallachadh aon rud: tha seo fìor AIRSON SA. Tha e gu math comasach gum bi buileachadh àbhaisteach nas freagarraiche airson do ghnìomhan. Thòisich sinn bho ar gnìomhan fhèin: ghabh sinn dàta a bha àbhaisteach don luchd-dèiligidh againn, ruith sinn suidheachaidhean àbhaisteach orra, choimhead sinn air coileanadh, an ìre de chuimhne a chaidh a chaitheamh, msaa, agus rinn sinn mion-sgrùdadh an robh sinn fhèin agus ar teachdaichean riaraichte leis na toraidhean sin no nach robh. . Agus rinn iad gnìomh a rèir.

Na bha againn

An toiseach, sgrìobh sinn an còd airson an àrd-ùrlar 1C:Enterprise 8 a’ cleachdadh Microsoft Visual Studio. Thòisich am pròiseact tràth anns na 2000n agus bha dreach Windows a-mhàin againn. Gu nàdarra, bhon uairsin tha an còd air a leasachadh gu gnìomhach, chaidh mòran dhòighean ath-sgrìobhadh gu tur. Ach chaidh an còd a sgrìobhadh a rèir inbhe 1998, agus, mar eisimpleir, bha na camagan ceart-cheàrnach againn air an sgaradh le beàrnan gus am biodh an cruinneachadh soirbheachail, mar seo:

vector<vector<int> > IntV;

Ann an 2006, nuair a chaidh dreach àrd-ùrlair 8.1 a leigeil ma sgaoil, thòisich sinn a’ toirt taic do Linux agus thionndaidh sinn gu leabharlann àbhaisteach treas-phàrtaidh. STLPort. B 'e aon de na h-adhbharan airson a' ghluasaid a bhith ag obair le loidhnichean farsaing. Anns a’ chòd againn, bidh sinn a’ cleachdadh std :: wstring, a tha stèidhichte air an t-seòrsa wchar_t, air feadh. Is e a mheud ann an Windows 2 bytes, agus ann an Linux is e 4 bytes am prìomh rud. Dh’ adhbhraich seo neo-fhreagarrachd ar protocolaidhean binary eadar teachdaiche agus frithealaiche, a bharrachd air grunn dàta leantainneach. A’ cleachdadh nan roghainnean gcc, faodaidh tu sònrachadh gu bheil meud wchar_t aig àm cur ri chèile cuideachd 2 bytes, ach an uairsin faodaidh tu dìochuimhneachadh mu bhith a’ cleachdadh an leabharlann àbhaisteach bhon inneal-cruinneachaidh, oir bidh e a’ cleachdadh glibc, a tha e fhèin air a chur ri chèile airson faidhle 4-byte wchar_t. B’ e adhbharan eile buileachadh na b’ fheàrr de chlasaichean àbhaisteach, taic airson clàran hash, agus eadhon aithris air semantics gluasad a-steach do shoithichean, a chleachd sinn gu gnìomhach. Agus aon adhbhar eile, mar a chanas iad mu dheireadh ach chan e as ìsle, b’ e coileanadh sreang. Bha an clas againn fhèin airson teudan, oir... Air sgàth cho sònraichte sa tha am bathar-bog againn, thathas a’ cleachdadh obair sreang gu farsaing agus tha seo deatamach dhuinne.

Tha an sreang againn stèidhichte air beachdan optimization sreang a chaidh a chuir an cèill tràth anns na 2000n Anndra Alexandrescu. Nas fhaide air adhart, nuair a bha Alexandrescu ag obair aig Facebook, a rèir a mholadh, chaidh loidhne a chleachdadh anns an einnsean Facebook a bha ag obair air prionnsapalan co-chosmhail (faic an leabharlann amaideachd).

Chleachd an loidhne againn dà phrìomh theicneòlas optimization:

  1. Airson luachan goirid, thathas a’ cleachdadh bufair a-staigh anns an nì sreang fhèin (gun fheum air riarachadh cuimhne a bharrachd).
  2. Airson a h-uile càil eile, thathas a’ cleachdadh meacanaig Dèan lethbhreac air Sgrìobh. Tha luach an t-sreang air a stòradh ann an aon àite, agus thathas a’ cleachdadh cuntair iomraidh aig àm sònrachaidh / atharrachaidh.

Gus cruinneachadh àrd-ùrlair a luathachadh, chuir sinn a-mach buileachadh an t-sruth bhon tionndadh STLPort againn (nach do chleachd sinn), thug seo dhuinn timcheall air 20% de chruinneachadh nas luaithe. Às deidh sin bha againn ri feum cuibhrichte a dhèanamh A BHROSNACHADH. Bidh Boost a’ dèanamh feum mòr de shruth, gu sònraichte anns na APIan seirbheis aige (mar eisimpleir, airson logadh), agus mar sin bha againn ri atharrachadh gus cleachdadh sruth a thoirt air falbh. Rinn seo, an uair sin, e duilich dhuinn gluasad gu dreachan ùra de Boost.

An treas dòigh

Nuair a ghluais sinn gu inbhe C++14, bheachdaich sinn air na roghainnean a leanas:

  1. Dèan ùrachadh air an STLPort a dh’ atharraich sinn gu inbhe C ++14. Tha an roghainn gu math duilich, oir ... chaidh stad a chuir air taic airson STLPort ann an 2010, agus dh'fheumadh sinn a chòd gu lèir a thogail sinn fhèin.
  2. Gluasad gu buileachadh STL eile a tha co-chosmhail ri C ++14. Tha e fìor ion-mhiannaichte gum bi am buileachadh seo airson Windows agus Linux.
  3. Nuair a bhios tu a’ cur ri chèile airson gach OS, cleachd an leabharlann a tha air a thogail a-steach don inneal-cruinneachaidh iomchaidh.

Chaidh a' chiad roghainn a dhiùltadh gu tur air sgàth cus obrach.

Bha sinn a 'smaoineachadh air an dàrna roghainn airson greis; air a mheas mar thagraiche libc++, ach aig an àm sin cha robh e ag obair fo Windows. Gus libc ++ a phortadh gu Windows, dh'fheumadh tu tòrr obrach a dhèanamh - mar eisimpleir, sgrìobh a h-uile dad thu fhèin a tha co-cheangailte ri snàithleanan, sioncronadh snàithlean agus atomicity, oir chleachd libc ++ anns na raointean sin API POSIX.

Agus thagh sinn an treas dòigh.

Eadar-ghluasad

Mar sin, bha againn ri cleachdadh STLPort a chuir an àite leabharlannan nan luchd-cruinneachaidh co-fhreagarrach (Visual Studio 2015 airson Windows, gcc 7 airson Linux, clang 8 airson macOS).

Gu fortanach, chaidh an còd againn a sgrìobhadh sa mhòr-chuid a rèir stiùiridhean agus cha do chleachd e a h-uile seòrsa cleas ciallach, agus mar sin chaidh an gluasad gu leabharlannan ùra air adhart gu ìre mhath rèidh, le cuideachadh bho sgriobtaichean a chuir an àite ainmean sheòrsan, chlasaichean, ainmean-àite agus a’ toirt a-steach an stòr faidhlichean. Thug an imrich buaidh air 10 faidhle stòr (a-mach à 000). chaidh char14_t a chur na àite wchar_t; chuir sinn romhainn cleachdadh wchar_t a thrèigsinn, oir Bidh char000_t a’ toirt 16 bytes air a h-uile OS agus chan eil e a’ milleadh co-chòrdalachd còd eadar Windows agus Linux.

Bha tachartasan beaga ann. Mar eisimpleir, ann an STLPort dh’ fhaodadh iterator a bhith air a thilgeil gu h-obann gu puing gu eileamaid, agus ann an cuid de dh’ àiteachan nar còd chaidh seo a chleachdadh. Ann an leabharlannan ùra cha robh e comasach seo a dhèanamh tuilleadh, agus dh'fheumadh na h-earrannan sin a bhith air an sgrùdadh agus air an ath-sgrìobhadh le làimh.

Mar sin, tha an imrich còd deiseil, tha an còd air a chur ri chèile airson a h-uile siostam obrachaidh. Tha an t-àm ann airson deuchainnean.

Sheall deuchainnean às deidh an eadar-ghluasaid lùghdachadh ann an coileanadh (ann an cuid de dh'àiteachan suas gu 20-30%) agus àrdachadh ann an caitheamh cuimhne (suas gu 10-15%) an coimeas ris an t-seann dreach den chòd. Bha seo, gu sònraichte, mar thoradh air coileanadh suboptimal nan sreangan àbhaisteach. Mar sin, bha againn a-rithist ris an loidhne againn fhìn, beagan atharraichte, a chleachdadh.

Chaidh feart inntinneach de bhuileachadh shoithichean ann an leabharlannan freumhaichte fhoillseachadh cuideachd: falamh (às aonais eileamaidean) std ::mapa agus std :: seata bho leabharlannan togte a’ riarachadh cuimhne. Agus mar thoradh air na feartan buileachaidh, ann an cuid de dh'àiteachan anns a 'chòd tha mòran de shoithichean falamh den t-seòrsa seo air an cruthachadh. Tha soithichean cuimhne àbhaisteach air an riarachadh beagan, airson aon eileamaid bunaiteach, ach dhuinne bha seo deatamach - ann an grunn shuidheachaidhean, thuit ar coileanadh gu mòr agus mheudaich caitheamh cuimhne (an taca ri STLPort). Mar sin, anns a 'chòd againn chuir sinn an gnìomh bho Boost an dà sheòrsa de shoithichean sin bho na leabharlannan a chaidh a thogail a-steach, far nach robh am feart seo aig na soithichean sin, agus dh' fhuasgail seo an duilgheadas le slaodachadh agus barrachd caitheamh cuimhne.

Mar a thachras gu tric às deidh atharrachaidhean mòra ann am pròiseactan mòra, cha do dh ’obraich a’ chiad tionndadh den chòd stòr gun duilgheadasan, agus an seo, gu sònraichte, thàinig taic do luchd-aithris debugging ann am buileachadh Windows gu feum. Ceum air cheum ghluais sinn air adhart, agus ron earrach 2017 (dreach 8.3.11 1C: Iomairt) chaidh an imrich a chrìochnachadh.

Builean

Thug an gluasad gu inbhe C ++14 timcheall air 6 mìosan dhuinn. A’ mhòr-chuid den ùine, bha aon leasaiche (ach fìor theisteanas) ag obair air a’ phròiseact, agus aig an ìre mu dheireadh thàinig riochdairean bho sgiobaidhean le uallach airson raointean sònraichte a-steach - UI, cruinneachadh frithealaiche, innealan leasachaidh is rianachd, msaa.

Rinn an eadar-ghluasad gu mòr ar n-obair air imrich gu na dreachan as ùire den inbhe. Mar sin, tha dreach 1C: Iomairt 8.3.14 (ann an leasachadh, foillseachadh clàraichte airson tràth an ath-bhliadhna) air a ghluasad chun na h-ìre mar-thà. C++17.

Às deidh an imrich, tha barrachd roghainnean aig luchd-leasachaidh. Nam biodh an dreach atharraichte againn fhèin de STL agus aon ainm-àite std na bu thràithe, a-nis tha clasaichean àbhaisteach againn bho na leabharlannan cruinneachaidh a tha air an togail a-steach ann an ainmspàs std, ann an ainmspàs stdx - na loidhnichean agus na soithichean againn air an ùrachadh airson ar gnìomhan, mar àrdachadh - an An tionndadh as ùire de booster. Agus bidh an leasaiche a 'cleachdadh nan clasaichean sin a tha freagarrach airson na duilgheadasan aige fhuasgladh.

Bidh buileachadh “dùthchasach” luchd-togail gluasad cuideachd a’ cuideachadh le leasachadh (luchd-togail gluasad) airson grunn chlasaichean. Ma tha neach-togail gluasaid aig clas agus gu bheil an clas seo air a chuir ann an soitheach, an uairsin bidh an STL a ’dèanamh an fheum as fheàrr de bhith a’ dèanamh leth-bhreac de eileamaidean taobh a-staigh an t-soithich (mar eisimpleir, nuair a thèid an soitheach a leudachadh agus feumar comas atharrachadh agus cuimhne ath-riarachadh).

Cùl san iongantas

Is dòcha gur e an toradh as mì-thlachdmhor (ach chan eil e riatanach) air imrich gu bheil sinn a’ toirt aghaidh air àrdachadh san tomhas-lìonaidh faidhlichean obj, agus thòisich toradh iomlan an togail leis na faidhlichean eadar-mheadhanach gu lèir a’ toirt suas 60–70 GB. Tha an giùlan seo mar thoradh air cho sònraichte sa tha leabharlannan àbhaisteach an latha an-diugh, nach eil air a bhith cho èiginneach a thaobh meud nam faidhlichean seirbheis a chaidh a chruthachadh. Chan eil seo a’ toirt buaidh air gnìomhachd an tagraidh cruinnichte, ach tha e ag adhbhrachadh grunn mhì-ghoireasachd ann an leasachadh, gu sònraichte, bidh e a’ meudachadh ùine cruinneachaidh. Tha na riatanasan airson àite diosc an-asgaidh air frithealaichean togail agus air innealan leasaiche a’ dol am meud cuideachd. Bidh an luchd-leasachaidh againn ag obair air grunn dhreachan den àrd-ùrlar aig an aon àm, agus bidh ceudan de gigabytes de fhaidhlichean eadar-mheadhanach uaireannan a’ cruthachadh dhuilgheadasan san obair aca. Tha an duilgheadas mì-thlachdmhor, ach chan eil e èiginneach; tha sinn air am fuasgladh aige a chuir dheth airson a-nis. Tha sinn a’ beachdachadh air teicneòlas mar aon de na roghainnean airson fuasgladh fhaighinn air togail aonachd (gu sònraichte, bidh Google ga chleachdadh nuair a bhios tu a’ leasachadh brabhsair Chrome).

Source: www.habr.com

Cuir beachd ann