Chemen pou tcheke 4 milyon liy kòd Python. Pati 2

Jodi a nou ap pibliye dezyèm pati tradiksyon materyèl sou fason Dropbox te òganize kontwòl kalite pou plizyè milyon liy kòd Python.

Chemen pou tcheke 4 milyon liy kòd Python. Pati 2

Li premye pati

Sipò ofisyèl kalite (PEP 484)

Nou te fè premye eksperyans serye nou yo ak mypy nan Dropbox pandan Hack Semèn 2014. Hack Week se yon evènman ki dire yon semèn pa Dropbox. Pandan tan sa a, anplwaye yo ka travay sou tou sa yo vle! Gen kèk nan pwojè teknoloji ki pi popilè Dropbox yo te kòmanse nan evènman tankou sa yo. Kòm rezilta eksperyans sa a, nou konkli ke mypy sanble pwomèt, byenke pwojè a poko pare pou itilize toupatou.

Nan moman sa a, lide pou estandadize sistèm sijesyon kalite Python te nan lè a. Kòm mwen te di, depi Python 3.0 li te posib yo sèvi ak anotasyon kalite pou fonksyon, men sa yo te jis ekspresyon abitrè, san yo pa defini sentaks ak semantik. Pandan ekzekisyon pwogram lan, yo te tou senpleman inyore anotasyon sa yo. Apre Hack Week, nou te kòmanse travay sou estanda semantik. Travay sa a te mennen nan aparisyon an PEP 484 (Guido van Rossum, Łukasz Langa ak mwen te kolabore sou dokiman sa a).

Motiv nou te kapab wè de kote. Premyèman, nou te espere ke tout ekosistèm Python te kapab adopte yon apwòch komen pou itilize sijesyon kalite (yon tèm yo itilize nan Python kòm ekivalan "anotasyon kalite"). Sa a, bay risk posib yo, ta pi bon pase itilize anpil apwòch mityèlman enkonpatib. Dezyèmman, nou te vle ouvètman diskite sou mekanis anotasyon kalite ak anpil manm nan kominote a Python. Dezi sa a te an pati dikte pa lefèt ke nou pa ta vle gade tankou "apostat" soti nan lide debaz yo nan lang nan je yo nan gwo mas yo nan pwogramasyon Python. Li se yon lang tape dinamik, ke yo rekonèt kòm "kanna sezisman". Nan kominote a, nan kòmansman an trè, yon atitid yon ti jan sispèk anvè lide nan sezisman estatik pa t 'kapab ede men leve. Men, santiman sa a evantyèlman diminye apre li te vin klè ke sezisman estatik pa ta dwe obligatwa (epi apre moun yo reyalize ke li te aktyèlman itil).

Sentaks tip allusion ki te adopte evantyèlman te sanble anpil ak sa mypy te sipòte nan moman an. PEP 484 te lage ak Python 3.5 nan 2015. Python pa t yon lang tape dinamik ankò. Mwen renmen panse a evènman sa a kòm yon etap enpòtan nan istwa Python.

Kòmanse nan migrasyon

Nan fen ane 2015, Dropbox te kreye yon ekip twa moun pou travay sou mypy. Yo enkli Guido van Rossum, Greg Price ak David Fisher. Soti nan moman sa a, sitiyasyon an te kòmanse devlope trè vit. Premye obstak nan kwasans mypy a se pèfòmans. Kòm mwen te allusion pi wo a, nan premye jou yo nan pwojè a mwen te panse sou tradui aplikasyon an mypy nan C, men lide sa a te travèse nan lis la pou kounye a. Nou te kole ak kouri sistèm nan lè l sèvi avèk entèprèt la CPython, ki se pa ase vit pou zouti tankou mypy. (PyPy pwojè a, yon aplikasyon altènatif Python ak yon konpilateur JIT, pa t ede nou tou.)

Erezman, kèk amelyorasyon algoritmik te vin ede nou isit la. Premye "akseleratè" pwisan an te aplikasyon an nan tcheke incrémentielle. Lide ki dèyè amelyorasyon sa a te senp: si tout depandans modil la pa chanje depi anvan mypy kouri, lè sa a nou ka itilize done yo nan kachèt pandan kouri anvan an pandan n ap travay ak depandans. Nou sèlman bezwen fè tcheke kalite sou dosye yo modifye ak sou dosye yo ki depann sou yo. Mypy menm te ale yon ti kras pi lwen: si koòdone ekstèn nan yon modil pa t 'chanje, mypy sipoze ke lòt modil ki enpòte modil sa a pa t' bezwen tcheke ankò.

Tèks incrémentielle te ede nou anpil lè annotation gwo kantite kòd ki ekziste. Pwen an se ke pwosesis sa a anjeneral enplike anpil kouri iteratif nan mypy kòm anotasyon yo piti piti ajoute nan kòd la epi piti piti amelyore. Premye kouri nan mypy te toujou trè dousman paske li te gen yon anpil nan depandans yo tcheke. Lè sa a, pou amelyore sitiyasyon an, nou aplike yon mekanis kachèt aleka. Si mypy detekte ke kachèt lokal la gen anpil chans pou yo pa dat, li telechaje snapshot kachèt aktyèl la pou tout kodbaz la soti nan depo santralize a. Lè sa a, li fè yon chèk incrémentielle lè l sèvi avèk snapshot sa a. Sa a te fè nou yon lòt gwo etap nan direksyon pou ogmante pèfòmans nan mypy.

Sa a se te yon peryòd adopsyon rapid ak natirèl nan tcheke kalite nan Dropbox. Rive nan fen 2016, nou te deja gen apeprè 420000 liy nan kòd Python ak anotasyon kalite. Anpil itilizatè yo te antouzyastik sou tip tcheke. Plis ak plis ekip devlopman te itilize Dropbox mypy.

Tout bagay te parèt byen lè sa a, men nou te toujou gen anpil bagay pou nou fè. Nou te kòmanse fè sondaj peryodik itilizatè entèn yo nan lòd yo idantifye zòn pwoblèm nan pwojè a ak konprann ki pwoblèm yo bezwen rezoud an premye (pratik sa a toujou itilize nan konpayi an jodi a). Pi enpòtan an, jan li te vin klè, se te de travay. Premyèman, nou te bezwen plis pwoteksyon kalite kòd la, dezyèmman, nou te bezwen mypy pou travay pi vit. Li te absoliman klè ke travay nou pou akselere mypy ak aplike li nan pwojè konpayi yo te toujou lwen fini. Nou, totalman konsyan de enpòtans de travay sa yo, te deside rezoud yo.

Plis pwodiktivite!

Chèk enkreman te fè mypy pi vit, men zouti a pa t toujou ase rapid. Anpil chèk incrémentielle te dire apeprè yon minit. Rezon ki fè sa a te enpòtasyon siklik. Sa a pwobableman pa pral sipriz nenpòt moun ki te travay ak gwo kodbaz ekri nan Python. Nou te gen seri dè santèn de modil, chak nan ki endirèkteman enpòte tout lòt yo. Si nenpòt fichye nan yon bouk enpòte yo te chanje, mypy te oblije trete tout fichye yo nan bouk sa a, epi souvan nenpòt modil ki enpòte modil soti nan bouk sa a. Youn nan sik sa yo se te trist "depandans mele" ki te lakòz anpil pwoblèm nan Dropbox. Yon fwa estrikti sa a genyen plizyè santèn modil, pandan ke li te enpòte, dirèkteman oswa endirèkteman, anpil tès, li te tou itilize nan kòd pwodiksyon an.

Nou te konsidere posiblite pou "debouche" depandans sikilè, men nou pat gen resous pou fè sa. Te gen twòp kòd ke nou pa te abitye ak. Kòm yon rezilta, nou te vini ak yon apwòch altènatif. Nou deside fè mypy travay byen vit menm nan prezans "depandans tangles". Nou reyalize objektif sa a lè l sèvi avèk demon mypy la. Yon daemon se yon pwosesis sèvè ki aplike de kapasite enteresan. Premyèman, li estoke enfòmasyon sou tout kodbaz la nan memwa. Sa vle di ke chak fwa ou kouri mypy, ou pa bezwen chaje done kachèt ki gen rapò ak dè milye depandans enpòte. Dezyèmman, li ak anpil atansyon, nan nivo ti inite estriktirèl, analize depandans ki genyen ant fonksyon ak lòt antite. Pou egzanp, si fonksyon an foo rele yon fonksyon bar, Lè sa a, gen yon depandans foo soti nan bar. Lè yon fichye chanje, daemon an premye, an izolasyon, trete sèlman dosye ki chanje a. Lè sa a, li gade nan chanjman deyò vizib nan dosye sa a, tankou chanje siyati fonksyon. Daemon an sèvi ak enfòmasyon detaye sou enpòtasyon sèlman pou double-tcheke fonksyon sa yo ki aktyèlman itilize fonksyon modifye a. Tipikman, ak apwòch sa a, ou dwe tcheke anpil kèk fonksyon.

Aplike tout bagay sa yo pa t fasil, depi aplikasyon mypy orijinal la te konsantre anpil sou pwosesis yon dosye nan yon moman. Nou te gen pou fè fas ak anpil sitiyasyon limit, ensidan an ki te egzije repete chèk nan ka kote yon bagay chanje nan kòd la. Pa egzanp, sa rive lè yo bay yon klas yon nouvo klas debaz. Yon fwa nou te fè sa nou te vle, nou te kapab redwi tan an ekzekisyon nan pifò chèk incrémentielle a jis kèk segonn. Sa te sanble yon gwo viktwa pou nou.

Menm plis pwodiktivite!

Ansanm ak kachèt aleka ke mwen te diskite pi wo a, mypy daemon prèske konplètman rezoud pwoblèm ki rive lè yon pwogramè souvan kouri tip tcheke, fè chanjman nan yon ti kantite dosye. Sepandan, pèfòmans sistèm nan ka itilize a pi piti favorab te toujou lwen optimal. Yon demaraj pwòp nan mypy ka pran plis pase 15 minit. Epi sa a te pi plis pase sa nou ta kontan. Chak semèn sitiyasyon an te vin pi mal lè pwogramasyon yo te kontinye ekri nouvo kòd epi ajoute annotasyon nan kòd ki egziste deja. Itilizatè nou yo te toujou grangou pou plis pèfòmans, men nou te kontan rankontre yo mwatye.

Nou deside retounen nan youn nan lide ki pi bonè konsènan mypy. Savwa, konvèti kòd Python nan kòd C. Eksperyans ak Cython (yon sistèm ki pèmèt ou tradui kòd ki ekri nan Python nan kòd C) pa te ban nou okenn vitès vizib, se konsa nou deside reviv lide nan ekri pwòp konpilatè nou an. Piske mypy kodbaz la (ekri an Python) te deja genyen tout kalite anotasyon ki nesesè yo, nou te panse li ta entérésan pou nou eseye sèvi ak anotasyon sa yo pou akselere sistèm lan. Mwen byen vit kreye yon pwototip pou teste lide sa a. Li te montre yon ogmantasyon plis pase 10 fwa nan pèfòmans sou divès kalite mikwo-referans. Lide nou an se te konpile modil Python nan modil C lè l sèvi avèk Cython, ak vire tip anotasyon nan chèk kalite exécuter (anjeneral tip anotasyon yo inyore nan tan exécuter epi yo itilize sèlman pa sistèm tcheke tip). Nou aktyèlman te planifye pou tradui aplikasyon mypy soti nan Python nan yon lang ki te fèt pou tape estatik, ki ta sanble (epi, pou pi fò, travay) egzakteman menm jan ak Python. (Sa a jan de migrasyon kwa-lang te vin tounen yon bagay nan yon tradisyon nan pwojè mypy a. Yo te ekri aplikasyon mypy orijinal la nan Alore, Lè sa a, te gen yon ibrid sentaktik nan Java ak Python).

Konsantre sou API ekstansyon CPython te kle pou pa pèdi kapasite jesyon pwojè yo. Nou pa t 'bezwen aplike yon machin vityèl oswa nenpòt bibliyotèk ke mypy bezwen. Anplis de sa, nou ta toujou gen aksè a tout ekosistèm Python ak tout zouti yo (tankou pytest). Sa vle di ke nou te kapab kontinye sèvi ak entèprete kòd Python pandan devlopman, sa ki pèmèt nou kontinye travay ak yon modèl trè vit nan fè chanjman kòd ak tès li, olye ke ap tann pou kòd la konpile. Li te sanble ke nou te fè yon bon travay nan chita sou de chèz, se konsa pale, epi nou te renmen li.

Konpilateur a, ke nou te rele mypyc (depi li itilize mypy kòm yon front-end pou analize kalite), te tounen yon pwojè ki gen anpil siksè. An jeneral, nou reyalize apeprè 4x vitès pou kouri mypy souvan san yo pa kachèt. Devlope nwayo a nan pwojè mypyc te pran yon ti ekip Michael Sullivan, Ivan Levkivsky, Hugh Hahn, ak tèt mwen sou 4 mwa kalandriye. Kantite travay sa a te pi piti anpil pase sa ki ta nesesè pou reekri mypy, pou egzanp, nan C++ oswa Go. Epi nou te oblije fè anpil mwens chanjman nan pwojè a pase nou ta dwe fè lè nou te reekri li nan yon lòt lang. Nou te espere tou ke nou ta ka pote mypyc nan yon nivo ke lòt pwogramasyon Dropbox te kapab itilize li pou konpile ak akselere kòd yo.

Pou reyalize nivo pèfòmans sa a, nou te oblije aplike kèk solisyon jeni enteresan. Kidonk, konpilatè a ka akselere anpil operasyon lè l sèvi avèk rapid, ki ba nivo konstwi C. Pou egzanp, yon apèl fonksyon konpile tradui nan yon apèl fonksyon C. Ak tankou yon apèl se pi vit pase rele yon fonksyon entèprete. Gen kèk operasyon, tankou rechèch diksyonè, toujou enplike lè l sèvi avèk apèl regilye C-API soti nan CPython, ki te sèlman yon ti kras pi vit lè konpile. Nou te kapab elimine chaj adisyonèl sou sistèm nan ki te kreye pa entèpretasyon, men sa a nan ka sa a te bay sèlman yon ti benefis an tèm de pèfòmans.

Pou idantifye operasyon ki pi komen "ralanti", nou te fè pwofil kòd. Ame ak done sa yo, nou te eseye swa ajiste mypyc pou li ta jenere kòd C pi rapid pou operasyon sa yo, oswa reekri kòd Python ki koresponn lan lè l sèvi avèk operasyon pi rapid (e pafwa nou tou senpleman pa t gen yon solisyon ase senp pou pwoblèm sa a oswa lòt pwoblèm) . Reekri kòd Python a te souvan yon solisyon pi fasil pou pwoblèm nan pase fè du otomatikman fè menm transfòmasyon. Nan tèm long la, nou te vle otomatize anpil nan transfòmasyon sa yo, men nan moman sa a nou te konsantre sou akselere mypy ak efò minim. Ak nan deplase nan direksyon pou objektif sa a, nou koupe kwen plizyè.

A kontinye…

Chè lektè! Ki enpresyon ou te genyen sou pwojè mypy a lè ou te aprann egzistans li?

Chemen pou tcheke 4 milyon liy kòd Python. Pati 2
Chemen pou tcheke 4 milyon liy kòd Python. Pati 2

Sous: www.habr.com

Add nouvo kòmantè