Via ad typechecking 4 decies centena lineae Pythonis codicis. Pars I

Hodie in secunda parte translationis materiarum praedicamus quomodo Dropbox typum constitutum contineat per aliquot decies versus Pythonis codicem.

Via ad typechecking 4 decies centena lineae Pythonis codicis. Pars I

Read partem unum

Officialis generis subsidium (PEP CDLXXXIV)

Primum experimenta gravia deduximus cum mypylo apud Dropbox in Hack Hebdomadae 2014. Hack Hebdomada est eventus unus-septimanus, qui a Dropbox. Hoc tempore, operari possunt in quidquid volunt! Quaedam Dropbox incepta technologiae celeberrimae incohata sunt certe his similia. Ex hoc experimento conclusimus vultus mypy promittens, licet consilium nondum sit ad usum latosum paratum.

In tempore, idea typum significandi Pythonis rationum significandi in aere erat. Ut dixi, cum Python 3.0 annotationibus speciebus uti poterat pro functionibus, sed hae dictiones arbitrariae erant, sine syntaxi et semanticis definitis. In programmatis executione hae annotationes, magna ex parte, dissimulata sunt. Post Hack Hebdomadam, signare semantics opus incepimus. Hoc opus ad cessum ducitur PEP 484 (Guido van Rossum, Łukasz Langa et in hoc documento collaboravi).

Causae nostrae ex duabus partibus cognosci poterant. Primum optavimus totam Pythonis ecosystematis accessionem communem ad usus generis innuit (vocabulum in Pythone adhibitum ut instar "typei annotationes"). Hoc, periculis possibilibus, melius est quam utendo multis accessibus inter se repugnantibus. Secundo voluimus aperte disputare genus machinarum annotationem cum multis membris Pythonis communitatis. Hoc desiderium partim ex eo dictavit quod "apostatae" tamquam "apostatae" notiones fundamentales linguae in oculis latas programmatum Pythonis spectare nolumus. Lingua dynamice typus est, quae "typing anatis" appellatur. In communitate, primordio, aliquantulum suspiciosa habitus erga notionem typing statice adiuvari non potuit quin oriri posset. Sed illa sententia postea desiit postquam patuit typing statice faciendam non esse faciendam (et postquam homines intellexerunt se usui esse).

Syntaxis admonitus typus, qui tandem adoptatus est, simillimum erat illis quae mypy tempore sustentata est. PEP 484 dimissus est cum Pythone 3.5 in MMXV. Python lingua dynamica iam non erat. Huius rei notabile lapidem in Pythone historia cogitare placet.

Initium migrationis

In fine 2015, Dropbox turmam trium hominum creavit ad operandum in mypy. Comprehenderunt Guido van Rossum, Greg Pretium et David Fisher. Ex eo tempore res celerrime evolvere coeperunt. Primum impedimentum incrementi mypy effectum est. Ut supra innui, primis diebus rei cogitabam de translatione mypy exsecutionis in C, sed haec idea in indice iam transiit. Adhaesi sumus cursu systematis utentis interpretis CPythonis, quod non satis est instrumentorum sicut mypy. (PyPy consilium, jocus Python exsecutionem cum compilator JIT, nos vel non adiuvat.)

Fortunate nonnullae emendationes algorithmicae hic nobis in auxilium venerunt. Prima potens "accelerator" exsecutionem reprimendi incremental fuit. Idea post emendationem haec simplex erat: si omnes dependentiae moduli non mutatae sunt cum praecedens mypy, tunc notitia conditivo uti possumus in cursu antecedente cum dependentiis laborantibus. Tantum nobis opus est ad genus reprimendum in modificatis fasciculis et in scriniis quae in illis pendebant. Mypy etiam paulo longius processit: si interfaces externa moduli non mutatur, mypy sumpsit alios modulos qui moduli huius modi importati non essent denuo comprimendi.

Incrementa iniecta multum nobis adiuvit cum magnas moles codicis existentium annotat. Punctum est quod hic processus multae iterativae mypyiae implicare solet, sicut annotationes in codice sensim additae sunt et gradatim emendantur. Prima mypy cursus adhuc tardissimus erat quia multum clientelas ad reprimendum habebat. Deinde, ut condicionem meliorem faciamus, machinam remotam caching implevimus. Si mypy detegit cache localis verisimile esse obsole, e repositorio centrali e repositorio currente cella snapshot totius notae notificat. Tunc peragit reprehendo incrementi utens hoc snapshot. Hoc unum maius nobis gradum suscepit ad perficiendum mypy augendum.

Hoc tempus fuit rapidae et naturalis adoptionis genus annotandi apud Dropbox. Sub finem MMXVI, iam circiter 2016 lineas Pythonis codicis cum annotationibus typus habuimus. Multi utentes studiosi circa genus annotando fuerunt. Partes evolutionis magis magisque utebantur Dropbox mypy.

Omnia ergo bona vidi, sed multum adhuc facere. Usorem internum periodicum perlustrare coepimus ad cognoscendas areas quaestionis incepti et intellegendas quaenam quaestiones primum solvendae sint (hoc adhuc usu in comitatu hodierno adhuc adhibetur). Praecipuae, ut patuit, duae res erant. Primum, plus generis coverage codicis, secundo opus est mypy ad ocius operandum. Patet plane quod opus nostrum ad mypylam accelerandam et ad efficiendum illud in societatibus inceptis longe abfuit. Nos, probe novimus horum duorum operum momentum, ea solvenda esse aggressi.

Plus fructibus!

Compesculationes incrementales mypy celerius factae sunt, instrumentum autem nondum satis fixum erat. Multae litterae incrementales circa minutam duraverunt. Causa huius importationis cyclica fuit. Hoc fortasse non mirabitur quis qui magnis codicibus in Pythone scriptus est. Centenas modulorum habuimus, quarum singulae reliquae omnes oblique. Si quaevis fasciculus in ansa import mutata est, mypy processus omnes tabellas in illa ansa habuit, et saepe moduli cuiuslibet moduli ab illa ansa importati sunt. Unus talis cyclus erat infamis "dependentiae implicatio" quae multum negotii apud Dropbox effecit. Cum haec structura plures centum modulos continebat, cum multae probationes directe vel indirecte importatae essent, etiam in codice productionis usus est.

Consideravimus possibilitatem dependentiae circularis "inexhaustae", sed facultates faciendi non habuimus. Nimium erat codicem ut cum nota non fuimus. Quam ob rem cum joco accessimus. Statuimus ut mypy opus cito etiam in praesentia "tanglorum dependentiae" efficere possit. Hanc metam consecuti sumus utens mypy daemone. Daemon est processus servo, qui duas res commodas instrumentis conficit. Uno modo totum codicem basis memoriae recondit notitias. Hoc significat omne tempus quod mypy curris, non habere notitias conditas onerare ad mille clientelas importatas. Secundo diligenter, in ambitu parvarum unitas structurarum, dependentias inter munera et alia entia analyses. Ut, si foo vocat munus barergo est dependentia foo ex bar. Cum fasciculus mutatur, daemon primo, seorsum processit, fasciculus tantum mutatus. Respicit ergo externas visibiles mutationes ad illum fasciculum, sicut mutatae signaturae functionis. Daemon detailed informationem de rebus importat solum ad duplices illas functiones reprimendas quae actu modificato munere utuntur. De more, cum accessu, paucissima munera tibi inspicias.

Quae omnia exsequenda non facile fuit, cum primum exsecutio mypy originalis graviter in unum fasciculum ad tempus dispensando ferebatur. Multas in confinio adiunctis agere debebamus, quarum occursus crebros compescit in casibus in quibus aliquid in codice mutatum est. Verbi gratia, hoc fit cum novum genus turpis assignatur. Postquam id quod voluimus fecerimus, exsecutionem minuere potuimus tempus maximae incrementi ad brevi tempore. Haec quasi magna victoria nobis visa est.

Etiam plus frumenti!

Una cum remotis caching, quas supra disputavi, mypy daemonia problemata quae oriuntur cum programmator saepe in genus reprimendo currit, mutationes ad paucitatem fasciculorum facit. Attamen ratio agendi in minimis secundis usui causa longe ab optimalibus fuit. Mundus satus mypy super 15 minuta posset accipere. Et hoc multo magis quam nos fuissemus felices. Singulis hebdomadibus res peior facta est quam programmatores scribere novum codicem perseveraverunt et adnotationes ad codicem exsistendum addunt. Usores nostri adhuc plus operis esuriebant, sed laeti in medio congredi fuimus.

Placuimus referre ad unam ex antecedentibus ideis de mypy. Nempe Python codicem in C codicem converti. Experientes cum Cython (ratio quae permittit ut codicem in Pythone in C codicem scriptum interpretari) nobis celeritatis visibile non dederit, itaque notionem scribendi nostri compilatoris reviviscere decrevimus. Cum mypy codebase (in Pythone scripta) iam omnes necessarias generis adnotationes continebat, operae pretium duximus has annotationes ad systema accelerandum uti. Cito prototypum feci ut hanc notionem experiar. Plus quam 10-ovile incrementum in obeundo in variis micro-bancis ostendit. Nostra idea erat Pythonis modulorum C modulorum utendi Cythoni modulos componere, et ad genus annotationes in temporis genus compescere (plerumque annotationes in temporis spatio neglectae et solum per systema reprimendorum genus adhibita). Propositum est nos interpretari mypyam exsecutionem a Pythone in linguam quae typum stabiliri destinabatur, quod Python (et, ut plurimum opus est) prorsus similis videretur. (Hoc genus migrationis crucis-linguae aliquid e traditione mypy proiectionis factum est. Originale mypy exsecutio in Alore scripta est, tunc syntactica hybrida Javae et Pythonis facta est).

In CPython extensione API positus erat clavis ad facultatem administrationis non amittendi. Rectum machinam efficiendi vel nullas bibliothecas quae mypy opus erant, non opus erat. Praeterea volumus adhuc accedere ad totam Pythonem ecosystem et instrumenta omnia (ut pytest). Hoc significabat nos pergere posse interpretatus Python in evolutione codice utendi, sino nos pergere operando cum velocissimo exemplari faciendi codicem mutandi et experiendi, potius quam expectandi codicem componendi. Videbatur sicut nos facere magnum officium sedendi super duabus sellis, ut ita dicam, et amamus.

Compilator, quem mypyc appellavimus (quia utitur mypy ut ante-finem ad genera analysinendas), evenit ut res prospere gesta sit. Super, velocitatem circiter 4x consecuti sumus propter frequentes mypyles sine caching currit. In nucleo mypyc projecti explicans parvam turmam Michaelis Sullivan, Ivan Levkivsky, Hugonis Hahn, meque circiter 4 mensis calendarii accepit. Haec copia operis multo minor fuit quam quod mypy rescribere opus erat, exempli gratia, in C++ vel Go. Et multo pauciores mutationes rei facere debebamus quam facere debebamus cum alio sermone scribebam. Etiam speravimus nos posse mypycum eo gradu efficere ut alii programmarii Dropbox eo uti possent ad suum codicem componendum et accelerandum.

Ad hunc gradum perficiendi assequendum, solutiones opportunas nonnullas curavimus adhibere. Sic compilator plures operationes accelerare potest utendo celeriter, humili gradu C constructo. Exempli gratia, munus vocationis exaratum in munus vocationis C transfertur. Talis autem vocatio multo velocior est quam interpretatum munus vocans. Quaedam operationes, ut thesaurus speculationum, adhuc implicatae utentes regulares C-API vocat e CPython, quae tantum margine celeriores erant exaratae. Additamentum onus in systemate interpretatione creatum repellere potuimus, sed hoc in casu tantum parvum quaestum in effectu dedit.

Ad cognoscendas operationes frequentissimas "tardi", codicem profiling egimus. Hac notitia armatus, vel tweak mypyc conati sumus ut huiusmodi operationes codicem C velocius generaret, vel rescriberet congruentem codicem Pythonis operationibus velocioribus utentem (et aliquando simpliciter non habemus satis simplex solutionem illius vel alterius problematis) . Python codicem rescribere saepe facilior solutio quaestionis fuit quam cum compilator statim eandem transformationem praestare. Longo tempore multas harum mutationum automate voluimus, sed tempore minimo nisu mypyiam accelerandam sumus. Et ad hunc metam movendo plures angulos secamus.

Ut continued ...

Carissimi legentibus! Quaenam fuerunt impressiones tuae projectionis mypy cum existentiam didicisti?

Via ad typechecking 4 decies centena lineae Pythonis codicis. Pars I
Via ad typechecking 4 decies centena lineae Pythonis codicis. Pars I

Source: www.habr.com

Add a comment