Чӣ тавр мо 10 миллион сатри рамзи C++-ро ба стандарти C++ 14 (ва сипас ба C++ 17) тарҷума кардем.

Чанд вақт пеш (тирамоҳи соли 2016) ҳангоми таҳияи версияи навбатии платформаи технологии 1C: Enterprise, дар гурӯҳи таҳиягарон дар бораи дастгирии стандарти нав савол пайдо шуд. C ++ 14 дар кодекси мо. Гузариш ба стандарти нав, тавре ки мо тахмин кардем, ба мо имкон медиҳад, ки бисёр чизҳоро шевотар, соддатар ва боэътимодтар нависем, дастгирӣ ва нигоҳдории кодро соддатар кунем. Ва ба назар чунин мерасад, ки дар тарҷума ҳеҷ чизи ғайриоддӣ вуҷуд надорад, агар он барои миқёси пойгоҳи кодҳо ва хусусиятҳои хоси коди мо намебуд.

Барои онҳое, ки намедонанд, 1C: Enterprise муҳити рушди босуръати замимаҳои тиҷоратии кроссплатформавӣ ва вақти иҷрои онҳо дар системаҳои гуногуни амалиётӣ ва МДМ мебошад. Умуман, таркиби маҳсулот инҳоро дар бар мегирад:

Мо кӯшиш мекунем, ки як кодро барои системаҳои гуногуни амалиётӣ то ҳадди имкон нависем - базаи коди сервер 99% маъмул аст, муштарӣ - тақрибан 95%. Платформаи технологии 1C: Enterprise асосан дар C++ навишта шудааст ва дар зер хусусиятҳои тахминии код оварда шудаанд:

  • 10 миллион сатри рамзи C++,
  • 14 ҳазор файл,
  • 60 ҳазор синф,
  • ним миллион усул.

Ва ҳамаи ин иқтисодиёт бояд ба C ++ 14 тарҷума карда шаванд. Дар бораи он ки мо онро чӣ гуна анҷом додем ва дар ин раванд бо чӣ дучор шудем, мо имрӯз нақл мекунем.

Чӣ тавр мо 10 миллион сатри рамзи C++-ро ба стандарти C++ 14 (ва сипас ба C++ 17) тарҷума кардем.

Радди масъулият

Ҳама чизе, ки дар зер дар бораи кори суст / зуд навишта шудааст, (на) истеъмоли зиёди хотира тавассути татбиқи синфҳои стандартӣ дар китобхонаҳои гуногун як чизро дорад: ин БАРОИ МО дуруст аст. Ин комилан имконпазир аст, ки татбиқи стандартӣ ба вазифаҳои шумо ба таври беҳтарин мувофиқат кунанд. Мо аз вазифаҳои худ оғоз кардем: мо маълумоти хоси муштариёнамонро гирифтем, сенарияҳои маъмулии онҳоро иҷро кардем, суръат, миқдори хотираи истеъмолшуда ва ғайраро дида баромадем ва таҳлил кардем, ки оё мо ва мизоҷони мо аз чунин натиҷаҳо қаноатманданд ё не. Ва вобаста ба он амал мекард.

Он чизе ки мо доштем

Дар аввал мо коди платформаи 1C: Enterprise 8-ро бо истифода аз Microsoft Visual Studio навиштем. Лоиҳа дар аввали солҳои 2000-ум оғоз ёфт ва мо версияи танҳо барои Windows доштем. Табиист, ки аз он вақт инҷониб код фаъолона таҳия карда шуд, бисёр механизмҳо комилан аз нав навишта шуданд. Аммо код мувофиқи стандарти соли 1998 навишта шуда буд ва масалан, мо барои бомуваффақият тартиб додан қавсҳои кунҷи ростро бо фазо ҷудо кардем, ба монанди:

vector<vector<int> > IntV;

Дар соли 2006, бо нашри платформаи версияи 8.1, мо дастгирии Linux-ро оғоз кардем ва ба китобхонаи стандартии тарафи сеюм гузаштем. STLPort. Яке аз сабабҳои гузариш ин кор бо сатрҳои васеъ буд. Мо std::wstring-ро дар тамоми коди худ истифода мебарем, ки он ба навъи wchar_t асос ёфтааст. Андозаи он дар Windows 2 байт ва бо нобаёнӣ дар Linux 4 байт аст. Ин ба номувофиқатии протоколҳои бинарии мо байни муштарӣ ва сервер ва инчунин маълумоти гуногуни доимӣ оварда расонд. Бо имконоти gcc, шумо метавонед муайян кунед, ки андозаи wchar_t ҳангоми тартибдиҳӣ низ 2 байт аст, аммо пас шумо метавонед истифодаи китобхонаи стандартиро аз компилятор фаромӯш кунед, зеро он glibc-ро истифода мебарад, ки дар навбати худ ба wchar_t 4-байт тартиб дода мешавад. Сабабҳои дигар татбиқи беҳтари синфҳои стандартӣ, дастгирии ҷадвалҳои ҳаш ва ҳатто эмулясияи семантикаи ҳаракат дар дохили контейнерҳо буданд, ки мо онҳоро фаъолона истифода мебурдем. Ва як сабаби дигар, чунон ки мегӯянд, охирин, вале на камтар аз он, иҷрои сатр буд. Мо барои сатрҳо синфи худро доштем, зеро Бо назардошти хусусиятҳои нармафзори мо, мо амалиёти сатриро хеле васеъ истифода мебарем ва ин барои мо муҳим аст.

Сатри мо ба ғояҳои оптимизатсияи сатр асос ёфтааст, ки дар аввали солҳои 2000-ум ифода шуда буданд Андрей Александреску. Баъдтар, вақте ки Александреску дар Facebook кор мекард, бо пешниҳоди ӯ, дар муҳаррики Facebook сатр истифода шуд, ки бо принсипҳои шабеҳ кор мекунад (нигаред ба китобхона беақлӣ).

Хати мо ду технологияи асосии оптимизатсияро истифода бурд:

  1. Барои арзишҳои кӯтоҳ буфери дохилӣ дар худи объекти сатр истифода мешавад (тақсимоти хотираи иловагӣ лозим нест).
  2. Барои ҳамаи дигарон, механикҳо истифода мешаванд Нусхабардорӣ оид ба нависед. Арзиши сатр дар як ҷо нигоҳ дошта мешавад, шумори истинод ҳангоми таъин/тағйир истифода мешавад.

Барои суръат бахшидан ба таҳияи платформа, мо татбиқи ҷараёнро (ки мо онро истифода набурдаем) аз варианти STLPort хориҷ кардем, ки ба мо суръати компиляцияро тақрибан 20% дод. Баъдан, мо маҷбур шудем, ки маҳдудро истифода барем баландшавӣ. Boost ҷараёнро васеъ истифода мебарад, бахусус дар API-ҳои хидматрасонии он (масалан, барои сабти ном), аз ин рӯ мо маҷбур шудем, ки онро тағир диҳем, то истифодаи ҷараёнро аз он истисно кунем. Ин, дар навбати худ, барои мо гузариш ба версияҳои нави Boostро душвор сохт.

Роҳи сеюм

Ҳангоми гузаштан ба стандарти C++ 14, мо имконоти зеринро баррасӣ кардем:

  1. STLPort-ро, ки аз ҷониби мо тағир дода шудааст, ба стандарти C ++ 14 боло бардоред. Варианти хеле душвор аст, зеро. Дастгирии STLPort дар соли 2010 қатъ карда шуд ва мо бояд тамоми коди онро худамон бардорем.
  2. Ба татбиқи дигари STL, ки бо C++ 14 мувофиқ аст, гузаред. Хеле матлуб аст, ки ин татбиқ дар Windows ва Linux бошад.
  3. Ҳангоми тартиб додани ҳар як ОС, китобхонаи дар компилятори мувофиқ сохташударо истифода баред.

Варианти якум аз сабаби кори зиёд фавран рад карда шуд.

Мо муддате дар бораи варианти дуюм фикр мекардем; номзад ба хисоб меравад libc++, аммо он вақт дар зери Windows кор намекард. Барои интиқоли libc++ ба Windows, шумо бояд кори зиёдеро анҷом диҳед - масалан, ҳама чизҳои марбут ба риштаҳо, ҳамоҳангсозии ришта ва атомизмро худатон нависед, зеро libc++ дар ин минтақаҳо истифода мешавад. API POSIX.

Ва мо роҳи сеюмро интихоб кардем.

Гузариш

Ҳамин тавр, мо маҷбур шудем, ки истифодаи STLPort-ро бо китобхонаҳои компиляторҳои мувофиқ иваз кунем (Visual Studio 2015 барои Windows, gcc 7 барои Linux, clang 8 барои macOS).

Хушбахтона, рамзи мо асосан аз рӯи дастурҳо навишта шуда буд ва аз ҳар гуна ҳиллаҳои душвор истифода набурд, аз ин рӯ, муҳоҷират ба китобхонаҳои нав бо истифода аз скриптҳое, ки номҳои намудҳо, синфҳо, фазои номҳоро иваз мекарданд ва ба файлҳои сарчашма дохил мешаванд, нисбатан осонтар идома ёфт. Муҳоҷират ба 10 файли манбаъ (аз 000) таъсир расонд. wchar_t бо char14_t иваз карда шуд; мо тасмим гирифтем, ки истифодаи wchar_t-ро бас кунем, зеро char000_t дар ҳама OS 16 байтро ишғол мекунад ва мутобиқати кодро байни Windows ва Linux вайрон намекунад.

Якчанд саргузаштҳои хурде буданд. Масалан, дар STLPort, итератор метавонад ба таври ғайримустақим ба нишоннамои элемент интиқол дода шавад ва ин дар баъзе ҷойҳо дар коди мо истифода мешуд. Дар китобхонахои нав ин кор дигар имконнопазир буд ва ин порчахоро дастй тахлил ва аз нав навиштан лозим омад.

Ҳамин тавр, интиқоли код анҷом ёфт, код барои ҳама системаҳои оператсионӣ тартиб дода мешавад. Вақти санҷишҳо расидааст.

Санҷишҳо пас аз гузариш дар муқоиса бо версияи пешинаи код коҳиши кор (дар баъзе ҷойҳо то 20-30%) ва афзоиши истеъмоли хотира (то 10-15%) нишон доданд. Ин, алалхусус, аз сабаби иҷрои номунтазами сатрҳои стандартӣ буд. Аз ин рӯ, мо маҷбур шудем, ки хати худамонро каме тағир додем.

Хусусияти ҷолиби татбиқи контейнерҳо дар китобхонаҳои дохилшуда низ ошкор карда шуд: холӣ (бе элементҳо) std::map ва std::set аз китобхонаҳои дарунсохт хотира ҷудо мекунанд. Дар мамлакати мо бошад, бинобар хусусиятхои ба амал баровардани он дар баъзе чойхои код хеле зиёд зарфхои холии ин навъ ба вучуд оварда мешаванд. Онҳо контейнерҳои хотираи стандартиро барои як унсури реша каме ҷудо мекунанд, аммо барои мо ин муҳим буд - дар як қатор сенарияҳо, иҷрои мо ба таври назаррас коҳиш ёфт ва истеъмоли хотира афзоиш ёфт (нисбат ба STLPort). Аз ин рӯ, дар коди худ, мо ин ду намуди контейнерҳоро аз китобхонаҳои дарунсохт бо татбиқи онҳо аз Boost иваз кардем, ки дар он контейнерҳо ин хусусият надоштанд ва ин мушкилотро бо сустшавӣ ва зиёд шудани истеъмоли хотира ҳал кард.

Тавре ки аксар вақт пас аз тағироти васеъмиқёс дар лоиҳаҳои калон рӯй медиҳад, такрори аввалини манбаъҳо бе мушкилот кор намекард ва дар ин ҷо мо хеле муфид будем, махсусан, дастгирии итераторҳои дебаг дар татбиқи Windows. Қадам ба қадам мо пеш рафтем ва то баҳори соли 2017 (версияи 8.3.11 1С: Enterprise) муҳоҷират ба анҷом расид.

Натиҷаҳо

Гузариш ба стандарти C++14 тақрибан 6 моҳро дар бар гирифт. Аксар вақт дар лоиҳа як таҳиягар (вале хеле баландихтисос) кор мекард ва дар марҳилаи ниҳоӣ намояндагони дастаҳои масъули соҳаҳои мушаххас ҳамроҳ шуданд - UI, кластери сервер, абзорҳои таҳия ва идоракунӣ ва ғайра.

Гузариш кори моро оид ба гузариш ба версияҳои охирини стандарт хеле содда кард. Ҳамин тариқ, версияи 1C: Enterprise 8.3.14 (дар таҳия, нашри он дар аввали соли оянда ба нақша гирифта шудааст) аллакай ба стандарт интиқол дода шудааст. C++ 17.

Пас аз муҳоҷират, таҳиягарон имконоти бештар доранд. Агар қаблан мо версияи тағирёфтаи STL ва як фазои номи std дошта бошем, ҳоло дар фазои номи std мо синфҳои стандартиро аз китобхонаҳои дарунсохтаи компилятор дорем, дар фазои номи stdx - сатрҳо ва контейнерҳои мо барои вазифаҳои мо оптимизатсия карда шудаанд. - версияи нави boost. Ва таҳиякунанда он синфҳоро истифода мебарад, ки барои ҳалли мушкилоти ӯ беҳтарин мувофиқанд.

Татбиқи "модарии" конструкторҳои ҳаракат низ дар рушд кӯмак мекунад (конструкторонро гузаронед) барои як катор синфхо. Агар синф конструктори ҳаракаткунанда дошта бошад ва ин синф дар контейнер ҷойгир карда шуда бошад, пас STL нусхабардории элементҳоро дар дохили контейнер оптимизатсия мекунад (масалан, вақте ки контейнер васеъ мешавад ва шумо бояд иқтидорро тағир диҳед ва хотираро аз нав тақсим кунед).

Як қошуқи қатрон

Шояд ногувортарин (вале на интиқодӣ) оқибати муҳоҷират ин аст, ки мо бо афзоиши ҳаҷми муҳоҷирон рӯ ба рӯ мешавем. файлҳои obj, ва натиҷаи пурраи сохтмон бо ҳама файлҳои фосилавӣ 60 - 70 ГБ-ро гирифт. Ин рафтор ба вижагиҳои китобхонаҳои муосири стандартӣ вобаста аст, ки ба ҳаҷми файлҳои хидматрасонии тавлидшуда камтар танқидӣ кардаанд. Ин ба кори замимаи тартибдодашуда таъсир намерасонад, аммо дар коркард як қатор нороҳатиҳо ба вуҷуд меорад, аз ҷумла, вақти тартибдиҳиро зиёд мекунад. Инчунин талабот ба фазои озоди диск дар серверҳои сохташуда ва мошинҳои таҳиякунанда афзоиш ёфтааст. Таҳиягарони мо дар баробари якчанд версияҳои платформа кор мекунанд ва садҳо гигабайтҳои файлҳои мобайнӣ баъзан дар кор мушкилот эҷод мекунанд. Мушкилот ногувор, вале танкидй нест, мо халли онро холо мавкуф гузоштаем. Ҳамчун яке аз вариантҳои ҳалли он, мо техникаро баррасӣ мекунем муттаҳид созад (аз ҷумла, онро Google ҳангоми таҳияи браузери Chrome истифода мебарад).

Манбаъ: will.com

Илова Эзоҳ