An cosán chun clóscríobh a dhéanamh ar 4 mhilliún líne de chód Python. Cuid 2

Inniu táimid ag foilsiú an dara cuid den aistriúchán ar ábhar faoi conas a d'eagraigh Dropbox rialú cineáil le haghaidh roinnt milliún línte de chód Python.

An cosán chun clóscríobh a dhéanamh ar 4 mhilliún líne de chód Python. Cuid 2

Léigh cuid a haon

Tacaíocht de chineál oifigiúil (PEP 484)

Rinneamar ár gcéad turgnaimh thromchúiseacha le mypy ag Dropbox le linn Seachtain Hack 2014. Is imeacht seachtaine é Hack Week arna óstáil ag Dropbox. Le linn an ama seo, is féidir le fostaithe oibriú ar cibé rud is mian leo! Cuireadh tús le cuid de na tionscadail teicneolaíochta is cáiliúla de chuid Dropbox ag imeachtaí mar seo. Mar thoradh ar an turgnamh seo, tháinig muid i gcrích go bhfuil cuma tuar dóchais inti ar mypy, cé nach bhfuil an tionscadal réidh fós le húsáid fhorleathan.

Ag an am, bhí an smaoineamh maidir le córais leid de chineál Python a chaighdeánú san aer. Mar a dúirt mé, ós rud é Python 3.0 bhí sé indéanta nótaí cineáil a úsáid le haghaidh feidhmeanna, ach ní raibh iontu seo ach nathanna treallacha, gan comhréir sainithe agus séimeantaic. Le linn feidhmiú an chláir, níor tugadh aird ar bith ar na nótaí seo den chuid is mó. Tar éis Seachtain Hack, thosaíomar ag obair ar shéimeantaic a chaighdeánú. Tháinig an obair seo chun cinn Pep 484 (Chomhoibrigh Guido van Rossum, Łukasz Langa agus mé féin ar an doiciméad seo).

D'fhéadfaí ár n-chúiseanna a fheiceáil ó dhá thaobh. Ar an gcéad dul síos, bhíomar ag súil go bhféadfadh an t-éiceachóras Python ar fad cur chuige coiteann a ghlacadh maidir le leideanna cineáil a úsáid (téarma a úsáidtear i Python mar “nótaí cineáil”). B’fhearr é seo, i bhfianaise na rioscaí a d’fhéadfadh a bheith ann, ná go leor cineálacha cur chuige nach luíonn le chéile a úsáid. Ar an dara dul síos, bhíomar ag iarraidh meicníochtaí anótála cineáil a phlé go hoscailte le go leor ball de phobal Python. Bhí an dúil seo faoi smacht go páirteach ag an bhfíric nach mbeimis ag iarraidh breathnú cosúil le “apostates” ó bhunsmaointe na teanga i súile an iliomad ríomhchláraitheoirí Python. Is teanga í clóscríofa go dinimiciúil, ar a dtugtar "clóscríobh lachan". Sa phobal, ag an tús, ní fhéadfadh dearcadh beagán amhrasach i leith an smaoineamh ar chlóscríobh statach cabhrú ach teacht chun cinn. Ach tháinig meath ar an meon sin ar ball nuair ba léir nach raibh clóscríobh statach éigeantach (agus tar éis do dhaoine a thuiscint go raibh sé úsáideach i ndáiríre).

Bhí an chomhréir leid cineál a glacadh ar deireadh an-chosúil leis an méid a thacaigh le mypy ag an am. Scaoileadh PEP 484 le Python 3.5 in 2015. Ní teanga chlóscríofa dinimiciúil a bhí i Python a thuilleadh. Is maith liom smaoineamh ar an imeacht seo mar chloch mhíle shuntasach i stair Python.

Tús na himirce

Ag deireadh 2015, chruthaigh Dropbox foireann de thriúr chun oibriú ar mypy. Ina measc bhí Guido van Rossum, Greg Price agus David Fisher. Ón nóiméad sin ar aghaidh, thosaigh an scéal ag forbairt go han-tapa. Ba é an chéad chonstaic ar fhás mypy ná feidhmíocht. Mar a luaigh mé thuas, i laethanta tosaigh an tionscadail smaoinigh mé ar an gcur i bhfeidhm mypy a aistriú go C, ach tá an smaoineamh seo trasna ón liosta le tamall anuas. Bhí muid i bhfostú leis an gcóras a rith ag baint úsáide as an ateangaire CPython, nach bhfuil tapa go leor le haghaidh uirlisí cosúil le mypy. (Níor chabhraigh an tionscadal PyPy, cur i bhfeidhm eile Python le tiomsaitheoir JIT, linn ach an oiread.)

Ar ámharaí an tsaoil, tá roinnt feabhsuithe algartamacha tar éis teacht i gcabhair orainn anseo. Ba é an chéad “luasaire” cumhachtach ná seiceáil incriminteach a chur i bhfeidhm. Bhí an smaoineamh taobh thiar den fheabhsúchán seo simplí: mura bhfuil spleáchas an mhodúil go léir athraithe ó rith mypy roimhe seo, ansin is féidir linn na sonraí a taisceadh le linn na rith roimhe sin a úsáid agus muid ag obair le spleáchais. Níor ghá dúinn ach seiceáil cineáil a dhéanamh ar na comhaid modhnaithe agus ar na comhaid a bhí ag brath orthu. Chuaigh Mypy beagán níos faide fós: mura n-athraigh comhéadan seachtrach modúil, ghlac mypy leis nach raibh gá le modúil eile a d'iompórtáil an modúl seo a sheiceáil arís.

Chuidigh seiceáil incriminteach go mór linn agus muid ag déanamh nótaí móra den chód atá ann cheana féin. Is é an pointe ná go mbíonn go leor ritheanna atriallacha de mypy i gceist leis an bpróiseas seo de réir mar a chuirtear nótaí leis an gcód de réir a chéile agus feabhsaítear iad de réir a chéile. Bhí an chéad rith de mypy fós an-mhall toisc go raibh go leor spleáchais ann le seiceáil. Ansin, chun an scéal a fheabhsú, chuireamar meicníocht chianchánach i bhfeidhm. Má bhraitheann mypy gur dócha go bhfuil an taisce áitiúil as dáta, íoslódálann sé an pictiúr taisce reatha don bhunachar cód iomlán ón stór láraithe. Ansin déanann sé seiceáil incriminteach ag baint úsáide as an pictiúr seo. Thug sé seo céim mhór amháin eile dúinn i dtreo feidhmíocht mypy a mhéadú.

Ba thréimhse é seo inar glacadh seiceáil cineáil go tapa agus go nádúrtha ag Dropbox. Faoi dheireadh 2016, bhí thart ar 420000 líne de chód Python againn cheana féin le nótaí cineáil. Bhí go leor úsáideoirí díograiseach maidir le seiceáil cineáil. Bhí níos mó agus níos mó foirne forbartha ag baint úsáide as Dropbox mypy.

Bhí cuma mhaith ar gach rud ansin, ach bhí go leor le déanamh fós againn. Thosaigh muid ag déanamh suirbhéanna úsáideoirí inmheánacha tréimhsiúla chun réimsí fadhbanna an tionscadail a aithint agus tuiscint a fháil ar na saincheisteanna is gá a réiteach ar dtús (tá an cleachtas seo fós in úsáid sa chuideachta inniu). Ba iad na cinn is tábhachtaí, mar a bhí sé soiléir, dhá thasc. Ar an gcéad dul síos, bhí níos mó clúdach cineáil den chód ag teastáil uainn, sa dara háit, bhí mypy de dhíth orainn chun oibriú níos tapúla. Bhí sé iomlán soiléir go raibh ár gcuid oibre chun mypy a bhrostú agus é a chur i bhfeidhm i dtionscadail chuideachta fós i bhfad ó bheith críochnaithe. Tuigeann muid go hiomlán an tábhacht a bhaineann leis an dá thasc seo, chun iad a réiteach.

Níos mó táirgiúlachta!

Rinne seiceálacha incriminteacha mypy níos tapúla, ach ní raibh an uirlis fós tapa go leor. Mhair go leor seiceálacha incriminteacha thart ar nóiméad. Ba é an chúis leis seo ná allmhairí timthriallacha. Is dócha nach gcuirfidh sé seo iontas ar aon duine a d'oibrigh le bunachair chóid mhóra scríofa i Python. Bhí tacair de na céadta modúl againn, agus d’allmhairigh gach ceann acu na cinn eile go hindíreach. Má athraíodh aon chomhad i lúb iompórtála, bhí ar mypy na comhaid go léir sa lúb sin a phróiseáil, agus go minic modúil ar bith a d’iompórtáil modúil ón lúb sin. Timthriall amháin den sórt sin ab ea an “tangle spleáchais” cháiliúil a chruthaigh go leor trioblóide ag Dropbox. Nuair a bhí na céadta modúl sa struchtúr seo, agus go leor tástálacha á n-allmhairiú go díreach nó go hindíreach, baineadh úsáid as freisin i gcód táirgthe.

Rinneamar breithniú ar an bhféidearthacht go bhféadfaí spleáchais chiorclacha a "dhéileáil", ach ní raibh na hacmhainní againn chun é a dhéanamh. Bhí an iomarca cód ann nach raibh muid eolach air. Mar thoradh air sin, tháinig muid suas le cur chuige eile. Shocraigh muid go n-oibreodh mypy go tapa fiú i láthair “tuillíní spleáchais”. Bhaineamar an sprioc seo amach ag baint úsáide as an deamhan mypy. Is próiseas freastalaí é deamhan a chuireann dhá ghné spéisiúla i bhfeidhm. Ar an gcéad dul síos, stórálann sé faisnéis faoin gcódbhonn iomlán i gcuimhne. Ciallaíonn sé seo gach uair a ritheann tú mypy, ní gá duit a luchtú sonraí i dtaisce a bhaineann leis na mílte de spleáchais allmhairithe. Ar an dara dul síos, déanann sé go cúramach, ar leibhéal na n-aonad struchtúrach beag, anailís ar na spleáchais idir feidhmeanna agus eintitis eile. Mar shampla, má tá an fheidhm foo glaonna feidhm bar, ansin tá spleáchas ann foo ó bar. Nuair a athraíonn comhad, ní phróiseálann an deamhan ar dtús, ina aonar, ach an comhad athraithe. Féachann sé ansin ar athruithe atá le feiceáil go seachtrach ar an gcomhad sin, amhail sínithe feidhm athraithe. Ní úsáideann an deamhan faisnéis mhionsonraithe faoi allmhairí ach chun na feidhmeanna sin a úsáideann an fheidhm mhionathraithe a sheiceáil faoi dhó. De ghnáth, leis an gcur chuige seo, caithfidh tú fíorbheagán feidhmeanna a sheiceáil.

Ní raibh sé éasca é seo ar fad a chur i bhfeidhm, toisc go raibh an cur i bhfeidhm bunaidh mypy dírithe go mór ar chomhad amháin a phróiseáil ag an am. Bhí orainn déileáil le go leor cásanna teorann, ar ghá seiceálacha arís agus arís eile a dhéanamh i gcásanna inar athraigh rud éigin sa chód. Mar shampla, tarlaíonn sé seo nuair a shanntar rang bonn nua do rang. Nuair a rinneamar an méid a bhí uainn, bhíomar in ann am forghníomhaithe na seiceálacha incriminteacha a laghdú go dtí cúpla soicind. Ba chosúil gur bua mór é seo dúinn.

Táirgiúlacht níos mó fós!

In éineacht leis an taisceadh iargúlta a phléigh mé thuas, réitigh an deamhan mypy beagnach go hiomlán na fadhbanna a thagann chun cinn nuair a ritheann ríomhchláraitheoir seiceáil cineál go minic, ag déanamh athruithe ar líon beag comhad. Mar sin féin, bhí feidhmíocht an chórais sa chás úsáide is lú fabhar fós i bhfad ó bharrmhaith. D'fhéadfadh go dtógfadh tosaithe glan mypy níos mó ná 15 nóiméad. Agus bhí sé seo i bhfad níos mó ná mar a bheadh ​​muid sásta leis. Gach seachtain chuaigh an scéal in olcas mar a lean ríomhchláraitheoirí ag scríobh cód nua agus ag cur nótaí leis an gcód a bhí ann cheana féin. Bhí ár n-úsáideoirí fós ocras le haghaidh níos mó feidhmíochta, ach bhíomar sásta bualadh leo leath bealaigh.

Shocraigh muid filleadh ar cheann de na smaointe níos luaithe maidir le mypy. Eadhon, cód Python a thiontú ina chód C. Níor thug triail a bhaint as Cython (córas a ligeann duit cód scríofa i Python a aistriú go cód C) aon luas infheicthe dúinn, agus mar sin shocraigh muid an smaoineamh a athbheochan ar ár dtiomsaitheoir féin a scríobh. Ós rud é go raibh na nótaí cineáil riachtanacha ar fad sa mypy codebase (scríofa i Python), cheapamar gurbh fhiú iarracht a dhéanamh na nótaí seo a úsáid chun an córas a bhrostú. Chruthaigh mé fréamhshamhail go tapa chun an smaoineamh seo a thástáil. Léirigh sé méadú níos mó ná 10-huaire ar fheidhmíocht ar mhicrea-thagarmharcanna éagsúla. Ba é an smaoineamh a bhí againn ná modúil Python a thiomsú go modúil C ag baint úsáide as Cython, agus nótaí cineáil a iompú ina seiceálacha cineáil ama rite (de ghnáth ní dhéantar neamhaird de nótaí cineáil ag am rite agus ní úsáidtear iad ach amháin ag córais seiceála cineáil). Bhí sé beartaithe againn i ndáiríre an cur i bhfeidhm mypy a aistriú ó Python go teanga a bhí deartha le bheith clóscríofa go statach, a bheadh ​​cosúil (agus, don chuid is mó, ag obair) díreach cosúil le Python. (Tá an cineál seo imirce tras-teanga tar éis éirí mar rud éigin de thraidisiún an tionscadail mypy. Scríobhadh an cur i bhfeidhm mypy bunaidh in Alore, ansin bhí hibrideach comhréire de Java agus Python).

Bhí sé ríthábhachtach díriú ar API síneadh CPython chun gan cumais bhainistíochta tionscadail a chailliúint. Níor ghá dúinn meaisín fíorúil nó aon leabharlanna a bhí ag teastáil ó mypy a chur i bhfeidhm. Ina theannta sin, bheadh ​​rochtain againn fós ar an éiceachóras Python ar fad agus na huirlisí go léir (cosúil le pytest). Chiallaigh sé seo go bhféadfaimis leanúint ar aghaidh ag úsáid cód Python léirmhínithe le linn forbartha, rud a ligeann dúinn leanúint ar aghaidh ag obair le patrún an-tapa chun athruithe cód a dhéanamh agus é a thástáil, seachas fanacht leis an gcód a thiomsú. Bhí an chuma ar an scéal go raibh jab iontach á dhéanamh againn ag suí ar dhá chathaoir, mar a déarfá, agus ba bhreá linn é.

D'éirigh go han-mhaith leis an tiomsaitheoir, ar a dtugamar mypyc (toisc go n-úsáideann sé mypy mar cheann tosaigh chun anailís a dhéanamh ar chineálacha). Tríd is tríd, bhaineamar amach thart ar 4x luas suas le haghaidh ritheann mypy minic gan taisce. Thóg foireann bheag Michael Sullivan, Ivan Levkivsky, Hugh Hahn, agus mé féin thart ar 4 mhí féilire chun croí an tionscadail mypyc a fhorbairt. Bhí an méid oibre seo i bhfad níos lú ná mar a bheadh ​​ag teastáil chun mypy a athscríobh, mar shampla, in C++ nó Téigh. Agus bhí orainn i bhfad níos lú athruithe a dhéanamh ar an tionscadal ná mar a bheadh ​​orainn a dhéanamh agus é á athscríobh i dteanga eile. Bhí súil againn freisin go bhféadfaimis mypyc a thabhairt go leibhéal den sórt sin go bhféadfadh ríomhchláraitheoirí Dropbox eile é a úsáid chun a gcód a thiomsú agus a bhrostú.

Chun an leibhéal feidhmíochta seo a bhaint amach, bhí orainn roinnt réitigh innealtóireachta suimiúla a chur i bhfeidhm. Mar sin, is féidir leis an tiomsaitheoir go leor oibríochtaí a bhrostú trí úsáid a bhaint as tógálacha tapa ar leibhéal íseal C. Mar shampla, aistrítear glao feidhm tiomsaithe go glao feidhm C. Agus tá glao den sórt sin i bhfad níos tapúla ná glaoch ar fheidhm léirmhínithe. Bhí baint ag roinnt oibríochtaí, mar chuardaigh foclóir, fós le húsáid ghlaonna rialta C-API ó CPython, nach raibh ach beagán níos tapúla nuair a tiomsaíodh iad. Bhí muid in ann deireadh a chur leis an ualach breise ar an gcóras cruthaithe ag léirmhíniú, ach sa chás seo thug ach gnóthachan beag i dtéarmaí feidhmíochta.

Chun na hoibríochtaí “mall” is coitianta a aithint, rinneamar próifíliú cód. Agus na sonraí seo á n-úsáid againn, rinneamar iarracht mypyc a athrú ionas go nginfeadh sé cód C níos tapúla le haghaidh oibríochtaí den sórt sin, nó an cód Python comhfhreagrach a athscríobh ag baint úsáide as oibríochtaí níos tapúla (agus uaireanta ní raibh réiteach simplí go leor againn don fhadhb sin nó fadhb eile) . Ba réiteach níos éasca ar an bhfadhb go minic é cód Python a athscríobh ná an tiomsaitheoir a dhéanamh go huathoibríoch an claochlú céanna. San fhadtéarma, bhíomar ag iarraidh go leor de na claochluithe seo a uathoibriú, ach ag an am bhíomar dírithe ar mypy a bhrostú gan mórán iarrachta. Agus muid ag bogadh i dtreo an sprioc seo, gearrthaimid roinnt coirnéil.

Le leanúint ...

Léitheoirí a chara! Cén dearcadh a bhí agat ar an tionscadal mypy nuair a fuair tú amach go raibh sé ann?

An cosán chun clóscríobh a dhéanamh ar 4 mhilliún líne de chód Python. Cuid 2
An cosán chun clóscríobh a dhéanamh ar 4 mhilliún líne de chód Python. Cuid 2

Foinse: will.com

Add a comment