Momwe tidamasulira mizere 10 miliyoni ya C++ code kukhala C++14 mulingo (kenako ku C++17)

Kalekale (kugwa kwa 2016), pakupanga mtundu wotsatira wa 1C: nsanja yaukadaulo ya Enterprise, funso lidabuka mkati mwa gulu lachitukuko lothandizira mulingo watsopano. C ++ 14 mu code yathu. Kusintha kwa mulingo watsopano, monga momwe timaganizira, kungatilole kulemba zinthu zambiri mokongola, mophweka komanso modalirika, komanso kumathandizira kuthandizira ndi kukonza kachidindo. Ndipo zikuwoneka kuti palibe chodabwitsa pakumasulira, ngati sichoncho pa kukula kwa ma code ndi mawonekedwe ake enieni a code yathu.

Kwa iwo omwe sakudziwa, 1C:Enterprise ndi malo opititsa patsogolo ntchito zamabizinesi amitundu yosiyanasiyana komanso nthawi yoyendetsera ntchito yawo pa ma OS osiyanasiyana ndi ma DBMS. Nthawi zambiri, mankhwalawa amakhala ndi:

  • Ntchito Cluster Server, imagwira ntchito pa Windows ndi Linux
  • Makasitomala, kugwira ntchito ndi seva kudzera pa http(s) kapena protocol yake ya binary, imagwira ntchito pa Windows, Linux, macOS
  • Web kasitomala, ikuyenda mu Chrome, Internet Explorer, Microsoft Edge, Firefox, Safari asakatuli (olembedwa mu JavaScript)
  • Chitukuko chilengedwe (Wokonzera), imagwira ntchito pa Windows, Linux, macOS
  • Zida Zoyang'anira ma seva ogwiritsira ntchito, amayendetsa pa Windows, Linux, macOS
  • Mobile kasitomala, kulumikiza ku seva kudzera pa http(s), imagwira ntchito pazida zam'manja zomwe zikuyenda ndi Android, iOS, Windows
  • Pulatifomu yam'manja - chimango chopangira mapulogalamu amtundu wapaintaneti omwe amatha kulunzanitsa, akuyenda pa Android, iOS, Windows
  • Chitukuko chilengedwe 1C: Zida Zopangira Mabizinesi, yolembedwa mu Java
  • Seva Njira Zolumikizirana

Timayesa kulemba kachidindo komweko kwa machitidwe osiyanasiyana momwe tingathere - ma code code a seva ndi 99% wamba, ma code a kasitomala ndi pafupifupi 95%. 1C: Pulatifomu yaukadaulo ya Enterprise imalembedwa makamaka mu C++ ndipo mawonekedwe ofananirako amaperekedwa pansipa:

  • 10 miliyoni mizere ya C++ code,
  • 14 mafayilo,
  • makalasi 60,
  • njira theka la milioni.

Ndipo zinthu zonsezi zinayenera kumasuliridwa mu C++14. Lero tikuuzani momwe tinachitira izi ndi zomwe tidakumana nazo munjirayi.

Momwe tidamasulira mizere 10 miliyoni ya C++ code kukhala C++14 mulingo (kenako ku C++17)

Chodzikanira

Chilichonse cholembedwa pansipa chokhudza ntchito yapang'onopang'ono / yachangu, (osati) kugwiritsa ntchito kukumbukira kwakukulu pokhazikitsa makalasi okhazikika m'malaibulale osiyanasiyana kumatanthauza chinthu chimodzi: izi ndi zoona KWA IFE. Ndizotheka kuti machitidwe okhazikika azikhala oyenera ntchito zanu. Tinayamba kuchokera ku ntchito zathu: tinatenga deta yomwe inali yofanana ndi makasitomala athu, timagwiritsa ntchito zochitika zenizeni pa iwo, kuyang'ana ntchito, kuchuluka kwa kukumbukira komwe kumagwiritsidwa ntchito, ndi zina zotero, ndikusanthula ngati ife ndi makasitomala athu tinakhutitsidwa ndi zotsatirazi kapena ayi. . Ndipo iwo anachita modalira.

Zomwe tinali nazo

Poyamba, tidalemba kachidindo ka 1C:Enterprise 8 nsanja mu Microsoft Visual Studio. Ntchitoyi inayamba kumayambiriro kwa zaka za m'ma 2000 ndipo tinali ndi Windows-only version. Mwachilengedwe, kuyambira pamenepo code idapangidwa mwachangu, njira zambiri zalembedwanso kwathunthu. Koma code idalembedwa molingana ndi muyezo wa 1998, ndipo, mwachitsanzo, mabatani athu akumanja adalekanitsidwa ndi mipata kuti kuphatikiza kupambane, motere:

vector<vector<int> > IntV;

Mu 2006, ndi kutulutsidwa kwa nsanja ya 8.1, tinayamba kuthandizira Linux ndikusintha ku laibulale yovomerezeka ya gulu lachitatu. Chithunzi cha STLPort. Chimodzi mwa zifukwa zosinthira chinali kugwira ntchito ndi mizere yotakata. Mu code yathu, timagwiritsa ntchito std ::wstring, yomwe imachokera pamtundu wa wchar_t, ponseponse. Kukula kwake mu Windows ndi 2 byte, ndipo mu Linux chokhazikika ndi 4 byte. Izi zidapangitsa kusagwirizana kwa ma protocol athu a binary pakati pa kasitomala ndi seva, komanso ma data osiyanasiyana osalekeza. Pogwiritsa ntchito zosankha za gcc, mutha kufotokoza kuti kukula kwa wchar_t pakuphatikiza ndi 2 mabayiti, koma mutha kuyiwala kugwiritsa ntchito laibulale yokhazikika kuchokera kwa wopanga, chifukwa imagwiritsa ntchito glibc, yomwe imapangidwira 4-byte wchar_t. Zifukwa zina zinali kukhazikitsidwa bwino kwa makalasi wamba, kuthandizira matebulo a hashi, komanso kutengera ma semantics osuntha mkati mwa muli, zomwe tidagwiritsa ntchito mwachangu. Ndipo chifukwa chinanso, monga amanenera pomaliza, chinali kugwira ntchito kwa zingwe. Tinali ndi kalasi yathu ya zingwe, chifukwa... Chifukwa cha mapulogalamu athu, ntchito za zingwe zimagwiritsidwa ntchito kwambiri ndipo kwa ife izi ndizofunikira.

Chingwe chathu chimatengera malingaliro okhathamiritsa zingwe zomwe zidafotokozedwa koyambirira kwa zaka za m'ma 2000 Andrei Alexandrescu. Pambuyo pake, pamene Alexandrescu ankagwira ntchito pa Facebook, malinga ndi malingaliro ake, mzere unagwiritsidwa ntchito mu injini ya Facebook yomwe inagwira ntchito mofananamo (onani laibulale). kupusa).

Mzere wathu udagwiritsa ntchito matekinoloje akulu akulu awiri:

  1. Pazinthu zazifupi, chotchinga chamkati mu chinthu cha chingwecho chimagwiritsidwa ntchito (osafuna kugawa kwa kukumbukira).
  2. Kwa ena onse, makina amagwiritsidwa ntchito Koperani Pa Kulemba. Mtengo wa zingwe umasungidwa pamalo amodzi, ndipo chowerengera chimagwiritsidwa ntchito popereka/kusintha.

Kuti tifulumizitse kusonkhanitsa nsanja, sitinaphatikizepo kukhazikitsidwa kwa mtsinje kuchokera ku mtundu wathu wa STLPort (omwe sitinagwiritse ntchito), izi zidatipatsa pafupifupi 20% kuphatikiza mwachangu. Pambuyo pake tinayenera kugwiritsa ntchito pang'ono mphamvu. Boost imagwiritsa ntchito kwambiri mitsinje, makamaka mu ma API ake (mwachitsanzo, kudula mitengo), kotero tidayenera kuyisintha kuti tichotse kugwiritsa ntchito mtsinje. Izi, zinapangitsa kuti zikhale zovuta kwa ife kusamukira kumitundu yatsopano ya Boost.

Njira yachitatu

Posamukira ku C++14 muyezo, tidaganizira izi:

  1. Sinthani STLPort yomwe tidayisintha kukhala C++14. Njirayi ndi yovuta kwambiri, chifukwa ... kuthandizira kwa STLPort kudayimitsidwa mu 2010, ndipo tikuyenera kupanga tokha ma code ake onse.
  2. Kusintha kupita ku kukhazikitsa kwina kwa STL kogwirizana ndi C++14. Ndizofunikira kwambiri kuti kukhazikitsa uku kukhale kwa Windows ndi Linux.
  3. Mukamapanga za OS iliyonse, gwiritsani ntchito laibulale yomangidwa muzophatikiza zofananira.

Njira yoyamba inakanidwa kwathunthu chifukwa cha ntchito yambiri.

Tinaganiza za njira yachiwiri kwa nthawi ndithu; amatengedwa ngati phungu libc++, koma panthawiyo sizinagwire ntchito pansi pa Windows. Kuti mutenge libc ++ ku Windows, muyenera kugwira ntchito zambiri - mwachitsanzo, lembani zonse zomwe zikukhudza ulusi, kulumikizana kwa ulusi ndi atomiki, popeza libc ++ imagwiritsidwa ntchito m'malo awa. POSIX API.

Ndipo tinasankha njira yachitatu.

Kusintha

Chifukwa chake, tidayenera kusintha kugwiritsa ntchito STLPort ndi malaibulale omwe amaphatikiza (Visual Studio 2015 ya Windows, gcc 7 ya Linux, clang 8 ya macOS).

Mwamwayi, code yathu idalembedwa makamaka motsatira malangizo ndipo sanagwiritse ntchito mitundu yonse yanzeru, kotero kusamukira ku malaibulale atsopano kunayenda bwino, mothandizidwa ndi zolemba zomwe zidalowa m'malo mwa mayina amitundu, makalasi, malo a mayina ndikuphatikiza mu gwero. mafayilo. Kusamukaku kudakhudza mafayilo oyambira 10 (pa 000). wchar_t adasinthidwa ndi char14_t; tinaganiza zosiya kugwiritsa ntchito wchar_t, chifukwa char000_t imatenga ma byte 16 pa ma OS onse ndipo sichiwononga kuyanjana kwa ma code pakati pa Windows ndi Linux.

Panali zochitika zazing'ono. Mwachitsanzo, mu STLPort chobwerezabwereza chikhoza kuponyedwa cholozera ku chinthu, ndipo m'malo ena mu code yathu izi zidagwiritsidwa ntchito. M’malaibulale atsopano sikunali kothekanso kuchita zimenezi, ndipo ndimezi zinayenera kusanthulidwa ndi kulembedwanso pamanja.

Chifukwa chake, kusamuka kwa ma code kwatha, codeyo imapangidwa pamakina onse ogwiritsira ntchito. Yakwana nthawi yoyesa.

Mayesero atatha kusintha adawonetsa kuchepa kwa ntchito (m'malo ena mpaka 20-30%) komanso kuwonjezeka kwa kukumbukira kukumbukira (mpaka 10-15%) poyerekeza ndi mtundu wakale wa code. Izi zinali, makamaka, chifukwa chakuchita bwino kwa zingwe zokhazikika. Choncho, tinayeneranso kugwiritsa ntchito mzere wathu wathu, wosinthidwa pang'ono.

Chochititsa chidwi cha kukhazikitsidwa kwa zotengera m'malaibulale ophatikizidwa zidawululidwanso: zopanda kanthu (zopanda zinthu) std::map ndi std::set kuchokera ku malaibulale omangidwa omwe amagawa kukumbukira. Ndipo chifukwa cha magwiridwe antchito, m'malo ena mu code, zida zambiri zopanda kanthu zamtunduwu zimapangidwa. Zotengera zokumbukira zokhazikika zimaperekedwa pang'ono, pamizu imodzi, koma kwa ife izi zidakhala zovuta - muzochitika zingapo, magwiridwe antchito athu adatsika kwambiri komanso kukumbukira kumakula (poyerekeza ndi STLPort). Chifukwa chake, mu code yathu tidasintha mitundu iwiriyi ya zida kuchokera m'malaibulale omangidwa ndikukhazikitsa kuchokera ku Boost, pomwe zotengerazi zidalibe izi, ndipo izi zidathetsa vutoli ndikuchepetsa ndikuwonjezera kukumbukira kukumbukira.

Monga nthawi zambiri zimachitika pambuyo pa kusintha kwakukulu pamapulojekiti akuluakulu, kubwereza koyamba kwa code source sikunagwire ntchito popanda mavuto, ndipo apa, makamaka, kuthandizira kwa zowonongeka mu Windows kukhazikitsa kunabwera bwino. Pang'onopang'ono tidapita patsogolo, ndipo pofika kumapeto kwa 2017 (mtundu 8.3.11 1C: Enterprise) kusamuka kudamalizidwa.

Zotsatira

Kusintha kwa muyezo wa C++14 kunatitengera pafupifupi miyezi 6. Nthawi zambiri, womanga m'modzi (koma wodziwa kwambiri) ankagwira ntchitoyo, ndipo pamapeto pake oimira magulu omwe ali ndi madera ena adalumikizana nawo - UI, gulu la seva, zida zachitukuko ndi kasamalidwe, ndi zina zambiri.

Kusinthaku kunafewetsa kwambiri ntchito yathu yosamukira kumitundu yaposachedwa ya muyezo. Chifukwa chake, mtundu 1C:Enterprise 8.3.14 (pakukula, kumasulidwa koyenera koyambirira kwa chaka chamawa) yasamutsidwa kale ku muyezo. C++17.

Pambuyo pa kusamuka, opanga ali ndi zosankha zambiri. Ngati m'mbuyomu tinali ndi mtundu wathu wosinthidwa wa STL ndi malo amodzi a std, tsopano tili ndi makalasi okhazikika kuchokera ku malaibulale ophatikizira omwe adamangidwa mu std namespace, mu stdx namespace - mizere yathu ndi zotengera zathu zokongoletsedwa ndi ntchito zathu, kulimbikitsa - the mtundu waposachedwa wa boost. Ndipo wopanga amagwiritsa ntchito makalasi omwe ali oyenerera bwino kuthetsa mavuto ake.

Kukhazikitsa "kwachilengedwe" kwa omanga osuntha kumathandizanso pakukula (kusuntha omanga) kwa makalasi angapo. Ngati kalasi ili ndi omanga osuntha ndipo kalasiyi imayikidwa mu chidebe, ndiye kuti STL imakopera zinthu zomwe zili mkati mwa chidebecho (mwachitsanzo, pamene chidebecho chikukulitsidwa ndipo m'pofunika kusintha mphamvu ndikugawanso kukumbukira).

Yendetsani mafuta

Mwina zosasangalatsa (koma osati zovuta) zotsatira za kusamuka ndikuti tikukumana ndi kuwonjezeka kwa voliyumu. obj mafayilo, ndipo zotsatira zonse za kumanga ndi mafayilo onse apakati anayamba kutenga 60-70 GB. Khalidweli limabwera chifukwa cha zomwe zili m'malaibulale amakono amakono, omwe sakhala otsutsa kwambiri kukula kwa mafayilo opangidwa. Izi sizikhudza magwiridwe antchito a pulogalamuyo, koma zimapangitsa kuti pakhale zovuta zingapo pakukula, makamaka, zimawonjezera nthawi yophatikiza. Zofunikira za malo a disk aulere pa ma seva omanga komanso pamakina opanga zikuchulukiranso. Madivelopa athu amagwira ntchito pamitundu ingapo ya nsanja mofananira, ndipo mazana a ma gigabytes a mafayilo apakatikati nthawi zina amabweretsa zovuta pantchito yawo. Vutoli ndi losasangalatsa, koma osati lovuta; tayimitsa yankho lake pakadali pano. Tikuwona ukadaulo ngati imodzi mwazinthu zomwe tingathe kuzithetsa mgwirizano kumanga (makamaka, Google imagwiritsa ntchito popanga msakatuli wa Chrome).

Source: www.habr.com

Kuwonjezera ndemanga