4 ሚሊዮን የፓይዘን ኮድ መስመሮችን ለመተየብ ዱካ። ክፍል 2

ዛሬ Dropbox እንዴት ለብዙ ሚሊዮን የፓይዘን ኮድ መስመሮች አይነት ቁጥጥርን እንዳደራጀ የቁሳቁስን የትርጉም ክፍል እያተምን ነው።

4 ሚሊዮን የፓይዘን ኮድ መስመሮችን ለመተየብ ዱካ። ክፍል 2

→ የመጀመሪያውን ክፍል ያንብቡ

ኦፊሴላዊ ዓይነት ድጋፍ (PEP 484)

በ 2014 Hack Week ወቅት mypy ላይ የመጀመሪያ ከባድ ሙከራዎችን አድርገናል። Hack Week በ Dropbox የሚስተናገድ የአንድ ሳምንት ክስተት ነው። በዚህ ጊዜ ውስጥ, ሰራተኞች በሚፈልጉት ላይ መስራት ይችላሉ! አንዳንድ የ Dropbox በጣም ዝነኛ የቴክኖሎጂ ፕሮጀክቶች በመሳሰሉት ዝግጅቶች ተጀምረዋል። በዚህ ሙከራ ምክንያት, ፕሮጀክቱ አሁንም በሰፊው ጥቅም ላይ ለመዋል ዝግጁ ባይሆንም, mypy ተስፋ ሰጪ ይመስላል ብለን ደመደምን.

በዚያን ጊዜ የፒቲን አይነት ፍንጭ ስርዓቶችን ደረጃውን የጠበቀ ሀሳብ በአየር ላይ ነበር. እንዳልኩት፣ ከፓይዘን 3.0 ጀምሮ ለስራ አይነት ማብራሪያዎችን መጠቀም ይቻል ነበር፣ ነገር ግን እነዚህ የዘፈቀደ አባባሎች ብቻ ነበሩ፣ ያለ አገባብ እና የትርጓሜ ትርጉም። በፕሮግራሙ አፈፃፀም ወቅት እነዚህ ማብራሪያዎች በአብዛኛው በቀላሉ ችላ ተብለዋል. ከ Hack ሳምንት በኋላ፣ የፍቺን ደረጃን በጠበቀ መልኩ መስራት ጀመርን። ይህ ሥራ ወደ መከሰት ምክንያት ሆኗል ፒፒ 484 (Guido van Rossum፣ Łukasz Langa እና እኔ በዚህ ሰነድ ላይ ተባብረናል)።

ዓላማችን በሁለት በኩል ሊታይ ይችላል። በመጀመሪያ፣ መላው የፓይዘን ስነ-ምህዳር የአይነት ፍንጮችን ለመጠቀም የተለመደ አካሄድ ሊከተል ይችላል ብለን ተስፋ አደረግን (በ Python ውስጥ “ከ “ዓይነት ማብራሪያዎች” ጋር ተመሳሳይነት ያለው ቃል)። ይህ, ሊከሰቱ ከሚችሉ አደጋዎች አንጻር, ብዙ እርስ በርስ የማይጣጣሙ አቀራረቦችን ከመጠቀም የተሻለ ይሆናል. ሁለተኛ፣ ከብዙ የፓይዘን ማህበረሰብ አባላት ጋር የአይነት ማብራሪያ ዘዴዎችን በግልፅ መወያየት እንፈልጋለን። ይህ ፍላጎት ከፊል የፒቲን ፕሮግራመሮች ሰፊው ህዝብ ዘንድ ከቋንቋው መሰረታዊ ሃሳቦች “ከሃዲዎች” መምሰል አንፈልግም በማለታችን ነው። እሱ በተለዋዋጭ የተተየበ ቋንቋ ነው፣ “ዳክዬ ትየባ” በመባል ይታወቃል። በማህበረሰቡ ውስጥ ፣ በመጀመሪያ ፣ በቋሚ ትየባ ሀሳብ ላይ በተወሰነ ደረጃ አጠራጣሪ አመለካከት ሊነሳ አልቻለም። ነገር ግን ይህ ስሜት ውሎ አድሮ የማይለዋወጥ መተየብ አስገዳጅ እንደማይሆን (እና ሰዎች በእርግጥ ጠቃሚ መሆኑን ከተረዱ በኋላ) ግልጽ ከሆነ በኋላ ቀዘቀዘ።

በመጨረሻ ተቀባይነት ያገኘው የፍንጭ አይነት አገባብ ማይፒ በወቅቱ ከሚደግፈው ጋር በጣም ተመሳሳይ ነበር። PEP 484 በ Python 3.5 በ2015 ተለቀቀ። Python ከአሁን በኋላ በተለዋዋጭ የሚተየብ ቋንቋ አልነበረም። ይህ ክስተት በፓይዘን ታሪክ ውስጥ ትልቅ ምዕራፍ እንደሆነ ማሰብ እወዳለሁ።

የስደት መጀመሪያ

እ.ኤ.አ. በ 2015 መጨረሻ ፣ Dropbox በ mypy ላይ ለመስራት የሶስት ሰዎች ቡድን ፈጠረ። ጊዶ ቫን ሮስምን፣ ግሬግ ፕራይስ እና ዴቪድ ፊሸርን ያካትታሉ። ከዚያን ጊዜ ጀምሮ, ሁኔታው ​​​​በጣም በፍጥነት ማደግ ጀመረ. ለ mypy እድገት የመጀመሪያው እንቅፋት አፈፃፀም ነበር። ከላይ እንደጠቆምኩት፣ በፕሮጀክቱ የመጀመሪያ ቀናት ውስጥ mypy ትግበራን ወደ C ለመተርጎም አስቤ ነበር ፣ ግን ይህ ሀሳብ ለአሁኑ ከዝርዝሩ ወጥቷል። እንደ mypy ላሉ መሳሪያዎች ፈጣን ያልሆነውን ሲፒቶን አስተርጓሚ በመጠቀም ስርዓቱን ከማሄድ ጋር ተጣብቀናል። (የPyPy ፕሮጀክት፣ አማራጭ የፓይዘን ትግበራ ከጂአይቲ ማቀናበሪያ ጋር፣ እኛንም አልረዳንም።)

እንደ እድል ሆኖ፣ አንዳንድ የአልጎሪዝም ማሻሻያዎች እዚህ ረድተውናል። የመጀመሪያው ኃይለኛ "አፋጣኝ" የመጨመር ፍተሻ ትግበራ ነው. ከዚህ ማሻሻያ በስተጀርባ ያለው ሀሳብ ቀላል ነበር፡ ከቀደምት የ mypy አሂድ ጀምሮ ሁሉም የሞጁሎች ጥገኞች ካልተቀየሩ ከጥገኛዎች ጋር ስንሰራ በቀድሞው ሩጫ የተሸጎጠውን ውሂብ መጠቀም እንችላለን። በተሻሻሉ ፋይሎች ላይ እና በእነሱ ላይ በተመሰረቱ ፋይሎች ላይ የዓይነት ፍተሻን ብቻ ማከናወን አለብን። ማይፒ ትንሽ ወደ ፊት ሄዷል፡ የአንድ ሞጁል ውጫዊ በይነገጽ ካልተቀየረ፣ mypy ይህን ሞጁል ያስመጡ ሌሎች ሞጁሎች እንደገና መፈተሽ አያስፈልጋቸውም ብሎ አስቦ ነበር።

ከፍተኛ መጠን ያላቸውን የነባር ኮድ ስንገልጽ ተጨማሪ ማጣራት ብዙ ረድቶናል። ነጥቡ ይህ ሂደት ብዙውን ጊዜ ብዙ ተደጋጋሚ የ mypy ሩጫዎችን ያካትታል ምክንያቱም ማብራሪያዎች ቀስ በቀስ ወደ ኮድ ሲጨመሩ እና ቀስ በቀስ እየተሻሻሉ ነው። የመጀመሪያው የ mypy ሩጫ አሁንም በጣም ቀርፋፋ ነበር ምክንያቱም ለመፈተሽ ብዙ ጥገኞች ነበረው። ከዚያም ሁኔታውን ለማሻሻል, የርቀት መሸጎጫ ዘዴን ተግባራዊ እናደርጋለን. Mypy የአካባቢው መሸጎጫ ጊዜው ያለፈበት ሊሆን እንደሚችል ካወቀ፣ አሁን ያለውን የመሸጎጫ ቅጽበታዊ ገጽ እይታ ለመላው የኮድ ቤዝ ከተማከለው ማከማቻ ያወርዳል። ከዚያ ይህን ቅጽበታዊ ገጽ እይታ በመጠቀም ተጨማሪ ፍተሻ ያደርጋል። ይህ የ mypy አፈጻጸምን ለመጨመር አንድ ተጨማሪ ትልቅ እርምጃ ወስዶብናል።

ይህ በ Dropbox ውስጥ ፈጣን እና ተፈጥሯዊ የዓይነት ፍተሻ የመቀበል ወቅት ነበር። እ.ኤ.አ. በ2016 መገባደጃ ላይ፣ ወደ 420000 የሚጠጉ የፓይዘን ኮድ መስመሮች ከአይነት ማብራሪያዎች ጋር ነበሩን። ብዙ ተጠቃሚዎች ስለ አይነት ፍተሻ ጓጉተው ነበር። ተጨማሪ እና ተጨማሪ የልማት ቡድኖች Dropbox mypy እየተጠቀሙ ነበር።

ያኔ ሁሉም ነገር ጥሩ ቢመስልም ገና ብዙ መሥራት ነበረብን። የፕሮጀክቱን ችግር አካባቢዎች ለመለየት እና ምን ጉዳዮች መጀመሪያ መፍታት እንዳለባቸው ለመረዳት በየጊዜው የውስጥ የተጠቃሚ ዳሰሳ ጥናቶችን ማካሄድ ጀመርን (ይህ አሠራር ዛሬም በኩባንያው ውስጥ ጥቅም ላይ ይውላል)። በጣም አስፈላጊው, ግልጽ ሆኖ ሲገኝ, ሁለት ተግባራት ነበሩ. በመጀመሪያ የኮዱ ተጨማሪ አይነት ሽፋን ያስፈልገናል, ሁለተኛ, በፍጥነት ለመስራት mypy ያስፈልገናል. ማይፒን ለማፋጠን እና ወደ ኩባንያ ፕሮጄክቶች የመተግበር ስራችን ገና እንዳልተጠናቀቀ ግልፅ ነበር። እኛ የእነዚህን ሁለት ተግባራት አስፈላጊነት ሙሉ በሙሉ አውቀናል, እነሱን ለመፍታት አዘጋጅተናል.

የበለጠ ምርታማነት!

ጭማሪ ፍተሻ mypy ፈጣን እንዲሆን አድርጎታል፣ ነገር ግን መሳሪያው አሁንም በቂ ፈጣን አልነበረም። ብዙ ተጨማሪ ፍተሻዎች ለአንድ ደቂቃ ያህል ቆዩ። ይህ የሆነበት ምክንያት ሳይክሊካል ከውጭ የሚገቡ ምርቶች ናቸው። ይህ ምናልባት በፓይዘን ውስጥ ከተፃፉ ትልልቅ የኮድ ቤዝዝ ጋር የሰራን ሰው ላያስደንቅ ይችላል። እያንዳንዳቸው በተዘዋዋሪ ሌሎቹን ሁሉ ከውጭ አስመጡ በመቶዎች የሚቆጠሩ ሞጁሎች ነበሩን። በማስመጣት loop ውስጥ ያለ ማንኛውም ፋይል ከተቀየረ፣ mypy በዚያ loop ውስጥ ያሉትን ሁሉንም ፋይሎች እና ብዙ ጊዜ ሞጁሎችን ከዚያ ሉፕ የሚያስገቡ ሞጁሎች ማካሄድ ነበረበት። ከእንደዚህ አይነት ዑደት አንዱ በ Dropbox ውስጥ ብዙ ችግር ያስከተለው ታዋቂው "ጥገኛነት ታንግ" ነበር. ይህ መዋቅር ብዙ መቶ ሞጁሎችን ከያዘ በኋላ፣ ከውጭ ሲገባ፣ በቀጥታም ሆነ በተዘዋዋሪ፣ ብዙ ሙከራዎች፣ በምርት ኮድ ውስጥም ጥቅም ላይ ውሏል።

የክብ ጥገኝነቶችን "መታጠፍ" የሚቻልበትን ሁኔታ ግምት ውስጥ ያስገባን, ነገር ግን ይህንን ለማድረግ የሚያስችል አቅም አልነበረንም. እኛ የማናውቀው በጣም ብዙ ኮድ ነበር። በውጤቱም, አማራጭ መንገድ ይዘን መጥተናል. "ጥገኝነት tangles" ፊት እንኳ mypy በፍጥነት እንዲሠራ ለማድረግ ወሰንን. ይህንን ግብ ማሳካት የቻልነው mypy daemon በመጠቀም ነው። ዴሞን ሁለት አስደሳች ባህሪያትን የሚተገበር የአገልጋይ ሂደት ነው። በመጀመሪያ ፣ ስለ አጠቃላይ ኮድ ቤዝ መረጃ በማህደረ ትውስታ ውስጥ ያከማቻል። ይህ ማለት ማይፒን ባሄዱ ቁጥር በሺዎች ከሚቆጠሩ ከውጭ ከሚመጡ ጥገኞች ጋር የተያያዘ የተሸጎጠ ውሂብ መጫን አያስፈልገዎትም። በሁለተኛ ደረጃ, እሱ በጥንቃቄ, በትንሽ መዋቅራዊ ክፍሎች ደረጃ, በተግባሮች እና በሌሎች አካላት መካከል ያለውን ጥገኝነት ይመረምራል. ለምሳሌ, ተግባሩ ከሆነ foo ተግባርን ይጠራል bar, ከዚያም ጥገኛ አለ foo от bar. አንድ ፋይል ሲቀየር ዳይሞን በመጀመሪያ፣ በተናጥል፣ የተቀየረውን ፋይል ብቻ ይሰራል። ከዚያ በኋላ በዚያ ፋይል ላይ እንደ የተቀየሩ ፊርማዎች ያሉ በውጫዊ የሚታዩ ለውጦችን ይመለከታል። ዴሞን ስለ ማስመጣት ዝርዝር መረጃን የሚጠቀመው የተቀየረውን ተግባር በትክክል የሚጠቀሙትን ተግባራት እንደገና ለማረጋገጥ ብቻ ነው። በተለምዶ, በዚህ አቀራረብ, በጣም ጥቂት ተግባራትን ማረጋገጥ አለብዎት.

የመጀመሪያው ማይፒ ትግበራ በአንድ ጊዜ አንድ ፋይል በማዘጋጀት ላይ ያተኮረ ስለነበር እነዚህን ሁሉ መተግበር ቀላል አልነበረም። ብዙ የድንበር ሁኔታዎችን መቋቋም ነበረብን, ይህ ክስተት በኮዱ ውስጥ የሆነ ነገር በተቀየረባቸው ጉዳዮች ላይ ተደጋጋሚ ቼኮችን ይጠይቃል. ለምሳሌ፣ ይህ የሚሆነው አንድ ክፍል አዲስ ቤዝ ክፍል ሲመደብ ነው። አንዴ የፈለግነውን ነገር ካደረግን በኋላ፣ የአብዛኞቹን ተጨማሪ ቼኮች የማስፈጸሚያ ጊዜን ወደ ጥቂት ሰከንዶች ብቻ መቀነስ ችለናል። ይህ ለእኛ ትልቅ ድል መስሎ ነበር።

የበለጠ ምርታማነት!

ከላይ ከጠቀስኩት የርቀት መሸጎጫ ጋር፣ ማይፒ ዴሞን አንድ ፕሮግራመር በተደጋጋሚ አይነት ቼክ ሲያካሂድ የሚነሱትን ችግሮች ሙሉ በሙሉ ፈትቷል፣ ይህም በትንሽ ፋይሎች ላይ ለውጥ አድርጓል። ሆኖም፣ በትንሹ ምቹ የአጠቃቀም ሁኔታ የስርዓት አፈጻጸም አሁንም እጅግ በጣም ጥሩ አልነበረም። ንጹህ የ mypy ጅምር ከ15 ደቂቃዎች በላይ ሊወስድ ይችላል። እና ይህ እኛ ደስተኛ ከምንሆንበት በላይ ነበር. ፕሮግራመሮች አዲስ ኮድ መፃፋቸውን እና በነባር ኮድ ላይ ማብራሪያዎችን ሲጨምሩ በየሳምንቱ ሁኔታው ​​​​የከፋ ሆነ። ተጠቃሚዎቻችን አሁንም ለተጨማሪ አፈጻጸም ተርበው ነበር፣ ግን በግማሽ መንገድ በማግኘታችን ደስተኞች ነን።

ማይፒን በተመለከተ ከቀደሙት ሃሳቦች ወደ አንዱ ለመመለስ ወስነናል። ማለትም የፓይዘንን ኮድ ወደ ሲ ኮድ ለመቀየር። በሳይቶን መሞከር (በፓይዘን የተፃፈውን ኮድ ወደ ሲ ኮድ እንድትተረጉም የሚያስችል ስርዓት) ምንም የሚታይ ፍጥነት አልሰጠንም፣ ስለዚህ የራሳችንን አጠናቃሪ የመፃፍ ሀሳብ ለማደስ ወስነናል። mypy codebase (በፓይዘን የተጻፈ) አስቀድሞ ሁሉንም አስፈላጊ ዓይነት ማብራሪያዎች ስለያዘ፣ ስርዓቱን ለማፋጠን እነዚህን ማብራሪያዎች ለመጠቀም መሞከሩ ጠቃሚ ነው ብለን አሰብን። ይህን ሀሳብ ለመፈተሽ በፍጥነት ፕሮቶታይፕ ፈጠርኩ። በተለያዩ ጥቃቅን መለኪያዎች ላይ ከ 10 እጥፍ በላይ የአፈፃፀም ጭማሪ አሳይቷል. ሃሳባችን ሳይቶንን በመጠቀም የፓይዘን ሞጁሎችን ወደ ሲ ሞጁሎች ማጠናቀር እና ማብራሪያዎችን ወደ የሩጫ ጊዜ አይነት ቼኮች መለወጥ ነበር (ብዙውን ጊዜ ማብራሪያዎችን በመተየብ በሩጫ ጊዜ ችላ ይባላሉ እና በአይነት ቼክ ሲስተም ብቻ ይጠቀማሉ)። የMypy አተገባበርን ከፓይዘን ወደ ስታቲስቲክስ ለመተየብ ወደተዘጋጀው፣ ልክ እንደ Python ወደሚመስለው (እና በአብዛኛው የሚሰራ) ቋንቋ ለመተርጎም አቅደናል። (ይህ አይነቱ የቋንቋ ፍልሰት የMypy ፕሮጀክት ወግ ሆኗል።የመጀመሪያው ማይፒ አተገባበር የተፃፈው በአሎሬ ነው፣ከዛም የጃቫ እና ፓይዘን አገባብ ድብልቅ ነበር)።

የፕሮጀክት አስተዳደር አቅሞችን ላለማጣት በሲፒቶን ኤክስቴንሽን ኤፒአይ ላይ ማተኮር ቁልፍ ነበር። ምናባዊ ማሽን ወይም mypy የሚፈልጓቸውን ቤተ-መጻሕፍት መተግበር አያስፈልገንም። በተጨማሪም፣ ሙሉውን የፓይዘን ስነ-ምህዳር እና ሁሉንም መሳሪያዎች (እንደ pytest ያሉ) አሁንም ድረስ ማግኘት እንችላለን። ይህ ማለት በዕድገት ወቅት የተተረጎመ የፓይዘን ኮድ መጠቀማችንን እንቀጥላለን፣ ይህም ኮድ እንዲጠናቀር ከመጠበቅ ይልቅ በጣም ፈጣን በሆነ የኮድ ለውጦችን ለማድረግ እና እሱን ለመፈተሽ ያስችለናል። በሁለት ወንበሮች ላይ ተቀምጠን ጥሩ ስራ እየሰራን ነበር ለማለት ያህል፣ ወደድነውም።

ማይፒክ ብለን የጠራነው አቀናባሪ (mypyን ለዓይነቶችን ለመተንተን የፊት ለፊት ክፍል ስለሚጠቀም) በጣም የተሳካ ፕሮጀክት ሆኖ ተገኝቷል። በአጠቃላይ፣ መሸጎጫ ሳያስፈልጋቸው ለተደጋጋሚ mypy ሩጫዎች በግምት 4x ፍጥነት አሳክተናል። የ mypyc ፕሮጄክትን ዋና አካል ማዳበር ሚካኤል ሱሊቫን ፣ ኢቫን ሌቭኪቭስኪ ፣ ሂዩ ሀን እና ራሴን ወደ 4 የቀን መቁጠሪያ ወራት ወሰደ። ይህ የስራ መጠን ማይፒን እንደገና ለመፃፍ ከሚያስፈልገው በጣም ያነሰ ነበር ለምሳሌ በC++ ወይም Go። እና በፕሮጀክቱ ላይ በሌላ ቋንቋ ስንጽፈው ልናደርገው ከምንችለው መጠን ያነሰ ለውጥ ማድረግ ነበረብን። ሌሎች የ Dropbox ፕሮግራመሮች ኮዳቸውን ለመሰብሰብ እና ለማፋጠን ሊጠቀሙበት የሚችሉትን mypyc ወደ እንደዚህ ያለ ደረጃ እንደምናመጣ ተስፋ አድርገን ነበር።

ይህንን የአፈፃፀም ደረጃ ለመድረስ አንዳንድ አስደሳች የምህንድስና መፍትሄዎችን መተግበር ነበረብን። ስለዚህ ኮምፕሌተሩ ፈጣን እና ዝቅተኛ ደረጃ ሲ ግንባታዎችን በመጠቀም ብዙ ስራዎችን ያፋጥናል ለምሳሌ የተጠናቀረ ተግባር ጥሪ ወደ C ተግባር ጥሪ ይተረጎማል። እና እንደዚህ አይነት ጥሪ የተተረጎመ ተግባርን ከመጥራት የበለጠ ፈጣን ነው. እንደ የመዝገበ-ቃላት ፍለጋ ያሉ አንዳንድ ክዋኔዎች አሁንም ከCPython መደበኛ የሲ.ፒ.አይ.አይ ጥሪዎችን በመጠቀም ይሳተፋሉ፣ ይህም ሲጠናቀር በመጠኑ ፈጣን ነበር። በትርጓሜ በተፈጠረው ስርዓት ላይ ያለውን ተጨማሪ ጭነት ማስወገድ ችለናል, ነገር ግን ይህ በአፈፃፀም ረገድ ትንሽ ትርፍ ብቻ ሰጥቷል.

በጣም የተለመዱትን "ቀርፋፋ" ስራዎችን ለመለየት, የኮድ ፕሮፋይል አደረግን. በዚህ መረጃ ታጥቀን ለእንደዚህ አይነት ስራዎች ፈጣን C ኮድ እንዲያመነጭ ወይም ማይፒክን ለማስተካከል ሞከርን ወይም ፈጣን ስራዎችን በመጠቀም ተዛማጅ የሆነውን የፓይዘን ኮድ እንደገና ለመፃፍ ሞክረናል (እና አንዳንድ ጊዜ ለዚያ ወይም ለሌላ ችግር በቂ መፍትሄ አላገኘንም) . የፓይዘንን ኮድ እንደገና መጻፍ ብዙውን ጊዜ አቀናባሪው ተመሳሳይ ለውጥ ከማድረግ ይልቅ ለችግሩ ቀላል መፍትሄ ነበር። በረጅም ጊዜ ውስጥ፣ ከእነዚህ ለውጦች ውስጥ ብዙዎቹን በራስ ሰር መስራት እንፈልጋለን፣ ነገር ግን በወቅቱ ማይፒን በትንሹ ጥረት በማፍጠን ላይ አተኩረን ነበር። እና ወደዚህ ግብ ስንሄድ, ብዙ ማዕዘኖችን ቆርጠን ነበር.

ይቀጥላል…

ውድ አንባቢዎች! ስለ ማይፒ ፕሮጀክቱ ህልውና ሲያውቁ ምን አይነት ግንዛቤዎች ነበሩዎት?

4 ሚሊዮን የፓይዘን ኮድ መስመሮችን ለመተየብ ዱካ። ክፍል 2
4 ሚሊዮን የፓይዘን ኮድ መስመሮችን ለመተየብ ዱካ። ክፍል 2

ምንጭ: hab.com

አስተያየት ያክሉ