Yadda muka fassara layin miliyan 10 na lambar C++ zuwa ma'aunin C++14 (sannan zuwa C++17)

Wani lokaci da suka gabata (a cikin kaka na 2016), yayin haɓaka sigar gaba ta 1C: dandamalin fasahar kasuwanci, tambayar ta taso a cikin ƙungiyar haɓakawa game da tallafawa sabon ma'auni. C ++ 14 a cikin mu code. Canji zuwa sabon ma'auni, kamar yadda muka ɗauka, zai ba mu damar rubuta abubuwa da yawa cikin ladabi, sauƙi da dogaro, kuma zai sauƙaƙa tallafi da kiyaye lambar. Kuma da alama babu wani abu mai ban mamaki a cikin fassarar, idan ba don ma'auni na tushen lambar da takamaiman fasalulluka na lambar mu ba.

Ga waɗanda ba su sani ba, 1C: Kasuwanci yanayi ne don saurin haɓaka aikace-aikacen kasuwanci na giciye-dandamali da lokacin aiki don aiwatar da su akan OSes daban-daban da DBMSs. Gabaɗaya, samfurin ya ƙunshi:

Muna ƙoƙarin rubuta lambar guda ɗaya don tsarin aiki daban-daban kamar yadda zai yiwu - tushen lambar uwar garken shine 99% na kowa, tushen lambar abokin ciniki kusan 95%. 1C:Tsarin fasahar kasuwanci an rubuta shi da farko a cikin C++ kuma an ba da kusan halayen lamba a ƙasa:

  • Layukan miliyan 10 na lambar C++,
  • 14 fayiloli,
  • 60 dubu classes,
  • hanyoyin rabin miliyan.

Kuma duk waɗannan abubuwan dole ne a fassara su zuwa C++14. A yau za mu gaya muku yadda muka yi wannan da kuma abin da muka ci karo da shi a cikin aikin.

Yadda muka fassara layin miliyan 10 na lambar C++ zuwa ma'aunin C++14 (sannan zuwa C++17)

Disclaimer

Duk abin da aka rubuta a ƙasa game da jinkirin / aiki mai sauri, (ba) yawan amfani da ƙwaƙwalwar ajiya ta hanyar aiwatar da daidaitattun azuzuwan a cikin ɗakunan karatu daban-daban yana nufin abu ɗaya: wannan gaskiya ne GA MU. Yana yiwuwa madaidaicin aiwatarwa zai fi dacewa da ayyukanku. Mun fara daga ayyukanmu: mun ɗauki bayanan da suka saba wa abokan cinikinmu, mun gudanar da al'amura na yau da kullun akan su, duba aikin, adadin ƙwaƙwalwar ajiya da ake cinyewa, da dai sauransu, kuma mun bincika ko mu da abokan cinikinmu mun gamsu da irin wannan sakamakon ko a'a. . Kuma suka yi aiki dangane da.

Abin da muke da shi

Da farko, mun rubuta lambar dandamali ta 1C:Enterprise 8 a cikin Microsoft Visual Studio. Aikin ya fara ne a farkon shekarun 2000, kuma mun sami sigar kawai don WindowsHakika, lambar ta bunƙasa cikin sauri tun daga lokacin, kuma an sake rubuta hanyoyi da yawa gaba ɗaya. Amma an rubuta lambar bisa ga ma'aunin 1998, kuma, misali, mun raba maƙallan kusurwar dama tare da sarari don tabbatar da nasarar tattarawa, kamar haka:

vector<vector<int> > IntV;

A shekara ta 2006, tare da fitowar sigar dandamali ta 8.1, mun fara tallafawa Linux kuma an canza zuwa ɗakin karatu na ɓangare na uku STLPortƊaya daga cikin dalilan da yasa aka canza shine aiki da manyan igiyoyi. A cikin lambarmu, muna amfani da std::wstring, wanda ya dogara da nau'in wchar_t, a ko'ina. Girmansa shine Windows byte 2, kuma a cikin Linux Tsarin tsoho shine baiti 4. Wannan ya haifar da rashin jituwa tsakanin ka'idojin binary ɗinmu tsakanin abokin ciniki da sabar, da kuma bayanai daban-daban masu ɗorewa. Ta amfani da zaɓuɓɓukan gcc, zaku iya tilasta girman wchar_t ya zama baiti 2 yayin tattarawa, amma sannan zaku iya mantawa da amfani da ɗakin karatu na mai tarawa, tunda yana amfani da glibc, wanda aka tattara don wchar_t mai byte 4. Sauran dalilai sun haɗa da aiwatar da azuzuwan yau da kullun masu inganci, tallafin teburin hash, har ma da kwaikwayon ma'anar motsin kwantena, wanda muka yi amfani da shi sosai. Kuma a ƙarshe amma ba mafi ƙaranci ba, kamar yadda suke faɗa, shine aikin kirtani. Muna da namu ajin kirtani, tunda ana amfani da ayyukan kirtani sosai a cikin software ɗinmu, kuma wannan yana da mahimmanci a gare mu.

Zaren mu ya dogara ne akan ra'ayoyin inganta kirtani da aka bayyana baya a farkon 2000s Andrei Alexandrescu. Daga baya, lokacin da Alexandrescu ya yi aiki a Facebook, bisa shawararsa, an yi amfani da layi a cikin injin Facebook wanda yayi aiki akan irin wannan ka'idoji (duba ɗakin karatu). wauta).

Layinmu ya yi amfani da manyan fasahohin ingantawa guda biyu:

  1. Don gajerun dabi'u, ana amfani da buffer na ciki a cikin abin kirtani da kansa (ba buƙatar ƙarin adadin ƙwaƙwalwar ajiya ba).
  2. Ga duk sauran, ana amfani da makanikai Kwafi Kan Rubuta. Ana adana ƙimar kirtani a wuri ɗaya, kuma ana amfani da ma'aunin tunani yayin aiki/gyara.

Don hanzarta harhada dandamali, mun ware aiwatar da rafi daga bambance-bambancen STLPort (wanda ba mu yi amfani da shi ba), wannan ya ba mu kusan 20% saurin tattarawa. Daga baya sai mun yi iyakacin amfani Boost. Boost yana yin amfani da rafi sosai, musamman a cikin API ɗin sabis ɗin sa (misali, don shiga), don haka dole ne mu gyara shi don cire amfani da rafi. Wannan, bi da bi, ya sa ya yi mana wahala mu yi ƙaura zuwa sababbin nau'ikan Boost.

Hanya ta uku

Lokacin matsawa zuwa ma'aunin C++14, mun yi la'akari da zaɓuɓɓuka masu zuwa:

  1. Haɓaka STLPort da muka gyara zuwa ma'aunin C++14. Zaɓin yana da wahala sosai, saboda ... An dakatar da tallafin STLPort a cikin 2010, kuma dole ne mu gina duk lambar sa da kanmu.
  2. Sauya zuwa wani aiwatarwar STL da ta dace da C++14. Yana da matuƙar kyau a ce wannan aiwatarwar ta dace da Windows и Linux.
  3. Lokacin tattarawa don kowane OS, yi amfani da ɗakin karatu da aka gina a cikin mai haɗawa daidai.

Zabin farko an ƙi shi kai tsaye saboda yawan aiki.

Mun yi tunani game da zaɓi na biyu na ɗan lokaci; dauke a matsayin dan takara libc++amma a lokacin bai yi aiki a ƙarƙashin WindowsDon aika fayil ɗin libc++ zuwa Windows, za mu yi aiki mai yawa - misali, rubuta duk abin da ya shafi zaren, daidaitawar zaren da kuma atomity da kanmu, tunda an yi amfani da libc++ API ɗin POSIX.

Kuma mun zabi hanya ta uku.

Canji

Don haka, dole ne mu maye gurbin amfani da STLPort da ɗakunan karatu na masu tarawa masu dacewa (Visual Studio 2015 don Windows, gcc 7 don Linux, clang 8 don macOS).

Abin farin ciki, an rubuta lambarmu galibi bisa ga jagororin kuma ba ta yi amfani da wata dabara mai wayo ba, don haka ƙaura zuwa sabbin ɗakunan karatu ta tafi cikin sauƙi, ta amfani da rubutun da suka maye gurbin sunayen nau'ikan, azuzuwan, wuraren suna, da waɗanda aka haɗa a cikin fayilolin tushe. Hijira ta shafi fayilolin tushe 10,000 (daga cikin 14,000). An maye gurbin wchar_t da char16_t; mun yanke shawarar daina amfani da wchar_t, tunda char16_t yana ɗaukar bytes 2 akan duk tsarin aiki kuma baya shafar jituwa tsakanin lambar. Windows и Linux.

Akwai wasu ƙananan abubuwan ban sha'awa. Misali, a cikin STLPort ana iya jefa mai maimaitawa a fakaice zuwa mai nuni ga wani abu, kuma a wasu wurare a cikin lambar mu an yi amfani da wannan. A cikin sabbin ɗakunan karatu, ba a ƙara yin hakan ba, kuma dole ne a yi nazarin waɗannan sassan kuma a sake rubuta su da hannu.

Don haka, ƙauran lambar ya cika, an haɗa lambar don duk tsarin aiki. Lokaci yayi na gwaje-gwaje.

Gwaje-gwaje bayan sauye-sauye sun nuna raguwar aiki (a wasu wurare har zuwa 20-30%) da karuwa a yawan amfani da ƙwaƙwalwar ajiya (har zuwa 10-15%) idan aka kwatanta da tsohuwar sigar lambar. Wannan ya kasance, musamman, saboda kyakkyawan aiki na daidaitattun kirtani. Don haka, dole ne mu sake yin amfani da namu, layin da aka gyara dan kadan.

An kuma bayyana wani fasali mai ban sha'awa game da aiwatar da kwantena a cikin ɗakunan karatu da aka haɗa: komai (ba tare da abubuwa ba) std :: taswira da std :: saita daga ɗakunan karatu da aka gina a ciki suna rarraba ƙwaƙwalwar ajiya. Kuma saboda siffofin aiwatarwa, a wasu wurare a cikin lambar an ƙirƙiri yawancin kwantena mara kyau na wannan nau'in. An ware daidaitattun kwantenan ƙwaƙwalwar ajiya kaɗan, don tushen tushe ɗaya, amma a gare mu wannan ya zama mai mahimmanci - a cikin al'amuran da yawa, aikinmu ya ragu sosai kuma yawan ƙwaƙwalwar ajiya ya karu (idan aka kwatanta da STLPort). Saboda haka, a cikin lambar mu mun maye gurbin waɗannan nau'ikan kwantena guda biyu daga ɗakunan karatu da aka gina tare da aiwatar da su daga Boost, inda waɗannan kwantena ba su da wannan fasalin, kuma wannan ya warware matsalar tare da raguwa da karuwar ƙwaƙwalwar ajiya.

Kamar yadda yake faruwa sau da yawa bayan manyan canje-canje a manyan ayyuka, sake farawa na farko na lambar tushe bai kasance ba tare da matsaloli ba, kuma a nan, musamman, goyon bayan masu maimaita gyara kurakurai a cikin Windows-aiwatarwa. Mun ci gaba mataki-mataki, kuma kafin bazara ta 2017 (sigar 8.3.11 ta 1C:Enterprise), ƙaura ta ƙare.

Sakamakon

Canji zuwa ma'aunin C++14 ya ɗauki mu kusan watanni 6. Yawancin lokaci, mai haɓaka ɗaya (amma ƙwararrun ƙwararrun) ya yi aiki akan aikin, kuma a matakin ƙarshe na wakilan ƙungiyoyin da ke da alhakin takamaiman wuraren da aka haɗa su - UI, rukunin uwar garken, haɓakawa da kayan aikin gudanarwa, da sauransu.

Canjin ya sauƙaƙa aikinmu sosai kan ƙaura zuwa sabbin nau'ikan ma'auni. Don haka, sigar 1C: Kasuwanci 8.3.14 (a cikin haɓakawa, sakin da aka tsara don farkon shekara mai zuwa) an riga an canza shi zuwa daidaitattun. C++17.

Bayan ƙaura, masu haɓakawa suna da ƙarin zaɓuɓɓuka. Idan a baya muna da namu gyare-gyaren sigar STL da std namespace guda ɗaya, yanzu muna da daidaitattun azuzuwan daga ɗakunan karatu da aka gina a cikin std namespace, a cikin sunan stdx - layinmu da kwantena waɗanda aka inganta don ayyukanmu, a haɓaka - da sabuwar sigar haɓakawa. Kuma mai haɓakawa yana amfani da waɗannan azuzuwan waɗanda suka dace don magance matsalolinsa.

Aiwatar da "ƙasa" na masu ginin motsi kuma yana taimakawa wajen haɓakawa (motsa magina) don adadin azuzuwan. Idan aji yana da maginin motsi kuma an sanya wannan ajin a cikin akwati, to STL yana haɓaka kwafin abubuwan da ke cikin akwati (misali, lokacin da aka faɗaɗa akwati kuma ya zama dole don canza ƙarfin da sake dawo da ƙwaƙwalwar ajiya).

Cokali na kwalta

Watakila mafi rashin jin daɗi (amma ba mahimmanci) sakamakon ƙaura shi ne cewa muna fuskantar karuwa a cikin ƙarar. obj fayiloli, kuma cikakken sakamakon ginin tare da duk fayilolin tsaka-tsaki ya fara ɗaukar 60-70 GB. Wannan ɗabi'a ta samo asali ne saboda fitattun ɗakunan karatu na zamani, waɗanda ba su da mahimmanci ga girman fayilolin sabis da aka samar. Wannan baya shafar aikin aikace-aikacen da aka haɗa, amma yana haifar da rashin jin daɗi a cikin ci gaba, musamman, yana ƙara lokacin tattarawa. Abubuwan buƙatun don sararin faifai kyauta akan sabbin sabobin ginawa da kan injunan haɓaka suma suna ƙaruwa. Masu haɓaka mu suna aiki akan nau'ikan dandamali da yawa a layi daya, kuma ɗaruruwan gigabytes na fayilolin matsakaita wani lokaci suna haifar da matsaloli a cikin aikinsu. Matsalar ba ta da daɗi, amma ba ta da mahimmanci; mun jinkirta maganinta a yanzu. Muna la'akari da fasaha a matsayin ɗaya daga cikin zaɓuɓɓukan magance ta gina haɗin kai (musamman, Google yana amfani da shi lokacin haɓaka mai binciken Chrome).

source: www.habr.com

Sayi amintaccen masauki don shafuka tare da kariyar DDoS, sabar VPS VDS 🔥 Sayi ingantaccen masaukin yanar gizo tare da kariyar DDoS, sabar VPS VDS | ProHoster