Введение 4
1. Постановка задачи 6
2. Обзор предметной области 7
2.1. Python IDE 7
2.2. Обзор системы типов языка Python 9
2.3. Обзор существующих решений 13
2.4. Обзор алгоритмов вывода типов для языка Python ... 24
3. Архитектура подсистемы вывода типов 29
3.1. Требования 29
3.2. Система типов 30
3.3. Принцип работы подсистемы вывода типов 38
4. Особенности реализации подсистемы вывода типов 42
4.1. Построение графа зависимостей модулей и создание групп вывода 42
4.2. Вывод типов в рамках группы вывода 44
4.3. Алгоритм унификации с роу-полиморфизмом 55
4.4. Псевдонимы типов 58
5. Апробация решения 61
5.1. Тестирование и сравнение с аналогами 61
5.2. Внедрение 66
Заключение 68
Благодарности 70
Список литературы 71
В наши дни сложно представить разработку программного обеспечения без использования дополнительных средств, в частности интегрированных сред разработки (IDE), значительно упрощающих процесс разработки и предоставляющих большой спектр различной функциональности, например, технологии автодополнения, анализа кода, системы рефакторингов и многое другое. В качестве наиболее популярных сред разработки можно привести среду IntelliJ IDEA [1] от компании JetBrains или же Microsoft Visual Studio [2].
Неотъемлемой частью в любой среде разработки является ее кодовая модель (Code Model). На ее основе уже строится вся остальная функциональность. Компонента кодовой модели отвечает в том числе и за синтаксический анализ исходного кода языка, построение синтаксического и расширенного семантического дерева, построение различных индексов и специальных код-модельных символов.
В крупной телекоммуникационной компании было принято решение разработать собственную интегрированную среду разработки, именуемую SRC IDE (Saint Petersburg Research Center IDE). SRC IDE поддерживает язык программирования Java, а также на текущий момент идет активная разработка и добавление поддержки языка Python в силу его высокой и растущей популярности [3]. При этом стоит понимать, что SRC IDE проектируется и разрабатывается с учетом мультиязыковой составляющей: компоненты и подсистемы IDE должны обеспечивать внедрение и других языков или семейств языков.
Одной из ключевых и важных задач в подсистеме кодовой модели является вывод типов для выражений соответствующего языка, поскольку на его основе осуществляется разработка другой функциональности IDE, например, разрешения квалифицированных имен в коде и впоследствии поддержка навигации, технологии автодополнения, анализ корректности семантики до непосредственного запуска программы. Также нужно принимать во внимание тот факт, что задача вывода типов решается для языков с различными системами типизаций: статической и динамической. Однако для IDE особенно важно выводить типы статически, так как анализ кода для пользователя должен происходить до запуска самой программы.
Стоит учитывать, что язык Python имеет систему со строгой динамической типизацией, где типы определяются непосредственно в процессе работы программы, а также обладает свойством «утиной» типизации, определяющим, что атрибуты объекта в определенных случаях могут быть важнее типа самого объекта. Принимая во внимание требования со стороны IDE, в данной работе предлагается реализация статического вывода типов для языка Python с учетом его особенностей и интеграция в SRC IDE. Учитывая, что в рамках данной работы основной акцент делается на языке Python, далее вместо мультиязыковой SRC IDE будет рассматриваться Python IDE.
1. Постановка задачи
Целью выпускной квалификационной работы является реализация статического вывода типов для языка Python в рамках добавления поддержки Python в SRC IDE.
Для достижения цели были поставлены следующие задачи:
1. Изучить систему типов языка Python, а также существующие целевые решения, позволяющие статически выводить типы.
2. Рассмотреть различные подходы и алгоритмы вывода типов для языка Python, а также выбрать наиболее подходящий для дальнейшей реализации с учетом выявленных требований и ограничений.
3. На основе выбранного подхода спроектировать систему типов в рамках Python IDE, учитывающую особенности и свойства типовой системы Python.
4. Реализовать подсистему статического вывода типов, принимая во внимание особенности архитектуры Python IDE.
5. Разработать инфраструктуру тестирования и провести сравнения с аналогами.
В ходе выпускной квалификационной работы были достигнуты следующие результаты.
• Выполнен обзор предметной области:
— изучена система типов языка Python, включая ее различные подвиды, а также рассмотрены существующие целевые решения: PyCharm, Jedi и Pyright (интегрированы в IDE), Mypy и PyType (статические анализаторы);
— выявлены ключевые недостатки существующих решений, в частности, отсутствие поддержки или неполнота вывода типов для конструкций с использованием атрибутов;
— рассмотрены различные подходы и алгоритмы вывода типов с применением машинного обучения, теории вероятностей, теории унификации, системы верхних/нижних ограничений, выбран подход на основе теории унификации и системы с роу-полиморфизмом для поддержки свойства «утиной» типизации Python.
• Спроектирована система типов в рамках Python IDE с учетом вы-явленных требований, предоставляющая структурные типы с поддержкой атрибутов, параметрические и функциональные типы.
• Реализована подсистема статического вывода типов языка Python в рамках Python IDE, учитывающая вывод для типов с атрибутами, включая случаи их динамического добавления и динамические вызовы, а также параметризацию классов и функций.
• Выполнена апробация подсистемы:
— разработана инфраструктура тестирования созданной подсистемы с представлением типов в едином формате с использованием системы типов постепенной типизации;
— проведены качественные и количественные сравнения с существующими решениями PyCharm, Pyright и Jedi с использованием метрик процента типа Any, а также подсчетом раз-решенных квалифицированных имен в коде;
— реализована функциональность на стороне языкового сервера в виде отображения типов, а также произведена интеграция с подсистемой автодополнения.
По итогам полученных результатов, виден дальнейший вектор ра-боты над подсистемой статического вывода типов со следующими за-дачами:
1. Добавить полноценную поддержку типа Union в собственную типовую систему и поддержать вывод типов в случаях с возвратом из функции объектов несовместимых типов (не подтипы друг друга).
2. Добавить поддержку номинальной типизации (subtyping), учитывающую конверсию типов, то есть повышающее и понижающее приведение типов.
[1] IntelliJ IDEA IDE from JetBrains. — URL: https://www.jetbrains.com/ru-ru/idea/ (дата обращения: 15 декабря 2022 г.).
[2] Microsoft Visaul Studio. — URL: https://visualstudio.microsoft.com/ru/ (дата обращения: 15 декабря 2022 г.).
[3] Stack Overflow 2022 research on most popular programming languages.— URL: https://survey.stackoverflow.co/2022/#most-popular-technologies-language (дата обращения: 22 декабря 2022 г.).
[4] Ford Bryan.Parsing Expression Grammars: A Recognition-BasedSyntactic Foundation // Proceedings of the 31st ACM SIGPLAN- SIGACT Symposium on Principles of Programming Languages. — POPL ’04. — New York, NY, USA : Association for Computing Ma¬chinery, 2004.— P. 111-122.— URL: https://doi.org/10.1145/964001.964011.
[5] Python PEP 622: Structural Pattern Matching. — URL: https://peps.python.org/pep-0622/ (дата обращения: 16 февраля 2023 г.).
[6] Language Server Protocol from Microsoft.— URL: https://microsoft.github.io/language-server-protocol/ (дата обращения: 16 февраля 2023 г.).
[7] Python PEP 484: Type Hints.— URL: https://peps.python.org/pep-0484/ (дата обращения: 16 февраля 2023 г.).
[8] The Python Language Reference.— URL: https://docs.python.org/3/reference/ (дата обращения: 16 февраля 2023 г.).
[9] The standard Python type hierarchy. — URL: https://docs.python.org/3/reference/datamodel.html#the-standard-type-hierarchy (дата обращения: 16 февраля 2023 г.).
[10] Python PEP 483: The Theory of Type Hints. - URL: https://peps.python.org/pep-0483/ (дата обращения: 16 февраля 2023 г.).
[11] Python module typing: Support for type hints.— URL:
https://docs.python.Org/3/library/typing.html (дата
обращения: 21 марта 2023 г.).
[12] Python PEP 544: Protocols: Structural subtyping (static duck typing).— URL: https://peps.python.org/pep-0544/ (дата обращения: 21 марта 2023 г.).
[13] Python 3 Types in the Wild: A Tale of Two Type Systems / In- gkarat Rak-amnouykit, Daniel McCrevan, Ana Milanova et al. — DLS 2020.— New York, NY, USA : Association for Computing Machin¬ery, 2020.— P. 57-70.— URL: https://doi.org/10.1145/3426422.3426981.
[14] PyCharm Python IDE from JetBrains.— URL: https://www.jetbrains.com/ru-ru/pycharm/ (дата обращения: 15 декабря 2022 г.).
[15] Jedi: an awesome autocompletion, static analysis and refactor¬ing library for Python. — URL: https://jedi.readthedocs.io/en/latest/index.html (дата обращения: 21 марта 2023 г.).
[16] Pyright: static type checker for Python from Microsoft.— URL: https://github.com/microsoft/pyright (дата обращения: 21 марта 2023 г.).
[17] Mypy: a static type checker for Python.— URL: https://mypy.readthedocs.io/en/stable/index.html (дата обращения: 21 марта 2023 г.).
[18] Pytype: a static type analyzer for Python code from Google. — URL: https://google.github.io/pytype/ (дата обращения: 21 марта 2023 г.).
[19] Cui Siwei, Zhao Gang, Dai Zeyu et al. PYInfer: Deep Learning Se¬mantic Type Inference for Python Variables. — 2021. — 2106.14316.
[20] Type4Py / Amir M. Mir, Evaldas Latoskinas, Sebastian Proksch, Geor¬gios Gousios // Proceedings of the 44th International Conference on Software Engineering. — ACM, 2022. — may. — URL:
[21] Python Probabilistic Type Inference with Natural Language Support / Zhaogui Xu, Xiangyu Zhang, Lin Chen et al. — FSE 2016. — New York, NY, USA : Association for Computing Machinery, 2016. — P. 607¬618. — URL: https://doi.org/10.1145/2950290.2950343.
[22] Agesen Ole. The Cartesian Product Algorithm: Simple and Precise Type Inference Of Parametric Polymorphism // Proceedings of the 9th European Conference on Object-Oriented Programming. — ECOOP ’95.— Springer-Verlag, 1995. — P. 2-26.
[23] Bronshtein Igor. Type inference for Python programming language // Proceedings of the Institute for System Programming of RAS. — 2013. —01. —Vol. 24. —P. 161-190.
[24] Dolan Stephen, Mycroft Alan. Polymorphism, subtyping, and type inference in MLsub //ACM SIGPLAN Notices.— 2017.— 05.— Vol. 52. — P. 60-72.
[25] Parreaux Lionel. The Simple Essence of Algebraic Subtyping: Princi¬pal Type Inference with Subtyping Made Easy (Functional Pearl) // Proc. ACM Program. Lang. - 2020. - aug. - Vol. 4, no. ICFP.- 28 p. — URL: https://doi.org/10.1145/3409006.
[26] Parreaux Lionel, Chau Chun Yin. MLstruct: Principal Type Inference in a Boolean Algebra of Structural Types //Proc. ACM Program.
Lang. — 2022. —oct. — Vol. 6, no. OOPSLA2. — 30 p. — URL: https://doi.org/10.1145/3563304.
[27] Python full grammar specification.— URL: https://docs.python.org/3/reference/grammar.html (дата обращения: 19 апреля 2023 г.).
[28] StackOverflow Developer Survey 2022: Most popular tech¬nologies.— URL: https://survey.stackoverflow.co/2022/#section-most-popular-technologies-other-frameworks-and-librari((дата обращения: 26 апреля 2023 г.).