דער דרך צו דרוקן 4 מיליאָן שורות פון פּיטהאָן קאָד. טייל 2

הייַנט מיר אַרויסגעבן די רגע טייל פון דער איבערזעצונג פון מאַטעריאַל וועגן ווי דראָפּבאָקס אָרגאַניזירט טיפּ קאָנטראָל פֿאַר עטלעכע מיליאָן שורות פון פּיטהאָן קאָד.

דער דרך צו דרוקן 4 מיליאָן שורות פון פּיטהאָן קאָד. טייל 2

לייענען טייל איין

אַפישאַל טיפּ שטיצן (PEP 484)

מיר האָבן דורכגעקאָכט אונדזער ערשטער ערנסט יקספּעראַמאַנץ מיט מיפּי ביי דראָפּבאָקס בעשאַס כאַק וואָך 2014. Hack Week איז אַ איין-וואָך געשעעניש כאָוסטיד דורך דראָפּבאָקס. אין דעם צייט, עמפּלוייז קענען אַרבעטן אויף וואָס זיי ווילן! עטלעכע פון ​​די מערסט באַרימט טעכנאָלאָגיע פּראַדזשעקס פון דראָפּבאָקס אנגעהויבן ביי געשעענישן ווי די. ווי אַ רעזולטאַט פון דעם עקספּערימענט, מיר געפונען אַז mypy קוקט פּראַמאַסינג, כאָטש די פּרויעקט איז נאָך נישט גרייט פֿאַר וויידספּרעד נוצן.

אין דער צייט, דער געדאַנק פון סטאַנדערדייזינג פּיטהאָן טיפּ כינטינג סיסטעמען איז געווען אין די לופט. ווי איך געזאגט, זינט Python 3.0 עס איז געווען מעגלעך צו נוצן טיפּ אַנאַטיישאַנז פֿאַר פאַנגקשאַנז, אָבער דאָס זענען נאָר אַרביטראַריש אויסדרוקן, אָן דיפיינד סינטאַקס און סעמאַנטיקס. בעשאַס פּראָגראַם דורכפירונג, די אַנאַטיישאַנז זענען, פֿאַר די רובֿ טייל, פשוט איגנאָרירט. נאָך כאַק וואָך, מיר סטאַרטעד ארבעטן אויף סטאַנדערדייזינג סעמאַנטיקס. ד י ארבע ט הא ט געפיר ט צ ו דע ר אויפקום PEP 484 (Guido van Rossum, Łukasz Langa און איך האָבן מיטאַרבעט אויף דעם דאָקומענט).

פון צוויי זייטן האט מען געקענט באטראכטן אונזערע מאטיוון. ערשטער, מיר געהאפט אַז די גאנצע פּיטהאָן יקאָוסיסטאַם קען אַדאַפּט אַ פּראָסט צוגאַנג צו נוצן טיפּ הינץ (אַ טערמין געניצט אין פּיטהאָן ווי דער עקוויוואַלענט פון "טיפּ אַנאַטיישאַנז"). דאָס, געגעבן די מעגלעך ריסקס, וואָלט זיין בעסער ווי ניצן פילע מיוטשואַלי ינקאַמפּאַטאַבאַל אַפּראָוטשיז. צווייטנס, מיר געוואלט צו אפן דיסקוטירן טיפּ אַנאָטיישאַן מעקאַניזאַמז מיט פילע מיטגלידער פון די פּיטהאָן קהל. די דאָזיקע פאַרלאַנג איז טיילווייז געווען דיקטירט דערפון, אַז מיר וועלן נישט וועלן אויסזען ווי “אַפּאָסטאַנטן” פון די גרונט-אידעען פון דער שפּראַך אין די אויגן פון די ברייטע מאסן פון פּיטהאָן-פּראָגראַםערס. עס איז אַ דינאַמיקאַללי טייפּט שפּראַך, באקאנט ווי "קאַטשקע טייפּינג". אין דער קהילה, אין די אָנהייב, אַ ביסל סאַספּישאַס שטעלונג צו דער געדאַנק פון סטאַטיק טייפּינג קען נישט העלפן אָבער אויפשטיין. אָבער דער סענטימענט יווענטשאַוואַלי וויינד נאָך עס איז געווארן קלאָר אַז סטאַטיק טייפּינג איז נישט מאַנדאַטאָרי (און נאָך מענטשן איינגעזען אַז עס איז פאקטיש נוציק).

דער טיפּ אָנצוהערעניש סינטאַקס וואָס איז יווענטשאַוואַלי אנגענומען איז געווען זייער ענלעך צו וואָס Mypy געשטיצט אין דער צייט. PEP 484 איז באפרייט מיט Python 3.5 אין 2015. פּיטהאָן איז ניט מער אַ דינאַמיש טייפּט שפּראַך. איך ווי צו טראַכטן פון דעם געשעעניש ווי אַ באַטייטיק מיילסטאָון אין פּיטהאָן געשיכטע.

אָנהייב פון מייגריישאַן

אין די סוף פון 2015, דראָפּבאָקס באשאפן אַ מאַנשאַפֿט פון דריי מענטשן צו אַרבעטן אויף מיפּי. זיי אַרייַנגערעכנט Guido van Rossum, Greg Price און David Fisher. פו ן דע ם מאמענ ט הא ט זי ך ד י לאג ע אנגעהויב ן צ ו אנטװיקל ן זי ך גאר שנעל . דער ערשטער שטערונג פֿאַר מיפּי ס וווּקס איז געווען פאָרשטעלונג. ווי איך כינטיד אויבן, אין די פרי טעג פון די פּרויעקט איך געדאַנק וועגן איבערזעצן די מיפּי ימפּלאַמענטיישאַן אין C, אָבער דער געדאַנק איז געווען קראָסט פון דער רשימה פֿאַר איצט. מיר זענען סטאַק מיט פליסנדיק די סיסטעם ניצן די CPython יבערזעצער, וואָס איז נישט שנעל גענוג פֿאַר מכשירים ווי mypy. (די PyPy פּרויעקט, אַן אַלטערנאַטיווע ימפּלאַמענטיישאַן פון Python מיט אַ JIT קאַמפּיילער, האָט אונדז אויך נישט געהאָלפֿן.)

צומ גליק, עטלעכע אַלגערידאַמיק ימפּרווומאַנץ האָבן קומען צו אונדזער הילף דאָ. דער ערשטער שטאַרק "אַקסעלעראַטאָר" איז געווען די ימפּלאַמענטיישאַן פון ינקראַמענטאַל קאָנטראָלירונג. דער געדאַנק הינטער דעם פֿאַרבעסערונג איז פּשוט: אויב אַלע די דיפּענדאַנסיז פון די מאָדולע האָבן נישט פארענדערט זינט די פריערדיקע לויפן פון mypy, מיר קענען נוצן די דאַטן קאַשט בעשאַס די פריערדיקע לויפן בשעת ארבעטן מיט דיפּענדאַנסיז. מיר נאָר דאַרפֿן צו דורכפירן טיפּ קאָנטראָלירונג אויף די מאַדאַפייד טעקעס און אויף די טעקעס וואָס אָפענגען אויף זיי. Mypy איז אפילו אַ ביסל ווייטער: אויב די פונדרויסנדיק צובינד פון אַ מאָדולע האט נישט טוישן, Mypy האָט אָנגענומען אַז אנדערע מאַדזשולז וואָס ימפּאָרטיד דעם מאָדולע דאַרף ניט זיין אָפּגעשטעלט ווידער.

ינקרעמענטאַל קאָנטראָלירונג האט געהאָלפֿן אונדז אַ פּלאַץ ווען אַנאַטייטינג גרויס אַמאַונץ פון יגזיסטינג קאָד. די פונט איז אַז דער פּראָצעס יוזשאַוואַלי ינוואַלווז פילע יטעראַטיווע ראַנז פון מיפּי, ווייַל אַנאַטיישאַנז זענען ביסלעכווייַז צוגעגעבן צו די קאָד און ביסלעכווייַז ימפּרוווד. דער ערשטער לויפן פון Mypy איז נאָך זייער פּאַמעלעך ווייַל עס האט אַ פּלאַץ פון דיפּענדאַנסיז צו קאָנטראָלירן. דערנאָך, צו פֿאַרבעסערן די סיטואַציע, מיר ימפּלאַמענאַד אַ ווייַט קאַטשינג מעקאַניזאַם. אויב mypy דיטעקץ אַז די היגע קאַש איז מסתּמא צו זיין פאַרעלטערט, עס דאַונלאָודז די קראַנט קאַש מאָמענטבילד פֿאַר די גאנצע קאָדבאַסע פֿון די סענטראַלייזד ריפּאַזאַטאָרי. דערנאָך, עס פּערפאָרמז אַ ינקראַמענטאַל טשעק מיט דעם מאָמענטבילד. דאָס האט אונדז נאָך אַ גרויס שריט צו פאַרגרעסערן די פאָרשטעלונג פון Mypy.

דאָס איז געווען אַ צייט פון גיך און נאַטירלעך אַדאַפּטיישאַן פון טיפּ קאָנטראָלירונג אין דראָפּבאָקס. אין די סוף פון 2016, מיר שוין האָבן בעערעך 420000 שורות פון פּיטהאָן קאָד מיט טיפּ אַנאַטיישאַנז. פילע יוזערז זענען ינטוזיאַסטיק וועגן טיפּ קאָנטראָלירונג. מער און מער אַנטוויקלונג טימז האָבן געוויינט Dropbox mypy.

אלץ האט דעמאלט אויסגעזען גוט, אבער מיר האבן נאך געהאט אסאך צו טאן. מיר אנגעהויבן צו דורכפירן פּעריאָדיש ינערלעך באַניצער סערווייז אין סדר צו ידענטיפיצירן פּראָבלעם געביטן פון די פּרויעקט און פֿאַרשטיין וואָס ישוז דאַרפֿן צו זיין ריזאַלווד ערשטער (דעם פיר איז נאָך געניצט אין די פירמע הייַנט). ד י װיכטיקסט ע זײנע ן , װ י ע ס אי ז געװאר ן קלאר , געװע ן צװ ײ אויפגאבן . ערשטער, מיר דאַרפֿן מער טיפּ קאַווערידזש פון די קאָד, צווייטנס, מיר דאַרפֿן מיפּי צו אַרבעטן פאַסטער. עס איז געווען לעגאַמרע קלאָר אַז אונדזער אַרבעט צו פאַרגיכערן מיפּי און ינסטרומענט עס אין פירמע פּראַדזשעקס איז נאָך ווייַט פון גאַנץ. מיר, גאָר אַווער פון די וויכטיקייט פון די צוויי טאַסקס, שטעלן זיך צו סאָלווע זיי.

מער פּראָודאַקטיוויטי!

ינקרעמענטאַל טשעקס געמאכט מיפּי פאַסטער, אָבער די געצייַג איז נאָך נישט שנעל גענוג. פילע ינקראַמענטאַל טשעקס לאַסטיד וועגן אַ מינוט. די סיבה פֿאַר דעם איז געווען סייקליקאַל ימפּאָרץ. דאָס וועט מיסטאָמע נישט יבערראַשן ווער עס יז וואָס האט געארבעט מיט גרויס קאָדעבאַסיז געשריבן אין פּיטהאָן. מיר האבן סעט פון הונדערטער מאַדזשולז, יעדער פון וואָס מינאַצאַד ימפּאָרטיד אַלע די אנדערע. אויב קיין טעקע אין אַ אַרייַנפיר שלייף איז פארענדערט, Mypy האט צו פּראָצעס אַלע די טעקעס אין דעם שלייף, און אָפט מאַדזשולז וואָס ימפּאָרטיד מאַדזשולז פון דעם שלייף. איינער אַזאַ ציקל איז געווען די פאַרנאַנט "אָפענגיקייַט פּלאָנטערן" וואָס געפֿירט אַ פּלאַץ פון קאָנפליקט אין דראָפּבאָקס. אַמאָל די סטרוקטור קאַנטיינד עטלעכע הונדערט מאַדזשולז, בשעת עס איז ימפּאָרטיד, גלייַך אָדער מינאַצאַד, פילע טעסץ, עס איז אויך געניצט אין פּראָדוקציע קאָד.

מי ר האב ן זי ך באטראכט , א ז ד י מעגלעכקײ ט פו ן ״אויםטאנגלען ״ קײלעכדיק ע אפהענגיקײטן , אבע ר מי ר האב ן ניש ט געהא ט ד י מיטלע ן דערצו . עס איז געווען צו פיל קאָד וואָס מיר זענען נישט באַקאַנט מיט. ווי אַ רעזולטאַט, מיר געקומען אַרויף מיט אַן אָלטערנאַטיוו צוגאַנג. מיר באַשלאָסן צו מאַכן מיפּי אַרבעט געשווינד אפילו אין דעם בייַזייַן פון "אָפענגיקייַט טאַנגלעס". מיר אַטשיווד דעם ציל מיט די Mypy Daemon. א דיימאַן איז אַ סערווער פּראָצעס וואָס ימפּלאַמאַנץ צוויי טשיקאַווע פֿעיִקייטן. פירסטלי, עס סטאָרז אינפֿאָרמאַציע וועגן די גאנצע קאָדבאַסע אין זכּרון. דעם מיטל אַז יעדער מאָל איר לויפן mypy, איר טאָן ניט האָבן צו לאָדן קאַשט דאַטן שייַכות צו טויזנטער פון ימפּאָרטיד דיפּענדאַנסיז. צווייטנס, ער קערפאַלי, אין דער מדרגה פון קליין סטראַקטשעראַל וניץ, אַנאַליזעס די דיפּענדאַנסיז צווישן פאַנגקשאַנז און אנדערע ענטיטיז. פֿאַר בייַשפּיל, אויב די פֿונקציע foo רופט אַ פֿונקציע bar, דעמאָלט עס איז אַ אָפענגיקייַט foo פון bar. ווען אַ טעקע ענדערונגען, דער דיימאַן ערשטער, אין אפגעזונדערטקייט, פּראַסעסאַז בלויז די טשיינדזשד טעקע. דערנאָך עס קוקט אויף ויסווייניק קענטיק ענדערונגען צו דער טעקע, אַזאַ ווי טשיינדזשד פונקציע סיגנאַטשערז. דער דיימאַן ניצט דיטיילד אינפֿאָרמאַציע וועגן ימפּאָרץ בלויז צו טאָפּל טשעק די פאַנגקשאַנז וואָס אַקשלי נוצן די מאַדאַפייד פונקציע. טיפּיקאַללי, מיט דעם צוגאַנג, איר האָבן צו קאָנטראָלירן זייער ווייניק פאַנגקשאַנז.

ימפּלאַמענטינג אַלע דעם איז נישט גרינג, ווייַל דער אָריגינעל מיפּי ימפּלאַמענטיישאַן איז געווען שווער פאָוקיסט אויף פּראַסעסינג איין טעקע אין אַ צייט. מיר האָבן צו האַנדלען מיט פילע באָרדערליין סיטואַטיאָנס, די פּאַסירונג פון וואָס פארלאנגט ריפּיטיד טשעקס אין קאַסעס ווו עפּעס געביטן אין די קאָד. פֿאַר בייַשפּיל, דאָס כאַפּאַנז ווען אַ קלאַס איז אַסיינד אַ נייַע באַזע קלאַס. אַמאָל מיר האָבן געטאן וואָס מיר געוואלט, מיר זענען ביכולת צו רעדוצירן די דורכפירונג צייט פון רובֿ ינקראַמענטאַל טשעקס צו בלויז אַ ביסל סעקונדעס. דאָס האָט אונדז אויסגעזען ווי אַ גרויסער נצחון.

אפילו מער פּראָודאַקטיוויטי!

צוזאַמען מיט די ווייַט קאַטשינג וואָס איך דיסקאַסט אויבן, די מיפּי דיימאַן כּמעט גאָר סאַלווד די פראבלעמען וואָס שטייען ווען אַ פּראָגראַמיסט אָפט לויפן טיפּ קאָנטראָלירונג, מאכן ענדערונגען צו אַ קליין נומער פון טעקעס. אָבער, סיסטעם פאָרשטעלונג אין דער קלענסטער גינציק נוצן פאַל איז נאָך ווייַט פון אָפּטימאַל. א ריין סטאַרטאַפּ פון Mypy קען נעמען איבער 15 מינוט. און דאָס איז געווען פיל מער ווי מיר וואָלט האָבן געווען צופרידן מיט. יעדער וואָך די סיטואַציע געווארן ערגער ווי פּראָוגראַמערז פאָרזעצן צו שרייַבן נייַ קאָד און לייגן אַנאַטיישאַנז צו יגזיסטינג קאָד. אונדזער ניצערס זענען נאָך הונגעריק פֿאַר מער פאָרשטעלונג, אָבער מיר זענען צופרידן צו טרעפן זיי האַלב וועג.

מיר באַשלאָסן צו צוריקקומען צו איינער פון די פריער געדאנקען וועגן מיפּי. ניימלי, צו גער פּיטהאָן קאָד אין C קאָד. עקספּערימענטינג מיט Cython (אַ סיסטעם וואָס אַלאַוז איר צו איבערזעצן קאָד געשריבן אין פּיטהאָן אין C קאָד) האט נישט געבן אונדז קיין קענטיק ספּידאַפּ, אַזוי מיר באַשלאָסן צו ופלעבן דעם געדאַנק פון שרייבן אונדזער אייגענע קאַמפּיילער. זינט די מיפּי קאָדעבאַסע (געשריבן אין פּיטהאָן) שוין קאַנטיינד אַלע די נייטיק טיפּ אַנאַטיישאַנז, מיר געדאַנק עס וואָלט זיין ווערטיק צו פּרובירן צו נוצן די אַנאַטיישאַנז צו פאַרגיכערן די סיסטעם. איך געשווינד באשאפן אַ פּראָוטאַטייפּ צו פּרובירן דעם געדאַנק. עס געוויזן אַ מער ווי 10-פאַרלייגן פאַרגרעסערן אין פאָרשטעלונג אויף פאַרשידן מיקראָ-בענטשמאַרקס. אונדזער געדאַנק איז געווען צו צונויפנעמען פּיטהאָן מאַדזשולז צו C מאַדזשולז ניצן סיטהאָן, און צו ווענדן טיפּ אַנאַטיישאַנז אין לויפן-צייט טיפּ טשעקס (יוזשאַוואַלי טיפּ אַנאַטיישאַנז זענען איגנאָרירט אין לויפן-צייט און געוויינט בלויז דורך טיפּ קאָנטראָלירונג סיסטעמען). מיר פאקטיש פּלאַננעד צו איבערזעצן די Mypy ימפּלאַמענטיישאַן פון Python אין אַ שפּראַך וואָס איז דיזיינד צו זיין סטאַטיקלי טייפּט, וואָס וואָלט קוקן (און, רובֿ, אַרבעט) פּונקט ווי Python. (דאס מין פון קרייַז-שפּראַך מיגראַטיאָן איז געווארן עפּעס פון אַ טראַדיציע פון ​​די מיפּי פּרויעקט. די אָריגינעל מיפּי ימפּלאַמענטיישאַן איז געווען געשריבן אין אַלאָרע, דעמאָלט עס איז געווען אַ סינטאַקטיק כייבריד פון דזשאַוואַ און פּיטהאָן).

פאָוקיסינג אויף די CPython פאַרלענגערונג אַפּי איז געווען שליסל צו נישט פאַרלירן פּרויעקט פאַרוואַלטונג קייפּאַבילאַטיז. מיר האָבן ניט דאַרפֿן צו ינסטרומענט אַ ווירטואַל מאַשין אָדער קיין לייברעריז וואָס Mypy דארף. אין אַדישאַן, מיר וואָלט נאָך האָבן אַקסעס צו די גאנצע פּיטהאָן יקאָוסיסטאַם און אַלע די מכשירים (אַזאַ ווי פּיטעסט). דאָס האָט מענט אַז מיר קען פאָרזעצן צו נוצן ינטערפּראַטאַד פּיטהאָן קאָד בעשאַס אַנטוויקלונג, אַלאַוינג אונדז צו פאָרזעצן ארבעטן מיט אַ זייער שנעל מוסטער פון מאכן קאָד ענדערונגען און טעסטינג עס, אלא ווי ווארטן פֿאַר די קאָד צו זאַמלען. ס'האט אויסגעזען ווי מיר טוען א גרויסע ארבעט פון זיצן אויף צוויי שטולן, אזוי צו זאגן, און מיר האבן דאס ליב.

דער קאַמפּיילער, וואָס מיר גערופן mypyc (זינט עס ניצט mypy ווי אַ פראָנט-סוף פֿאַר אַנאַלייזינג טייפּס), איז געווען אַ זייער געראָטן פּרויעקט. קוילעלדיק, מיר אַטשיווד בעערעך 4 קס ספּידאַפּ פֿאַר אָפט מיפּי ראַנז אָן קאַטשינג. דעוועלאָפּינג די האַרץ פון די Mypyc פּרויעקט גענומען אַ קליין מאַנשאַפֿט פון Michael Sullivan, Ivan Levkivsky, Hugh Hahn און זיך וועגן 4 קאַלענדאַר חדשים. די סומע פון ​​​​אַרבעט איז געווען פיל קלענערער ווי וואָס וואָלט האָבן געווען דארף צו רירייט מיפּי, למשל, אין C ++ אָדער Go. און מיר האָבן געמוזט מאַכן אַ סך ווייניקערע ענדערונגען אינעם פּראָיעקט ווי מיר וואָלטן געמוזט מאַכן בײַם איבערשרייבן עס אויף אַן אַנדער שפּראַך. מיר אויך געהאפט אַז מיר קענען ברענגען mypyc צו אַזאַ אַ מדרגה אַז אנדערע דראָפּבאָקס פּראָוגראַמערז קענען נוצן עס צו צונויפנעמען און פאַרגיכערן זייער קאָד.

צו דערגרייכן דעם מדרגה פון פאָרשטעלונג, מיר האָבן צו צולייגן עטלעכע טשיקאַווע ינזשעניעריע סאַלושאַנז. אזוי, דער קאַמפּיילער קענען פאַרגיכערן פילע אַפּעריישאַנז דורך ניצן שנעל, נידעריק-מדרגה C קאַנסטראַקשאַנז. פֿאַר בייַשפּיל, אַ צונויפגעשטעלט פֿונקציע רוף איז איבערגעזעצט אין אַ C פֿונקציע רוף. און אַזאַ אַ רופן איז פיל פאַסטער ווי רופן אַן ינטערפּראַטאַד פֿונקציע. עטלעכע אַפּעריישאַנז, אַזאַ ווי ווערטערבוך לוקאַפּס, נאָך ינוואַלווד ניצן רעגולער C-API קאַללס פֿון CPython, וואָס זענען בלויז מאַרדזשאַנאַלי פאַסטער ווען קאַמפּיילד. מיר זענען ביכולת צו עלימינירן די נאָך מאַסע אויף די סיסטעם באשאפן דורך ינטערפּריטיישאַן, אָבער דאָס אין דעם פאַל האט בלויז אַ קליין געווינס אין טערמינען פון פאָרשטעלונג.

צו ידענטיפיצירן די מערסט פּראָסט "פּאַמעלעך" אַפּעריישאַנז, מיר דורכגעקאָכט קאָד פּראָפילינג. אַרמד מיט די דאַטן, מיר פּרוּווט צו טוויק Mypyc אַזוי אַז עס וואָלט דזשענערייט פאַסטער C קאָד פֿאַר אַזאַ אַפּעריישאַנז, אָדער רירייט די קאָראַספּאַנדינג פּיטהאָן קאָד מיט פאַסטער אַפּעריישאַנז (און מאל מיר פשוט האָבן נישט אַ פּשוט גענוג לייזונג פֿאַר דעם אָדער אנדערע פּראָבלעם) . רירייטינג די פּיטהאָן קאָד איז אָפט אַ גרינגער לייזונג צו דעם פּראָבלעם ווי די קאַמפּיילער אויטאָמאַטיש דורכפירן די זעלבע טראַנספאָרמאַציע. אין די לאַנג טערמין, מיר געוואלט צו אָטאַמייט פילע פון ​​​​די טראַנספערמיישאַנז, אָבער אין דער צייט מיר זענען פאָוקיסט אויף צו פאַרגיכערן מיפּי מיט מינימאַל מי. און אין דער מאַך צו דעם ציל, מיר שנייַדן עטלעכע עקן.

צו פאָרזעצן ...

ליב לייענער! וואָס זענען דיין ימפּרעססיאָנס פון די מיפּי פּרויעקט ווען איר געלערנט פון זיין עקזיסטענץ?

דער דרך צו דרוקן 4 מיליאָן שורות פון פּיטהאָן קאָד. טייל 2
דער דרך צו דרוקן 4 מיליאָן שורות פון פּיטהאָן קאָד. טייל 2

מקור: www.habr.com

לייגן אַ באַמערקונג