Введение 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.
В ходе выпускной квалификационной работы были достигнуты следующие результаты.
• Выполнен обзор предметной области:
— изучена система типов языка 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-Based Syntactic Foundation // Proceedings of the 31st ACM SIGPLAN- SIGACT Symposium on Principles of Programming Languages. — POPL ’04. — New York, NY, USA : Association for Computing Machinery, 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 Machinery, 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 refactoring library for Python. — URL: https://jedi.readthedocs.io/en/ latest/index.html (дата обращения: 21 марта 2023 г.)...28