It-triq għall-iċċekkjar tat-tip 4 miljun linja ta 'kodiċi Python. Parti 2

Illum qed nippubblikaw it-tieni parti tat-traduzzjoni ta 'materjal dwar kif Dropbox organizza l-kontroll tat-tip għal bosta miljuni ta' linji ta 'kodiċi Python.

It-triq għall-iċċekkjar tat-tip 4 miljun linja ta 'kodiċi Python. Parti 2

Aqra l-ewwel parti

Appoġġ tat-tip uffiċjali (PEP 484)

Aħna wettaqna l-ewwel esperimenti serji tagħna ma 'mypy fuq Dropbox matul Hack Week 2014. Hack Week hija avveniment ta' ġimgħa ospitat minn Dropbox. Matul dan iż-żmien, l-impjegati jistgħu jaħdmu fuq dak kollu li jridu! Uħud mill-proġetti tat-teknoloġija l-aktar famużi ta' Dropbox bdew f'avvenimenti bħal dawn. Bħala riżultat ta 'dan l-esperiment, aħna kkonkludejna li mypy jidher promettenti, għalkemm il-proġett għadu mhux lest għal użu mifrux.

Dak iż-żmien, l-idea li jiġu standardizzati sistemi ta 'ħjiel tat-tip Python kienet fl-arja. Kif għidt, peress Python 3.0 kien possibbli li jintużaw annotazzjonijiet tat-tip għall-funzjonijiet, iżda dawn kienu biss espressjonijiet arbitrarji, mingħajr sintassi u semantika definiti. Matul l-eżekuzzjoni tal-programm, dawn l-annotazzjonijiet kienu, fil-biċċa l-kbira, sempliċement injorati. Wara Hack Week, bdejna naħdmu fuq l-istandardizzazzjoni tas-semantika. Dan ix-xogħol wassal għall-emerġenza PEP 484 (Guido van Rossum, Łukasz Langa u jien kkollaborajna fuq dan id-dokument).

Il-​motivi tagħna setgħu jitqiesu minn żewġ naħat. L-ewwel, ttamajna li l-ekosistema Python kollha tista 'tadotta approċċ komuni għall-użu ta' ħjiel tat-tip (terminu użat f'Python bħala l-ekwivalenti ta '"annotazzjonijiet tat-tip"). Dan, minħabba r-riskji possibbli, ikun aħjar milli jintużaw ħafna approċċi reċiprokament inkompatibbli. It-tieni, ridna niddiskutu b'mod miftuħ il-mekkaniżmi ta 'annotazzjoni tat-tip ma' ħafna membri tal-komunità Python. Din ix-xewqa kienet parzjalment iddettata mill-fatt li ma nkunux rridu nħarsu qishom "apostati" mill-ideat bażiċi tal-lingwa f'għajnejn il-mases wiesgħa ta 'programmaturi Python. Hija lingwa ittajpjata b'mod dinamiku, magħrufa bħala "duck typing". Fil-komunità, fil-bidu nett, attitudni kemmxejn suspettuża lejn l-idea ta 'tajpjar statiku ma setgħetx ma tqumx. Iżda dak is-sentiment eventwalment naqas wara li deher ċar li l-ittajpjar statiku ma kienx se jkun obbligatorju (u wara li n-nies indunaw li fil-fatt kien utli).

Is-sintassi tal-ħjiel tat-tip li eventwalment ġiet adottata kienet simili ħafna għal dak li mypy appoġġjat dak iż-żmien. PEP 484 ġie rilaxxat b'Python 3.5 fl-2015. Python ma kienx għadu lingwa ittajpjata b'mod dinamiku. Inħobb naħseb f'dan l-avveniment bħala pass importanti fl-istorja ta' Python.

Bidu tal-migrazzjoni

Fl-aħħar tal-2015, Dropbox ħoloq tim ta' tliet persuni biex jaħdmu fuq mypy. Kienu jinkludu Guido van Rossum, Greg Price u David Fisher. Minn dak il-mument 'il quddiem, is-sitwazzjoni bdiet tiżviluppa estremament malajr. L-ewwel ostaklu għat-tkabbir ta 'mypy kien il-prestazzjoni. Kif aċċentat hawn fuq, fil-jiem bikrija tal-proġett ħsibt biex tittraduċi l-implimentazzjoni ta 'mypy fis-C, iżda din l-idea ġiet maqtugħa mil-lista għalissa. Konna mwaħħla bit-tmexxija tas-sistema billi tuża l-interpretu CPython, li mhuwiex mgħaġġel biżżejjed għal għodod bħal mypy. (Il-proġett PyPy, implimentazzjoni alternattiva ta' Python b'kompilatur JIT, lanqas għenuna.)

Fortunatament, xi titjib algoritmiku ġie għall-għajnuna tagħna hawn. L-ewwel "aċċeleratur" qawwi kien l-implimentazzjoni ta 'verifika inkrementali. L-idea wara dan it-titjib kienet sempliċi: jekk id-dipendenzi kollha tal-modulu ma nbidlux mill-ġirja preċedenti ta 'mypy, allura nistgħu nużaw id-dejta fil-cache matul il-ġirja preċedenti waqt li naħdmu mad-dipendenzi. Għandna bżonn biss li nwettqu verifika tat-tip fuq il-fajls modifikati u fuq il-fajls li jiddependu minnhom. Mypy saħansitra mar ftit aktar 'il quddiem: jekk l-interface esterna ta' modulu ma nbidlitx, mypy assumiet li moduli oħra li importaw dan il-modulu ma kellhomx għalfejn jerġgħu jiġu ċċekkjati.

Iċċekkjar inkrementali għenna ħafna meta nnotaw ammonti kbar ta 'kodiċi eżistenti. Il-punt hu li dan il-proċess normalment jinvolvi ħafna ġirjiet iterattivi ta 'mypy peress li l-annotazzjonijiet jiżdiedu gradwalment mal-kodiċi u jitjiebu gradwalment. L-ewwel ġirja ta 'mypy kienet għadha bil-mod ħafna minħabba li kellha ħafna dipendenzi x'jiċċekkja. Imbagħad, biex intejbu s-sitwazzjoni, implimentajna mekkaniżmu ta 'caching remot. Jekk mypy jiskopri li l-cache lokali x'aktarx li jkun skadut, tniżżel l-istampa tal-cache attwali għall-codebase kollu mir-repożitorju ċentralizzat. Imbagħad twettaq verifika inkrementali billi tuża din l-istampa. Dan ħadna pass ieħor kbir lejn iż-żieda tal-prestazzjoni ta 'mypy.

Dan kien perjodu ta 'adozzjoni rapida u naturali ta' verifika tat-tip fuq Dropbox. Sa tmiem l-2016, diġà kellna madwar 420000 linja ta 'kodiċi Python b'annotazzjonijiet tat-tip. Ħafna utenti kienu entużjasti dwar il-verifika tat-tip. Aktar u aktar timijiet tal-iżvilupp kienu qed jużaw Dropbox mypy.

Dakinhar kollox deher tajjeb, imma xorta kellna ħafna x’nagħmlu. Bdejna nwettqu stħarriġ perjodiku tal-utenti interni sabiex nidentifikaw oqsma problematiċi tal-proġett u nifhmu liema kwistjonijiet jeħtieġ li jiġu solvuti l-ewwel (din il-prattika għadha tintuża fil-kumpanija llum). L-aktar importanti, kif deher ċar, kienu żewġ kompiti. L-ewwel, kellna bżonn aktar kopertura tat-tip tal-kodiċi, it-tieni, kellna bżonn mypy biex taħdem aktar malajr. Kien assolutament ċar li x-xogħol tagħna biex nħaffu mypy u nimplimentah fi proġetti tal-kumpanija kien għadu 'l bogħod milli lest. Aħna, konxji bis-sħiħ mill-importanza ta’ dawn iż-żewġ ħidmiet, bdejna biex insolvuhom.

Aktar produttività!

Il-kontrolli inkrementali għamlu mypy aktar mgħaġġel, iżda l-għodda għadha ma kinitx veloċi biżżejjed. Ħafna kontrolli inkrementali damu madwar minuta. Ir-raġuni għal dan kienet l-importazzjonijiet ċikliċi. Dan probabbilment mhux se jissorprendi lil xi ħadd li ħadem ma 'codebases kbar miktuba f'Python. Kellna settijiet ta 'mijiet ta' moduli, li kull wieħed minnhom indirettament importat l-oħrajn kollha. Jekk xi fajl f'linja ta 'importazzjoni nbidel, mypy kellha tipproċessa l-fajls kollha f'dik il-linja, u ħafna drabi kwalunkwe moduli li importaw moduli minn dak il-linja. Ċiklu wieħed bħal dan kien it-"tħabbil tad-dipendenza" infami li kkawża ħafna problemi f'Dropbox. Ladarba din l-istruttura kien fiha diversi mijiet ta 'moduli, filwaqt li kienet importata, direttament jew indirettament, ħafna testijiet, intużat ukoll fil-kodiċi tal-produzzjoni.

Aħna kkunsidrajna l-possibbiltà li "tħoll" dipendenzi ċirkolari, iżda ma kellniex ir-riżorsi biex nagħmlu dan. Kien hemm wisq kodiċi li ma konniex familjari magħhom. Bħala riżultat, ħriġna b'approċċ alternattiv. Iddeċidejna li nagħmlu mypy taħdem malajr anke fil-preżenza ta '"tangles ta' dipendenza". Ksibna dan l-għan bl-użu tad-daemon mypy. Daemon huwa proċess server li jimplimenta żewġ kapaċitajiet interessanti. L-ewwelnett, jaħżen informazzjoni dwar il-codebase kollu fil-memorja. Dan ifisser li kull darba li tmexxi mypy, m'għandekx għalfejn tgħabbi dejta fil-cache relatata ma' eluf ta' dipendenzi importati. It-tieni, huwa bir-reqqa, fil-livell ta 'unitajiet strutturali żgħar, janalizza d-dipendenzi bejn il-funzjonijiet u entitajiet oħra. Per eżempju, jekk il-funzjoni foo jitlob funzjoni bar, allura hemm dipendenza foo minn bar. Meta fajl jinbidel, id-daemon l-ewwel, b'mod iżolat, jipproċessa biss il-fajl mibdul. Imbagħad iħares lejn bidliet viżibbli esternament għal dak il-fajl, bħal firem tal-funzjoni mibdula. Id-daemon juża informazzjoni dettaljata dwar l-importazzjonijiet biss biex jiċċekkja darbtejn dawk il-funzjonijiet li fil-fatt jużaw il-funzjoni modifikata. Tipikament, b'dan l-approċċ, għandek tiċċekkja ftit funzjonijiet.

L-implimentazzjoni ta 'dan kollu ma kinitx faċli, peress li l-implimentazzjoni oriġinali ta' mypy kienet iffukata ħafna fuq l-ipproċessar ta 'fajl wieħed kull darba. Kellna nittrattaw ma 'ħafna sitwazzjonijiet ta' fruntiera, li l-okkorrenza tagħhom kienet teħtieġ kontrolli ripetuti f'każijiet fejn xi ħaġa inbidlet fil-kodiċi. Pereżempju, dan jiġri meta klassi tiġi assenjata klassi bażi ġdida. Ladarba għamilna dak li ridna, stajna nnaqqsu l-ħin tal-eżekuzzjoni tal-biċċa l-kbira tal-kontrolli inkrementali għal ftit sekondi biss. Din dehret rebħa kbira għalina.

Saħansitra aktar produttività!

Flimkien mal-caching remot li ddiskutejt hawn fuq, id-daemon mypy solviet kważi kompletament il-problemi li jinqalgħu meta programmatur ta 'spiss imexxi l-iċċekkjar tat-tip, u jagħmel bidliet f'numru żgħir ta' fajls. Madankollu, il-prestazzjoni tas-sistema fil-każ ta 'użu l-inqas favorevoli kienet għadha 'l bogħod mill-ottimali. Startup nadif ta' mypy jista' jieħu aktar minn 15-il minuta. U dan kien ħafna aktar milli konna nkunu kuntenti bih. Kull ġimgħa s-sitwazzjoni marret għall-agħar hekk kif il-programmaturi komplew jiktbu kodiċi ġdid u jżidu annotazzjonijiet mal-kodiċi eżistenti. L-utenti tagħna kienu għadhom bil-ġuħ għal aktar prestazzjoni, iżda konna kuntenti li niltaqgħu magħhom nofs triq.

Iddeċidejna li nerġgħu lura għal waħda mill-ideat preċedenti dwar mypy. Jiġifieri, biex tikkonverti kodiċi Python f'kodiċi C. L-esperimentazzjoni ma 'Cython (sistema li tippermettilek tittraduċi kodiċi miktub f'Python f'kodiċi C) ma tatna l-ebda speedup viżibbli, għalhekk iddeċidejna li nqajmu l-idea li niktbu l-kompilatur tagħna stess. Peress li l-kodiċi mypy (miktub f'Python) diġà kien fih l-annotazzjonijiet tat-tip kollha meħtieġa, ħsibna li jkun utli li tipprova tuża dawn l-annotazzjonijiet biex tħaffef is-sistema. Malajr ħloqt prototip biex nittestja din l-idea. Wera żieda ta 'aktar minn 10 darbiet fil-prestazzjoni fuq diversi mikro-benchmarks. L-idea tagħna kienet li niġbru moduli Python għal moduli C bl-użu ta 'Cython, u li nbiddlu l-annotazzjonijiet tat-tip fi kontrolli tat-tip run-time (ġeneralment l-annotazzjonijiet tat-tip jiġu injorati waqt ir-run-time u jintużaw biss minn sistemi ta' verifika tat-tip). Fil-fatt ippjanajna li nittraduċu l-implimentazzjoni ta 'mypy minn Python f'lingwa li kienet iddisinjata biex tkun ittajpjata b'mod statiku, li tidher (u, fil-biċċa l-kbira tagħha, taħdem) eżattament bħal Python. (Dan it-tip ta 'migrazzjoni bejn il-lingwi saret xi ħaġa ta' tradizzjoni tal-proġett mypy. L-implimentazzjoni oriġinali ta 'mypy kienet miktuba f'Alore, imbagħad kien hemm ibridu sintattiku ta' Java u Python).

L-iffukar fuq l-API tal-estensjoni CPython kien essenzjali biex ma jintilifx il-kapaċitajiet ta 'ġestjoni tal-proġett. Ma kellniex bżonn nimplimentaw magna virtwali jew xi libreriji li mypy kellha bżonn. Barra minn hekk, xorta jkollna aċċess għall-ekosistema Python kollha u l-għodod kollha (bħal pytest). Dan fisser li nistgħu nkomplu nużaw kodiċi Python interpretat waqt l-iżvilupp, li jippermettilna nkomplu naħdmu b'mudell mgħaġġel ħafna li nagħmlu bidliet fil-kodiċi u nittestjawh, aktar milli nistennew li l-kodiċi jikkompila. Deher li konna qed nagħmlu xogħol tajjeb bilqiegħda fuq żewġ siġġijiet, biex ngħidu hekk, u nħobbu.

Il-kompilatur, li sejjaħna mypyc (peress li juża mypy bħala front-end għall-analiżi tat-tipi), irriżulta li kien proġett ta 'suċċess kbir. B'mod ġenerali, ksibna bejn wieħed u ieħor 4x speedup għal mypy runs frekwenti mingħajr caching. L-iżvilupp tal-qalba tal-proġett mypyc ħa tim żgħir ta 'Michael Sullivan, Ivan Levkivsky, Hugh Hahn, u lili nnifsi madwar 4 xhur kalendarji. Dan l-ammont ta 'xogħol kien ħafna iżgħar minn dak li kien ikun meħtieġ biex jinkiteb mill-ġdid mypy, pereżempju, f'C++ jew Go. U kellna nagħmlu ħafna inqas bidliet fil-proġett milli kieku kellna nagħmlu meta nkitbuh mill-ġdid b’lingwa oħra. Aħna nittamaw ukoll li nistgħu nġibu mypyc għal tali livell li programmaturi Dropbox oħra jistgħu jużawha biex jikkompilaw u jħaffu l-kodiċi tagħhom.

Biex niksbu dan il-livell ta 'prestazzjoni, kellna napplikaw xi soluzzjonijiet ta' inġinerija interessanti. Għalhekk, il-kompilatur jista 'jħaffef ħafna operazzjonijiet billi juża kostruzzjonijiet veloċi u ta' livell baxx C. Per eżempju, sejħa ta 'funzjoni kkompilata hija tradotta f'sejħa ta' funzjoni C. U sejħa bħal din hija ħafna aktar mgħaġġla milli ssejjaħ funzjoni interpretata. Xi operazzjonijiet, bħal tiftix fid-dizzjunarju, xorta kienu jinvolvu l-użu ta' sejħiet C-API regolari minn CPython, li kienu biss marġinalment aktar mgħaġġla meta kkompilati. Konna kapaċi neliminaw it-tagħbija addizzjonali fuq is-sistema maħluqa mill-interpretazzjoni, iżda dan f'dan il-każ ta biss qligħ żgħir f'termini ta 'prestazzjoni.

Biex nidentifikaw l-aktar operazzjonijiet "bil-mod" komuni, għamilna profiling tal-kodiċi. Armati b'din id-dejta, ippruvajna jew tweak mypyc sabiex jiġġenera kodiċi C aktar mgħaġġel għal operazzjonijiet bħal dawn, jew niktbu mill-ġdid il-kodiċi Python korrispondenti billi tuża operazzjonijiet aktar mgħaġġla (u xi kultant sempliċement ma kellniex soluzzjoni sempliċi biżżejjed għal dik jew problema oħra) . Il-kitba mill-ġdid tal-kodiċi Python spiss kienet soluzzjoni eħfef għall-problema milli li l-kompilatur iwettaq awtomatikament l-istess trasformazzjoni. Fit-tul, ridna nawtomatizzaw ħafna minn dawn it-trasformazzjonijiet, iżda dak iż-żmien konna ffukati fuq li nħaffu mypy bi sforz minimu. U meta nimxu lejn dan il-għan, naqtgħu diversi kantunieri.

Biex titkompla ...

Għeżież qarrejja! X'kienu l-impressjonijiet tiegħek tal-proġett mypy meta tgħallimt bl-eżistenza tiegħu?

It-triq għall-iċċekkjar tat-tip 4 miljun linja ta 'kodiċi Python. Parti 2
It-triq għall-iċċekkjar tat-tip 4 miljun linja ta 'kodiċi Python. Parti 2

Sors: www.habr.com

Żid kumment