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 don dandalin 1C: Enterprise 8 a Microsoft Visual Studio. An fara aikin a farkon 2000s kuma muna da nau'in Windows-kawai. A zahiri, tun lokacin da lambar ke haɓaka sosai, an sake rubuta hanyoyin da yawa gaba ɗaya. Amma an rubuta lambar bisa ga ma'auni na 1998, kuma, alal misali, ɓangarorin kusurwar damanmu an raba su da sarari don tattarawa ya yi nasara, kamar haka:

vector<vector<int> > IntV;

A cikin 2006, tare da fitowar sigar dandamali 8.1, mun fara tallafawa Linux kuma mun canza zuwa daidaitaccen ɗakin karatu na ɓangare na uku. STLPort. Ɗaya daga cikin dalilan sauye-sauyen shine yin aiki tare da layi mai fadi. A cikin lambar mu, muna amfani da std :: wstring, wanda ya dogara da nau'in wchar_t, ko'ina. Girmansa a cikin Windows 2 bytes ne, kuma a cikin Linux tsoho shine 4 bytes. Wannan ya haifar da rashin jituwa na ƙa'idodin mu na binary tsakanin abokin ciniki da uwar garken, da kuma bayanai masu tsayi iri-iri. Yin amfani da zaɓuɓɓukan gcc, zaku iya tantance cewa girman wchar_t yayin haɗawa shima 2 bytes ne, amma kuna iya mantawa game da amfani da daidaitaccen ɗakin karatu daga mahaɗar, saboda yana amfani da glibc, wanda kuma aka haɗa shi don 4-byte wchar_t. Wasu dalilai sun kasance mafi kyawun aiwatar da daidaitattun azuzuwan, goyan bayan tebur ɗin zanta, har ma da kwaikwaya na ma'anar motsi cikin kwantena, waɗanda muka yi amfani da su sosai. Kuma wani ƙarin dalili, kamar yadda suka faɗa ƙarshe amma ba kalla ba, shine aikin kirtani. Muna da namu aji na kirtani, saboda ... Saboda ƙayyadaddun software na mu, ana amfani da ayyukan kirtani sosai kuma a gare mu wannan yana da mahimmanci.

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. Canjawa zuwa wani aiwatarwar STL mai dacewa da C++14. Yana da matuƙar kyawawa cewa wannan aiwatarwa ya kasance na Windows da 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 karkashin Windows ba. Don shigar da libc++ zuwa Windows, dole ne ku yi ayyuka da yawa - alal misali, rubuta duk abin da ke da alaƙa da zaren, daidaita zaren da atomity, tunda libc++ da aka yi amfani da su a waɗannan wuraren. API ɗin POSIX.

Kuma mun zabi hanya ta uku.

Canji

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

Abin farin ciki, lambar mu an rubuta shi ne bisa ga ka'idoji kuma ba a yi amfani da kowane nau'i na wayo ba, don haka ƙaura zuwa sababbin ɗakunan karatu ya ci gaba da sauƙi, tare da taimakon rubutun da ya maye gurbin sunayen nau'o'i, azuzuwan, wuraren suna kuma ya haɗa a cikin tushen. fayiloli. Hijira ta shafi fayilolin tushe guda 10 (cikin 000). wchar_t an maye gurbinsu da char14_t; mun yanke shawarar yin watsi da amfani da wchar_t, saboda char000_t yana ɗaukar bytes 16 akan duk OSes kuma baya lalata daidaiton lamba tsakanin Windows da 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 sau da yawa yakan faru bayan manyan canje-canje a cikin manyan ayyuka, ƙaddamarwar farko na lambar tushe ba ta aiki ba tare da matsaloli ba, kuma a nan, musamman, goyon baya ga masu yin kuskure a cikin aiwatar da Windows ya zo da amfani. Mataki zuwa mataki mun ci gaba, kuma a lokacin bazara na 2017 (version 8.3.11 1C: Enterprise) an kammala ƙaura.

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

Add a comment