Mar a d’aistrigh muid 10 milliún líne de chód C++ go dtí an caighdeán C++14 (agus ansin go C++17)

Tamall ó shin (i titim na bliana 2016), le linn fhorbairt an chéad leagan eile den ardán teicneolaíochta 1C:Fiontar, d'eascair an cheist laistigh den fhoireann forbartha maidir le tacú leis an gcaighdeán nua. C ++ 14 inár gcód. Chuirfeadh an t-aistriú go dtí caighdeán nua ar ár gcumas, mar a ghlacamar leis, go leor rudaí a scríobh ar bhealach níos galánta, níos simplí agus níos iontaofa, agus dhéanfadh sé tacaíocht agus cothabháil an chóid a shimpliú. Agus is cosúil nach bhfuil aon rud neamhghnách san aistriúchán, más rud é nach bhfuil sé mar gheall ar scála an bhoinn chóid agus gnéithe sonracha ár gcód.

Dóibh siúd nach bhfuil a fhios acu, is timpeallacht é 1C:Enterprise le haghaidh forbairt go mear ar fheidhmchláir ghnó tras-ardáin agus am rite lena gcur i gcrích ar OSes agus DBMSanna éagsúla. Go ginearálta, cuimsíonn an táirge:

Déanaimid iarracht an cód céanna a scríobh do chórais oibriúcháin éagsúla a oiread agus is féidir - tá bonn cód an fhreastalaí 99% coitianta, tá bonn cód an chliaint thart ar 95%. Tá an t-ardán teicneolaíochta 1C:Fiontar scríofa go príomha i C++ agus tugtar neas-shaintréithe an chóid thíos:

  • 10 milliún líne de chód C++,
  • 14 míle comhad,
  • 60 míle rang,
  • leathmhilliún modhanna.

Agus b'éigean an stuif seo go léir a aistriú go C++14. Inniu inseoimid duit conas a rinne muid é seo agus cad a tháinig muid ar aghaidh sa phróiseas.

Mar a d’aistrigh muid 10 milliún líne de chód C++ go dtí an caighdeán C++14 (agus ansin go C++17)

Séanadh

Ciallaíonn gach rud atá scríofa thíos faoi obair mhall/ghasta, (ní) tomhaltas mór cuimhne trí ranganna caighdeánacha a chur i bhfeidhm i leabharlanna éagsúla, rud amháin: tá sé seo fíor DO SAM. Is féidir go mbeidh feidhmiúcháin caighdeánacha is fearr a oireann do do chuid cúraimí. Thosaigh muid lenár dtascanna féin: ghlacamar sonraí a bhí tipiciúil dár gcliaint, ritheamar cásanna tipiciúla orthu, d'fhéachamar ar fheidhmíocht, ar an méid cuimhne a chaitear, etc., agus rinneamar anailís ar cibé an raibh muid féin agus ár gcliaint sásta le torthaí den sórt sin nó nach raibh. . Agus ghníomhaigh siad ag brath ar.

Cad a bhí againn

Ar dtús, scríobhamar an cód don ardán 1C:Enterprise 8 i Microsoft Visual Studio. Thosaigh an tionscadal go luath sna 2000í agus bhí leagan Windows amháin againn. Ar ndóigh, ó shin i leith tá an cód forbartha go gníomhach, tá go leor meicníochtaí athscríobh go hiomlán. Ach scríobhadh an cód de réir chaighdeán 1998, agus, mar shampla, bhí ár lúibíní dronuillinn scartha le spásanna ionas go n-éireodh le tiomsú, mar seo:

vector<vector<int> > IntV;

In 2006, nuair a scaoileadh ardán leagan 8.1, thosaigh muid ag tacú le Linux agus aistrigh go leabharlann caighdeánach tríú páirtí STLPort. Ceann de na cúiseanna a bhí leis an aistriú ná oibriú le línte leathana. Inár gcód, úsáidimid std::wstring, atá bunaithe ar an gcineál wchar_t, ar fud. Is é a mhéid i Windows ná 2 bytes, agus i Linux is é 4 bytes an réamhshocrú. Mar thoradh air seo bhí neamh-chomhoiriúnacht ár bprótacail dhénártha idir an cliant agus an freastalaí, chomh maith le sonraí leanúnacha éagsúla. Ag baint úsáide as na roghanna gcc, is féidir leat a shonrú go bhfuil an méid wchar_t le linn tiomsaithe freisin 2 bytes, ach ansin is féidir leat dearmad a dhéanamh ar úsáid a bhaint as an leabharlann caighdeánach ón tiomsaitheoir, mar gheall ar úsáideann sé glibc, a thiomsaítear ina dhiaidh sin le haghaidh wchar_t 4-bheart. Cúiseanna eile ab ea cur i bhfeidhm níos fearr na ranganna caighdeánacha, tacaíocht do tháblaí hash, agus fiú aithris a dhéanamh ar shéimeantaic bogadh taobh istigh de choimeádáin, rud a d’úsáideamar go gníomhach. Agus cúis amháin eile, mar a deir siad go deireanach ach ní ba lú, ná feidhmíocht teaghrán. Bhí ár rang féin againn le haghaidh teaghráin, mar... Mar gheall ar shainiúlacht ár mbogearraí, baintear úsáid an-leathan as oibríochtaí teaghrán agus tá sé seo ríthábhachtach dúinne.

Tá ár teaghrán bunaithe ar smaointe optamaithe teaghrán a cuireadh in iúl go luath sna 2000í Andrei Alexandrescu. Níos déanaí, nuair a d'oibrigh Alexandrescu ag Facebook, ar a mholadh, úsáideadh líne san inneall Facebook a d'oibrigh ar phrionsabail chomhchosúla (féach an leabharlann baois).

Bhain ár líne úsáid as dhá phríomhtheicneolaíocht optamaithe:

  1. I gcás luachanna gearra, úsáidtear maolán inmheánach sa réad teaghrán féin (ní gá leithdháileadh cuimhne breise a bheith aige).
  2. I gcás gach duine eile, úsáidtear meicnic Cóipeáil Ar Scríobh. Stóráiltear an luach teaghrán in aon áit amháin, agus úsáidtear cuntar tagartha le linn sannadh/modhnú.

Chun tiomsú an ardáin a bhrostú, d’fhágamar an t-athrú ar ár n-athraitheach STLPort (nár bhaineamar úsáid as an sruth a chur i bhfeidhm), rud a thug timpeall 20% ar thiomsú níos tapúla dúinn. Ina dhiaidh sin bhí orainn úsáid teoranta a bhaint as Treisiú. Baineann Boost úsáid mhór as sruth, go háirithe ina APIs seirbhíse (mar shampla, le haghaidh logáil), agus mar sin bhí orainn é a mhodhnú chun úsáid srutha a bhaint. Mar gheall air seo, bhí sé deacair dúinn aistriú go leaganacha nua de Boost.

Tríú bealach

Agus sinn ag bogadh go dtí an caighdeán C++14, rinneamar na roghanna seo a leanas a mheas:

  1. Uasghrádaigh an STLPort a d'athraigh muid go dtí an caighdeán C++14. Tá an rogha an-deacair, mar gheall ar ... Cuireadh deireadh le tacaíocht do STLPort in 2010, agus bheadh ​​orainn a chód ar fad a thógáil sinn féin.
  2. Aistriú chuig cur chun feidhme STL eile atá comhoiriúnach le C++14. Tá sé thar a bheith inmhianaithe go ndéanfaí an cur i bhfeidhm seo do Windows agus Linux.
  3. Agus tú ag tiomsú do gach OS, bain úsáid as an leabharlann atá san áireamh sa tiomsaitheoir comhfhreagrach.

Diúltaíodh go hiomlán don chéad rogha mar gheall ar an iomarca oibre.

Rinneamar machnamh ar an dara rogha le tamall anuas; a mheas mar iarrthóir libc++, ach ag an am sin níor oibrigh sé faoi Windows. Chun libc++ a phortáil go Windows, bheadh ​​ort go leor oibre a dhéanamh - mar shampla, scríobh gach rud a bhaineann le snáitheanna, sioncrónú snáithe agus adamhacht, ós rud é go n-úsáidtear libc++ sna réimsí seo POSIX API.

Agus roghnaigh muid an tríú bealach.

Aistriú

Mar sin, bhí orainn úsáid a bhaint as STLPort a athsholáthar le leabharlanna na dtiomsaitheoirí comhfhreagracha (Visual Studio 2015 do Windows, gcc 7 le haghaidh Linux, clang 8 le haghaidh macOS).

Go fortunately, scríobhadh ár gcód go príomha de réir na dtreoirlínte agus níor bhain sé úsáid as gach cineál cleas cliste, agus mar sin chuaigh an t-aistriú chuig leabharlanna nua ar aghaidh go réasúnta réidh, le cabhair ó scripteanna a tháinig in ionad ainmneacha cineálacha, aicmí, spásanna ainm agus áirítear sa fhoinse comhaid. Chuir an imirce isteach ar 10 comhad foinse (as 000). cuireadh char14_t in ionad wchar_t; bheartaíomar úsáid wchar_t a thréigean, mar gheall ar thógann char000_t 16 bytes ar gach OSes agus ní scriosann sé comhoiriúnacht an chóid idir Windows agus Linux.

Bhí roinnt eachtraí beaga. Mar shampla, in STLPort d’fhéadfaí iterator a chaitheamh go hintuigthe chuig pointeoir d’eilimint, agus in áiteanna áirithe inár gcód úsáideadh é seo. I leabharlanna nua ní raibh sé indéanta é seo a dhéanamh a thuilleadh, agus b'éigean na sleachta seo a anailísiú agus a athscríobh de láimh.

Mar sin, tá an t-aistriú cód críochnaithe, tá an cód le chéile do gach córas oibriúcháin. Tá sé in am le haghaidh tástálacha.

Léirigh tástálacha tar éis an aistrithe titim i bhfeidhmíocht (i roinnt áiteanna suas le 20-30%) agus méadú ar thomhaltas cuimhne (suas le 10-15%) i gcomparáid leis an seanleagan den chód. Bhí sé seo, go háirithe, mar gheall ar fheidhmíocht suboptimal na teaghráin chaighdeánach. Mar sin, bhí orainn ár líne féin, beagán modhnaithe a úsáid arís.

Nochtadh freisin gné spéisiúil de chur i bhfeidhm coimeádán i leabharlanna leabaithe: folamh (gan eilimintí) std::mapa agus std ::leagtha ó leabharlanna ionsuite leithdháileann cuimhne. Agus mar gheall ar na gnéithe cur chun feidhme, i roinnt áiteanna sa chód cruthaítear go leor coimeádán folamh den chineál seo. Leithdháiltear coimeádáin chuimhne caighdeánach beagán, le haghaidh eilimint fhréamh amháin, ach dúinne d'éirigh sé seo amach a bheith ríthábhachtach - i roinnt cásanna, thit ár bhfeidhmíocht go suntasach agus mhéadaigh tomhaltas cuimhne (i gcomparáid le STLPort). Dá bhrí sin, inár gcód chuireamar an dá chineál coimeádán seo ó na leabharlanna tógtha in ionad lena gcur i bhfeidhm ó Boost, áit nach raibh an ghné seo ag na coimeádáin seo, agus réitigh sé seo an fhadhb le moilliú agus tomhaltas cuimhne méadaithe.

Mar a tharlaíonn go minic tar éis athruithe ar scála mór i dtionscadail mhóra, níor oibrigh an chéad atriall den chód foinseach gan fadhbanna, agus anseo, go háirithe, tháinig tacaíocht d'iterators debugging i bhfeidhmiú Windows áisiúil. Céim ar chéim bhogamar ar aghaidh, agus faoi earrach na bliana 2017 (leagan 8.3.11 1C:Fiontar) bhí an imirce i gcrích.

Torthaí

Thóg an t-aistriú go dtí an caighdeán C++14 thart ar 6 mhí orainn. An chuid is mó den am, d'oibrigh forbróir amháin (ach an-ardcháilithe) ar an tionscadal, agus ag an gcéim dheireanach tháinig ionadaithe na bhfoirne atá freagrach as réimsí sonracha isteach - UI, braisle freastalaí, uirlisí forbartha agus riaracháin, etc.

Shimpligh an t-aistriú go mór ár gcuid oibre ar aistriú chuig na leaganacha is déanaí den chaighdeán. Mar sin, tá leagan 1C:Fiontar 8.3.14 (atá á fhorbairt, scaoileadh sceidealta go luath sa bhliain seo chugainn) aistrithe go dtí an caighdeán cheana féin C++17.

Tar éis an imirce, tá níos mó roghanna ag forbróirí. Más rud é níos luaithe a bhí ár leagan modhnaithe féin de STL agus aon ainmspás std amháin againn, anois tá ranganna caighdeánacha againn ó na leabharlanna tiomsaithe ionsuite san ainmspás std, san ainmspás stdx - ár línte agus ár gcoimeádáin optamaithe le haghaidh ár dtascanna, mar threisiú - an Íoslódáil an leagan is déanaí de booster. Agus úsáideann an forbróir na haicmí sin is fearr a oireann chun a chuid fadhbanna a réiteach.

Cuidíonn feidhmiú “dúchais” na dtógálaithe gluaiseachta freisin le forbairt (tógálaithe bogadh) ar feadh roinnt ranganna. Má tá cruthaitheoir gluaiseachta ag rang agus go gcuirtear an rang seo i gcoimeádán, déanann an STL cóipeáil na n-eilimintí taobh istigh den choimeádán a bharrfheabhsú (mar shampla, nuair a leathnaítear an coimeádán agus is gá acmhainn a athrú agus cuimhne a athdháileadh).

Eitilt sa ointment

B'fhéidir gurb é an iarmhairt is míthaitneamhach (ach nach bhfuil criticiúil) na himirce go bhfuil muid ag tabhairt aghaidhe ar mhéadú ar an méid comhaid obj, agus thosaigh toradh iomlán na tógála leis na comhaid idirmheánacha go léir ag tógáil 60-70 GB. Tharla an t-iompar seo mar gheall ar shainiúlacht na leabharlanna caighdeánacha nua-aimseartha, nach bhfuil chomh criticiúil céanna maidir le méid na gcomhad seirbhíse ginte. Ní chuireann sé seo isteach ar oibriú an iarratais chomhthiomsaithe, ach is cúis le roinnt míchaoithiúlachtaí i bhforbairt, go háirithe, méadaíonn sé an t-am tiomsaithe. Tá na ceanglais maidir le spás diosca saor in aisce ar fhreastalaithe tógála agus ar mheaisíní forbróra ag méadú freisin. Oibríonn ár bhforbróirí ar roinnt leaganacha den ardán ag an am céanna, agus cruthaíonn na céadta ghigibheart de chomhaid idirmheánacha deacrachtaí ina gcuid oibre uaireanta. Tá an fhadhb míthaitneamhach, ach níl sé ríthábhachtach; tá a réiteach curtha siar againn go fóill. Táimid ag smaoineamh ar an teicneolaíocht mar cheann de na roghanna chun é a réiteach aontacht a thógáil (go háirithe, úsáideann Google é agus an brabhsálaí Chrome á fhorbairt).

Foinse: will.com

Add a comment