ʻO ke ala e nānā ai i nā laina 4 miliona o ka code Python. Mahele 2

I kēia lā ke paʻi nei mākou i ka ʻāpana ʻelua o ka unuhi ʻana o nā mea e pili ana i ka hoʻonohonoho ʻana o Dropbox i ka mana ʻano no nā laina miliona o ka code Python.

ʻO ke ala e nānā ai i nā laina 4 miliona o ka code Python. Mahele 2

Heluhelu i ka hapa mua

Kākoʻo ʻano kūhelu (PEP 484)

Ua alakaʻi mākou i kā mākou mau hoʻokolohua koʻikoʻi mua me mypy ma Dropbox i ka wiki Hack Week 2014. ʻO ka wiki Hack he hanana hoʻokahi pule i mālama ʻia e Dropbox. I kēia manawa, hiki i nā limahana ke hana i nā mea a lākou e makemake ai! Ua hoʻomaka kekahi o nā papahana ʻenehana kaulana loa o Dropbox ma nā hanana e like me kēia. Ma muli o kēia hoʻokolohua, ua manaʻo mākou he manaʻo maikaʻi ka mypy, ʻoiai ʻaʻole mākaukau ka papahana no ka hoʻohana ākea.

I kēlā manawa, aia ka manaʻo o ka hoʻonohonoho ʻana i nā ʻōnaehana hinting type Python i ka lewa. E like me kaʻu i ʻōlelo ai, ʻoiai ʻo Python 3.0 hiki ke hoʻohana i nā annotations type no nā hana, akā he mau ʻōlelo hoʻohālikelike wale nō kēia, me ka ʻole o ka syntax a me nā semantics. I ka wā o ka hoʻokō ʻana o ka papahana, ʻaʻole i nānā ʻia kēia mau hōʻike no ka hapa nui. Ma hope o Hack Week, ua hoʻomaka mākou e hana i ka hoʻonohonoho ʻana i nā semantics. Ua alakaʻi kēia hana i ka puka ʻana PEP 484 (Guido van Rossum, Łukasz Langa a me aʻu i hui pū ma kēia palapala).

Hiki ke ʻike ʻia ko mākou kumu mai nā ʻaoʻao ʻelua. ʻO ka mea mua, manaʻolana mākou e hiki i ke kaiaola Python holoʻokoʻa ke hoʻohana i kahi ala maʻamau i ka hoʻohana ʻana i nā ʻano hints (kahi huaʻōlelo i hoʻohana ʻia ma Python e like me ke ʻano o ka "type annotations"). ʻOi aku ka maikaʻi ma mua o ka hoʻohana ʻana i nā ala like ʻole. ʻO ka lua, makemake mākou e kūkākūkā ākea i nā ʻano hana annotation me nā lālā he nui o ke kaiāulu Python. ʻO kēia makemake i ʻōlelo ʻia e ka ʻoiaʻiʻo ʻaʻole mākou makemake e like me nā "apostates" mai nā manaʻo kumu o ka ʻōlelo i nā maka o ka lehulehu ākea o nā polokalamu polokalamu Python. He ʻōlelo hoʻopaʻa paʻa ʻia, ʻike ʻia ʻo "duck typing". I loko o ke kaiāulu, i ka hoʻomaka ʻana, ʻaʻole hiki i kahi manaʻo kānalua i ka manaʻo o ka paʻi static ke ala ʻole. Akā, ua emi iho kēlā manaʻo ma hope o ka maopopo ʻana ʻaʻole e koi ʻia ka paʻi paʻa (a ma hope o ka ʻike ʻana o ka poʻe he pono maoli ia).

ʻO ke ʻano hōʻailona hōʻailona i hoʻopaʻa ʻia ua like loa me ka mea a mypy i kākoʻo ai i kēlā manawa. Ua hoʻokuʻu ʻia ʻo PEP 484 me Python 3.5 i 2015. ʻAʻole ʻo Python kahi ʻōlelo i hoʻopaʻa ʻia. Makemake wau e noʻonoʻo i kēia hanana he mea nui i ka mōʻaukala Python.

Hoʻomaka o ka neʻe ʻana

I ka pau ʻana o 2015, ua hoʻokumu ʻo Dropbox i kahi hui o ʻekolu mau kānaka e hana ma mypy. Ua komo pū lākou me Guido van Rossum, Greg Price a me David Fisher. Mai ia manawa mai, ua hoʻomaka koke ke kūlana. ʻO ka hana keakea mua i ka ulu ʻana o mypy. E like me kaʻu i ʻōlelo ai ma luna, i nā lā mua o ka papahana ua noʻonoʻo wau e unuhi i ka hoʻokō mypy i C, akā ua kāpae ʻia kēia manaʻo mai ka papa inoa i kēia manawa. Ua paʻa mākou me ka holo ʻana i ka ʻōnaehana me ka hoʻohana ʻana i ka unuhi ʻōlelo CPython, ʻaʻole lawa ka wikiwiki no nā mea hana e like me mypy. (ʻO ka papahana PyPy, kahi hoʻokō Python ʻē aʻe me kahi compiler JIT, ʻaʻole i kōkua iā mākou.)

ʻO ka mea pōmaikaʻi, ua hiki mai kekahi mau hoʻomaikaʻi algorithmic i kā mākou kōkua ma aneʻi. ʻO ka "accelerator" ikaika mua ka hoʻokō ʻana i ka nānā ʻana. He mea maʻalahi ka manaʻo ma hope o kēia hoʻomaikaʻi: inā ʻaʻole i loli nā hilinaʻi āpau o ka module mai ka holo mua o mypy, a laila hiki iā mākou ke hoʻohana i ka ʻikepili i hūnā ʻia i ka wā o ka holo mua ʻoiai e hana ana me nā hilinaʻi. Pono mākou e hana i ka nānā ʻana i nā faila i hoʻololi ʻia a me nā faila i hilinaʻi iā lākou. Ua hele iki aku ʻo Mypy: inā ʻaʻole i loli ke kikowaena waho o kahi module, ua manaʻo ʻo mypy ʻaʻole pono e nānā hou ʻia nā modula ʻē aʻe i lawe mai i kēia module.

Ua kōkua nui ka nānā ʻana iā mākou i ka helu ʻana i nā helu nui o nā code i loaʻa. ʻO ka manaʻo, ʻo kēia kaʻina hana maʻamau e pili ana i nā holo iterative o mypy i ka hoʻohui ʻia ʻana o nā annotations i ke code a hoʻomaikaʻi mālie. Ua lohi loa ka holo mua o mypy no ka mea he nui nā hilinaʻi e nānā. A laila, no ka hoʻomaikaʻi ʻana i ke kūlana, ua hoʻokō mākou i kahi mīkini caching mamao. Inā ʻike ʻo mypy i ka pau ʻana o ka cache kūloko, hoʻoiho ʻo ia i ka snapshot cache o kēia manawa no ka codebase holoʻokoʻa mai ka waihona kikowaena. A laila hana ʻo ia i kahi hōʻoia incremental me ka hoʻohana ʻana i kēia snapshot. Ua lawe kēia iā mākou i hoʻokahi hana nui i ka hoʻonui ʻana i ka hana o mypy.

He manawa kēia o ka hoʻokomo ʻana i ka nānā ʻano ma Dropbox. Ma ka hopena o 2016, ua loaʻa iā mākou ma kahi o 420000 mau laina o ka code Python me nā ʻano annotations. Nui nā mea hoʻohana i hoihoi i ka nānā ʻana i ke ʻano. ʻOi aku ka nui o nā hui hoʻomohala e hoʻohana ana i ka Dropbox mypy.

Ua maikaʻi nā mea a pau i kēlā manawa, akā he nui kā mākou e hana ai. Ua hoʻomaka mākou e hoʻokō i nā loiloi mea hoʻohana i loko o ka manawa no ka ʻike ʻana i nā wahi pilikia o ka papahana a hoʻomaopopo i nā pilikia e pono e hoʻoholo mua ʻia (ua hoʻohana mau ʻia kēia hana i ka hui i kēia lā). ʻO ka mea nui, e like me ka mea i maopopo, ʻelua mau hana. ʻO ka mea mua, makemake mākou i ka uhi ʻana o ke code, ʻo ka lua, pono mākou i ka mypy e hana wikiwiki. Ua maopopo loa ʻo kā mākou hana e hoʻolalelale i ka mypy a hoʻokō iā ia i loko o nā papahana ʻoihana ʻaʻole i pau. Ua ʻike mākou i ke koʻikoʻi o kēia mau hana ʻelua, hoʻomaka mākou e hoʻoponopono iā lākou.

ʻOi aku ka huahana!

ʻOi aku ka wikiwiki o ka mypy, akā ʻaʻole wikiwiki ka mea hana. Hoʻokahi minuke ka lōʻihi o nā loiloi hoʻonui. ʻO ke kumu o kēia, ʻo ia ka lawe ʻana mai i ka pōʻaiapuni. ʻAʻole paha kēia e kāhāhā i ka mea i hana me nā codebases nui i kākau ʻia ma Python. Ua loaʻa iā mākou nā haneli o nā modula, i lawe ʻole ʻia kēlā me kēia i nā mea ʻē aʻe. Inā hoʻololi ʻia kekahi faila i loko o ka loop loop import, pono ʻo mypy e hoʻoponopono i nā faila a pau i kēlā loop, a pinepine i nā modula i lawe mai i nā modules mai kēlā loop. ʻO kekahi o ia pōʻaiapuni ʻo ia ka "dependency tangle" i hoʻopilikia nui ʻia ma Dropbox. I ka manawa i loaʻa i kēia ʻano he mau haneli mau modula, ʻoiai i lawe ʻia mai, pololei a i ʻole ʻole, nā hoʻāʻo he nui, ua hoʻohana pū ʻia i ka code production.

Ua noʻonoʻo mākou i ka hiki ke "wehe" i nā hilinaʻi pōʻai, akā ʻaʻole i loaʻa iā mākou nā kumuwaiwai e hana ai. Nui nā code a mākou i ʻike ʻole ai. ʻO ka hopena, ua loaʻa iā mākou kahi ala ʻē aʻe. Ua hoʻoholo mākou e hana wikiwiki i ka mypy ma ke alo o "dependency tangles". Ua hoʻokō mākou i kēia pahuhopu me ka hoʻohana ʻana i ka daemon mypy. ʻO ka daemon kahi hana kikowaena e hoʻokō i ʻelua mau hiʻohiʻona hoihoi. ʻO ka mea mua, mālama ia i ka ʻike e pili ana i ka codebase holoʻokoʻa i ka hoʻomanaʻo. ʻO ia hoʻi, i kēlā me kēia manawa āu e holo ai i ka mypy, ʻaʻole pono ʻoe e hoʻouka i ka ʻikepili huna e pili ana i nā kaukani o nā hilinaʻi i lawe ʻia mai. ʻO ka lua, nānā pono ʻo ia, ma ke kiʻekiʻe o nā ʻāpana liʻiliʻi liʻiliʻi, nānā i nā hilinaʻi ma waena o nā hana a me nā mea ʻē aʻe. No ka laʻana, inā ka hana foo kāhea i kahi hana bar, a laila aia kahi hilinaʻi foo от bar. Ke hoʻololi ʻia kahi faila, ʻo ka daemon mua, ma kahi kaʻawale, kaʻina wale i ka faila i hoʻololi ʻia. A laila e nānā i nā loli i ʻike ʻia i waho i kēlā faila, e like me ka hoʻololi ʻana i nā pūlima hana. Hoʻohana ka daemon i ka ʻike kikoʻī e pili ana i ka lawe ʻana mai e nānā pālua i kēlā mau hana i hoʻohana maoli i ka hana i hoʻololi ʻia. ʻO ka maʻamau, me kēia ala, pono ʻoe e nānā i nā hana liʻiliʻi.

ʻAʻole maʻalahi ka hoʻokō ʻana i kēia mau mea a pau, ʻoiai ʻo ka hoʻokō mypy kumu i kālele nui ʻia i ka hana ʻana i hoʻokahi faila i ka manawa. Pono mākou e hana i nā kūlana palena palena he nui, ʻo ia ka mea e koi ai i nā loiloi hou i nā hihia i hoʻololi ʻia kekahi mea i ke code. No ka laʻana, hana kēia ke hāʻawi ʻia kahi papa i kahi papa kumu hou. I ka manawa a mākou i hana ai i ka mea a mākou i makemake ai, hiki iā mākou ke hoʻemi i ka manawa hoʻokō o ka hapa nui o nā loiloi hoʻonui i nā kekona wale nō. Me he mea lā he lanakila nui kēia iā mākou.

ʻOi aku ka nui o ka huahana!

Me ka cache mamao aʻu i kamaʻilio ai ma luna, ua hoʻopau loa ka mypy daemon i nā pilikia e kū mai ana i ka wā e holo pinepine ai ka mea polokalamu polokalamu i ka nānā ʻana i ke ʻano, e hoʻololi i kahi helu liʻiliʻi o nā faila. Eia naʻe, ʻaʻole mamao loa ka hana ʻana o ka ʻōnaehana ma ka hihia hoʻohana liʻiliʻi loa mai ka maikaʻi. Hiki ke hoʻomaka maʻemaʻe o mypy ma mua o 15 mau minuke. A ʻoi aku kēia ma mua o kā mākou hauʻoli. I kēlā me kēia pule, ua ʻoi aku ka maikaʻi o ke kūlana i ka hoʻomau ʻana o nā mea papahana e kākau i nā code hou a hoʻohui i nā annotations i nā code i loaʻa. Ua pōloli ko mākou poʻe hoʻohana no ka hana hou aku, akā hauʻoli mākou e hālāwai me lākou i ka hapalua.

Ua hoʻoholo mākou e hoʻi i kekahi o nā manaʻo mua e pili ana i ka mypy. ʻO ia, e hoʻololi i ka code Python i ka code C. ʻO ka hoʻāʻo ʻana me Cython (kahi ʻōnaehana e hiki ai iā ʻoe ke unuhi i nā code i kākau ʻia ma Python i ka code C) ʻaʻole i hāʻawi iā mākou i ka wikiwiki ʻike ʻia, no laila ua hoʻoholo mākou e hoʻolaʻa i ka manaʻo o ke kākau ʻana i kā mākou compiler ponoʻī. No ka mea ua loaʻa i ka mypy codebase (i kākau ʻia ma Python) nā ʻano hoʻopuka helu āpau e pono ai, ua manaʻo mākou he mea pono ke hoʻāʻo e hoʻohana i kēia mau annotation e wikiwiki i ka ʻōnaehana. Ua hana koke au i prototype e ho'āʻo i kēia manaʻo. Ua hōʻike ʻia he piʻi aʻe ma mua o 10-fold i ka hana ma nā micro-benchmarks like ʻole. ʻO ko mākou manaʻo ʻo ka hoʻohui ʻana i nā modules Python i nā modules C me ka hoʻohana ʻana iā Cython, a e hoʻohuli i nā annotation type i nā ʻano loiloi holo-time (ʻo ka maʻamau ʻaʻole ʻike ʻia nā annotations i ka wā holo a hoʻohana wale ʻia e nā ʻōnaehana nānā ʻano). Ua hoʻolālā maoli mākou e unuhi i ka hoʻokō mypy mai Python i kahi ʻōlelo i hoʻolālā ʻia e hoʻopaʻa ʻia, e nānā (a, no ka hapa nui, hana) e like me Python. (Ua lilo kēia ʻano o ka neʻe ʻana i ka ʻōlelo keʻa i mea kuʻuna o ka papahana mypy. Ua kākau ʻia ka hoʻokō mypy kumu ma Alore, a laila aia kahi syntactic hybrid o Java a me Python).

ʻO ka nānā ʻana i ka API hoʻonui CPython ke kī i ka nalowale ʻole o ka mana hoʻokele papahana. ʻAʻole pono mākou e hoʻokō i kahi mīkini virtual a i ʻole nā ​​hale waihona puke i makemake ʻia e mypy. Eia hou, hiki iā mākou ke komo i ka kaiaola Python holoʻokoʻa a me nā mea hana āpau (e like me ka pytest). ʻO ia ka mea hiki iā mākou ke hoʻomau i ka hoʻohana ʻana i ka code Python i unuhi ʻia i ka wā o ka hoʻomohala ʻana, e ʻae iā mākou e hoʻomau i ka hana me kahi ʻano wikiwiki loa o ka hoʻololi ʻana i nā code a hoʻāʻo iā ia, ma mua o ke kali ʻana i ke code e hōʻuluʻulu. Me he mea lā e hana maikaʻi ana mākou i ka noho ʻana ma nā noho ʻelua, no laila, makemake mākou.

ʻO ka mea hōʻuluʻulu, a mākou i kapa ai ʻo mypyc (no ka mea, hoʻohana ʻo ia i ka mypy ma ke ʻano he mua no ka nānā ʻana i nā ʻano), ua lilo ia i papahana kūleʻa loa. Ma ka holoʻokoʻa, ua loaʻa iā mākou ma kahi o 4x ka wikiwiki no ka holo pinepine ʻana o ka mypy me ka ʻole o ka caching. ʻO ka hoʻomohala ʻana i ke kumu o ka papahana mypyc i lawe i kahi hui liʻiliʻi o Michael Sullivan, Ivan Levkivsky, Hugh Hahn, a me aʻu iho ma kahi o 4 mau mahina kalena. ʻOi aku ka liʻiliʻi o kēia nui o ka hana ma mua o ka mea e pono ai ke kākau hou i ka mypy, no ka laʻana, ma C++ a i ʻole Go. A pono mākou e hoʻololi liʻiliʻi i ka papahana ma mua o kā mākou hana ʻana i ke kākau hou ʻana iā ia ma ka ʻōlelo ʻē aʻe. Manaʻolana mākou e hiki iā mākou ke lawe i ka mypyc i kahi pae e hiki ai i nā mea polokalamu Dropbox ʻē aʻe ke hoʻohana iā ia e hōʻuluʻulu a wikiwiki i kā lākou code.

No ka hoʻokō ʻana i kēia pae o ka hana, pono mākou e hoʻopili i kekahi mau ʻenehana ʻenehana hoihoi. No laila, hiki i ka mea hōʻuluʻulu ke hoʻoikaika i nā hana he nui me ka hoʻohana ʻana i ka wikiwiki, haʻahaʻa haʻahaʻa C constructs. A ʻoi aku ka wikiwiki o kēlā kelepona ma mua o ke kāhea ʻana i kahi hana i unuhi ʻia. Ke hoʻohana nei kekahi mau hana, e like me ka ʻimi puke wehewehe ʻōlelo, me ka hoʻohana ʻana i nā kelepona C-API maʻamau mai CPython, ʻoi aku ka wikiwiki o ka wā i hōʻuluʻulu ʻia. Ua hiki iā mākou ke hoʻopau i ka ukana hou ma ka ʻōnaehana i hana ʻia e ka wehewehe ʻana, akā ʻo kēia i kēia hihia i hāʻawi wale i kahi waiwai liʻiliʻi ma ke ʻano o ka hana.

No ka ʻike ʻana i nā hana "lohi" maʻamau, ua hana mākou i ka code profiling. Hoʻopili ʻia me kēia ʻikepili, ua hoʻāʻo mākou e hoʻololi i ka mypyc i mea e hoʻohua ai i ka code C wikiwiki no ia mau hana, a i ʻole kākau hou i ka code Python e pili ana me ka hoʻohana ʻana i nā hana wikiwiki (a i kekahi manawa ʻaʻole i loaʻa iā mākou kahi hopena maʻalahi no kēlā a i ʻole pilikia ʻē aʻe) . ʻO ka kākau hou ʻana i ka code Python he mea maʻalahi ia i ka pilikia ma mua o ka hana ʻana o ka compiler i ka hoʻololi like. I ka wā lōʻihi, makemake mākou e hoʻokaʻawale i nā mea he nui o kēia mau hoʻololi, akā i ka manawa ua kālele mākou i ka wikiwiki ʻana i ka mypy me ka hoʻoikaika liʻiliʻi. A i ka neʻe ʻana i kēia pahuhopu, ʻoki mākou i kekahi mau kihi.

E hoʻomau 'ia…

E nā mea heluhelu aloha! He aha kāu mau manaʻo no ka papahana mypy i kou ʻike ʻana i kona ola ʻana?

ʻO ke ala e nānā ai i nā laina 4 miliona o ka code Python. Mahele 2
ʻO ke ala e nānā ai i nā laina 4 miliona o ka code Python. Mahele 2

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka