Ki jan nou tradui 10 milyon liy kòd C++ nan estanda C++14 (epi answit nan C++17)

Kèk tan de sa (nan sezon otòn 2016), pandan devlopman pwochen vèsyon an nan platfòm teknoloji 1C:Enterprise, kesyon an leve nan ekip devlopman an sou sipòte nouvo estanda a. C ++ 14 nan kòd nou an. Tranzisyon an nan yon nouvo estanda, jan nou te sipoze, ta pèmèt nou ekri anpil bagay plis elegant, tou senpleman ak fyab, epi li ta senplifye sipò ak antretyen nan kòd la. Epi li sanble pa gen anyen ekstraòdinè nan tradiksyon an, si se pa pou echèl la nan baz la kòd ak karakteristik yo espesifik nan kòd nou an.

Pou moun ki pa konnen, 1C:Enterprise se yon anviwònman pou devlopman rapid nan aplikasyon pou biznis kwa-platfòm ak tan pou ekzekisyon yo sou diferan OS ak DBMS. An tèm jeneral, pwodwi a gen ladan:

Nou eseye ekri menm kòd la pou diferan sistèm opere otank posib - baz kòd sèvè a se 99% komen, baz kòd kliyan an apeprè 95%. Platfòm teknoloji 1C:Enterprise a prensipalman ekri an C++ ak karakteristik kòd apwoksimatif yo bay anba a:

  • 10 milyon liy kòd C++,
  • 14 mil dosye,
  • 60 mil klas,
  • mwatye yon milyon metòd.

Ak tout bagay sa yo te dwe tradui nan C++14. Jodi a nou pral di w kouman nou te fè sa a ak sa nou te rankontre nan pwosesis la.

Ki jan nou tradui 10 milyon liy kòd C++ nan estanda C++14 (epi answit nan C++17)

Limit responsabilite nou

Tout sa ki ekri anba a sou travay ralanti / rapid, (pa) gwo konsomasyon memwa pa aplikasyon klas estanda nan divès bibliyotèk vle di yon sèl bagay: sa a se vre POU NOU. Li se byen posib ke aplikasyon estanda yo pral pi byen adapte pou travay ou yo. Nou te kòmanse soti nan pwòp travay nou yo: nou te pran done ki te tipik pou kliyan nou yo, te kouri senaryo tipik sou yo, te gade pèfòmans, kantite memwa konsome, elatriye, epi analize si nou menm ak kliyan nou yo te satisfè ak rezilta sa yo oswa ou pa. . Apre sa, yo te aji depann sou.

Sa nou te genyen

Okòmansman, nou te ekri kòd la pou platfòm 1C:Enterprise 8 lè l sèvi avèk Microsoft Visual Studio. Pwojè a te kòmanse nan kòmansman ane 2000 yo e nou te gen yon vèsyon sèlman Windows. Natirèlman, depi lè sa a kòd la te aktivman devlope, anpil mekanis yo te konplètman reekri. Men, kòd la te ekri dapre estanda 1998 la, epi, pou egzanp, parantèz ang dwat nou yo te separe pa espas pou konpilasyon ta reyisi, tankou sa a:

vector<vector<int> > IntV;

An 2006, ak lage vèsyon platfòm 8.1, nou te kòmanse sipòte Linux epi chanje nan yon bibliyotèk estanda twazyèm pati. STLPort. Youn nan rezon pou tranzisyon an se te travay ak liy lajè. Nan kòd nou an, nou itilize std::wstring, ki baze sou kalite wchar_t, nan tout. Gwosè li nan Windows se 2 byte, ak nan Linux default la se 4 byte. Sa a te mennen nan enkonpatibilite nan pwotokòl binè nou an ant kliyan ak sèvè, osi byen ke divès kalite done ki pèsistan. Sèvi ak opsyon gcc yo, ou ka presize ke gwosè wchar_t pandan konpilasyon tou se 2 byte, men Lè sa a, ou ka bliye sou itilize bibliyotèk estanda ki soti nan konpilateur la, paske li itilize glibc, ki an vire konpile pou yon wchar_t 4-byte. Lòt rezon yo te pi bon aplikasyon nan klas estanda, sipò pou tab hash, e menm imitasyon nan semantik la nan deplase andedan resipyan, ke nou aktivman itilize. Ak yon lòt rezon, jan yo di dènye men pa pi piti, se te pèfòmans fisèl. Nou te gen pwòp klas nou pou fisèl, paske... Akòz spesifik yo nan lojisyèl nou an, operasyon fisèl yo itilize trè lajman ak pou nou sa a se kritik.

Fisèl nou an baze sou ide optimize fisèl ki te eksprime nan kòmansman ane 2000 yo Andrei Alexandrescu. Apre sa, lè Alexandrescu te travay nan Facebook, sou sijesyon li, yo te itilize yon liy nan motè a Facebook ki te travay sou prensip menm jan an (gade bibliyotèk la. foli).

Liy nou an te itilize de teknoloji optimize prensipal yo:

  1. Pou valè kout, yo itilize yon tanpon entèn nan objè fisèl li menm (pa mande pou alokasyon memwa adisyonèl).
  2. Pou tout lòt yo, yo itilize mekanik Kopi sou Ekri. Valè fisèl la estoke nan yon sèl kote, epi yo itilize yon kontwa referans pandan plasman/modifikasyon.

Pou akselere konpilasyon platfòm, nou eskli aplikasyon kouran an nan variant STLPort nou an (ki nou pa t itilize), sa te ban nou apeprè 20% pi vit konpilasyon. Imedyatman nou te oblije fè itilizasyon limite Ranfòse. Boost fè gwo itilizasyon kouran, patikilyèman nan API sèvis li yo (pa egzanp, pou antre), kidonk nou te oblije modifye li pou retire itilizasyon kouran. Sa a, nan vire, te fè li difisil pou nou emigre nan nouvo vèsyon Boost.

Twazyèm fason

Lè w ap deplase nan estanda C++ 14, nou konsidere opsyon sa yo:

  1. Mete ajou STLPort nou modifye nan estanda C++14 la. Opsyon an trè difisil, paske... sipò pou STLPort te sispann nan 2010, epi nou ta dwe bati tout kòd li yo tèt nou.
  2. Tranzisyon nan yon lòt aplikasyon STL konpatib ak C++14. Li trè dezirab ke aplikasyon sa a dwe pou Windows ak Linux.
  3. Lè w ap konpile pou chak eksplwatasyon, sèvi ak bibliyotèk ki te bati nan konpilateur korespondan an.

Premye opsyon a te rejte kareman akòz twòp travay.

Nou te panse sou dezyèm opsyon an pou kèk tan; konsidere kòm yon kandida libc++, men nan tan sa a li pa t 'travay anba Windows. Pou pòte libc++ nan Windows, ou ta dwe fè anpil travay - pou egzanp, ekri tout sa ou menm ki gen rapò ak fil, senkronizasyon fil ak atomite, depi libc++ itilize nan zòn sa yo. POSIX API.

Epi nou te chwazi twazyèm wout la.

Tranzisyon

Se konsa, nou te oblije ranplase itilizasyon STLPort ak bibliyotèk konpilateur korespondan yo (Visual Studio 2015 pou Windows, gcc 7 pou Linux, clang 8 pou macOS).

Erezman, kòd nou an te ekri sitou dapre direktiv epi yo pa t 'sèvi ak tout kalite ke trik nouvèl entelijan, se konsa migrasyon an nan nouvo bibliyotèk te kontinye relativman fèt san pwoblèm, avèk èd nan scripts ki ranplase non yo nan kalite, klas, espas non ak enkli nan sous la. dosye. Migrasyon an te afekte 10 dosye sous (soti 000). wchar_t te ranplase pa char14_t; nou deside abandone itilizasyon wchar_t, paske char000_t pran 16 byte sou tout OS yo epi li pa gate konpatibilite kòd ant Windows ak Linux.

Te gen kèk ti avantur. Pou egzanp, nan STLPort yon iteratè ta ka implicite jete nan yon konsèy sou yon eleman, ak nan kèk kote nan kòd nou an sa a te itilize. Nan nouvo bibliyotèk li pa t posib ankò pou fè sa, epi pasaj sa yo te dwe analize ak reekri manyèlman.

Se konsa, migrasyon kòd la fini, kòd la konpile pou tout sistèm operasyon yo. Li lè pou tès yo.

Tès apre tranzisyon an te montre yon gout nan pèfòmans (nan kèk kote jiska 20-30%) ak yon ogmantasyon nan konsomasyon memwa (jiska 10-15%) konpare ak vèsyon an ansyen nan kòd la. Sa a te, an patikilye, akòz pèfòmans nan suboptimal nan strings estanda. Se poutèt sa, nou ankò te oblije sèvi ak pwòp pa nou an, yon ti kras modifye liy.

Yon karakteristik enteresan nan aplikasyon an nan resipyan nan bibliyotèk entegre yo te revele tou: vid (san eleman) std::map ak std::set soti nan bibliyotèk entegre asiyen memwa. Ak akòz karakteristik aplikasyon yo, nan kèk kote nan kòd la byen yon anpil nan resipyan vid nan kalite sa a yo kreye. Kontenè memwa estanda yo atribye ba yon ti kras, pou yon eleman rasin, men pou nou sa a te tounen kritik - nan yon kantite senaryo, pèfòmans nou an te tonbe anpil ak konsomasyon memwa ogmante (konpare ak STLPort). Se poutèt sa, nan kòd nou an nou ranplase de kalite resipyan sa yo ki soti nan bibliyotèk entegre yo ak aplikasyon yo nan Boost, kote resipyan sa yo pa t 'gen karakteristik sa a, e sa te rezoud pwoblèm nan ak ralentissement ak konsomasyon memwa ogmante.

Kòm souvan rive apre chanjman gwo echèl nan gwo pwojè, premye iterasyon nan kòd sous la pa t 'travay san pwoblèm, ak isit la, an patikilye, sipò pou iteratè debogaj nan aplikasyon an Windows te vin an sou la men. Etap pa etap nou te avanse, ak nan sezon prentan 2017 la (vèsyon 8.3.11 1C:Enterprise) migrasyon an te konplete.

Rezilta

Tranzisyon an nan estanda C++14 la te pran nou apeprè 6 mwa. Pifò nan tan an, yon sèl (men trè trè kalifye) pwomotè te travay sou pwojè a, ak nan etap final reprezantan ekip responsab pou zòn espesifik ansanm nan - UI, gwoup sèvè, devlopman ak zouti administrasyon, elatriye.

Tranzisyon an te senplifye anpil travay nou sou migrasyon nan dènye vèsyon estanda a. Kidonk, vèsyon 1C: Enterprise 8.3.14 (nan devlopman, lage pwograme pou kòmansman ane pwochèn) deja transfere nan estanda a. C++17.

Apre migrasyon an, devlopè yo gen plis opsyon. Si pi bonè nou te gen pwòp vèsyon modifye STL ak yon espas non std, kounye a nou gen klas estanda ki soti nan bibliyotèk konpilatè entegre yo nan espas non std, nan espas non stdx - liy nou yo ak resipyan yo optimize pou travay nou yo, nan ogmantasyon - la. dènye vèsyon boost. Ak pwomotè a sèvi ak klas sa yo ki pi byen adapte yo rezoud pwoblèm li yo.

Aplikasyon "natif natal" nan konstrukteur deplase ede tou nan devlopman (deplase konstrukteur yo) pou yon kantite klas. Si yon klas gen yon konstrukteur deplase epi klas sa a mete nan yon veso, Lè sa a, STL a optimize kopi eleman andedan veso a (pa egzanp, lè veso a ap elaji epi li nesesè pou chanje kapasite ak relocate memwa).

Yon kiyè goudwon

Petèt konsekans ki pi dezagreyab (men se pa kritik) migrasyon an se ke nou fè fas ak yon ogmantasyon nan volim nan. fichye obj, ak rezilta konplè bati a ak tout dosye entèmedyè yo te kòmanse pran 60-70 GB. Konpòtman sa a se akòz sengularite yo nan bibliyotèk estanda modèn, ki te vin mwens kritik nan gwosè a nan dosye sèvis pwodwi yo. Sa a pa afekte operasyon an nan aplikasyon an konpile, men li lakòz yon kantite enkonvenyan nan devlopman, an patikilye, li ogmante tan konpilasyon. Kondisyon pou espas disk gratis sou serveurs bati ak sou machin devlopè yo ap ogmante tou. Devlopè nou yo travay sou plizyè vèsyon nan platfòm la an paralèl, ak dè santèn de gigaocte nan dosye entèmedyè pafwa kreye difikilte nan travay yo. Pwoblèm nan se dezagreyab, men se pa kritik; nou te ranvwaye solisyon li pou kounye a. Nou ap konsidere teknoloji kòm youn nan opsyon pou rezoud li bati inite (an patikilye, Google sèvi ak li lè w ap devlope navigatè Chrome a).

Sous: www.habr.com

Add nouvo kòmantè