Тип работы:
Предмет:
Язык работы:


Система модификации структуры исходного кода для интегрированных сред разработки

Работа №126656

Тип работы

Бакалаврская работа

Предмет

информационные системы

Объем работы66
Год сдачи2023
Стоимость4260 руб.
ПУБЛИКУЕТСЯ ВПЕРВЫЕ
Просмотрено
20
Не подходит работа?

Узнай цену на написание


Введение 4
1. Постановка задачи 6
2. Обзор предметной области 7
2.1. Платформа SRC IDE 7
2.2. Построение и модификация PSI 13
2.3. Преобразование исходного документа 24
3. Требования 26
3.1. Функциональные требования 26
3.2. Нефункциональные требования 28
4. Архитектура 29
5. Особенности реализации 36
5.1. Генератор внешнего интерфейса 36
5.2. Модификация PSI-дерева и исходного
документа 44
6. Апробация системы 56
6.1. Метрика 56
6.2. Использование в рамках Python IDE 57
6.3. Использование системы в рамках Java IDE 58
6.4. Выводы 59
Заключение 60
Благодарности 62
Список литературы 63


Интегрированная среда разработки (Integrated Development Environment, IDE) является неотъемлемым инструментом любого программиста. Пожалуй, самыми известными средами разработки являются IntelliJ IDEA (JetBrains) [1] и Visual Studio (Microsoft) [2], которые предлагают большое количество сервисов для помощи в создании качественного программного обеспечения.
Одной из наиболее важных задач IDE является возможность быстро и корректно дополнять и исправлять исходный код программы. Для этого среда разработки предоставляет различные виды рефакторинга (refactorings) [3], а также сервисы быстрых исправлений (quick fixes) [4]. Рефакторинг делает возможным перестроить код с сохранением его се-мантики, например, переименовать класс, метод и атрибут (rename [5]), извлечь выделенный код в метод (extract method [6]) и др. Быстрое исправление позволяет по желанию пользователя устранить недостаток некоторого фрагмента кода, например, упростить условный оператор (simplify if statement).
Данные сервисы работают со структурой программы, анализируя и перестраивая её. Традиционно, внутренним представлением программы является абстрактное синтаксическое дерево (Abstract Syntax Tree, AST [7]), которое строится в результате синтаксического разбора про-граммы (parsing). Но кроме этого данным сервисам требуется дополнительная семантическая информация (например, по вхождению метода или атрибута определить его описание), и эту информацию также удобно было бы сохранять в синтаксическом дереве. Поэтому IDE на основе AST строит другое дерево, которое дает внешним клиентам (сер-висам IDE) доступ к такой информации о программе. В IntelliJ IDEA это дерево называется Program Structure Interface (PSI) [8, 9]. Данное название используется в текущей выпускной квалификационной работе. Таким образом дерево PSI хранит дополнительную семантическую информацию о программе и предоставляет клиентам многофункциональный программный интерфейс для доступа к ней (API), а дерево AST является деталью реализации.
PSI-дерево является типизированным — каждый его узел имеет свой тип сообразно синтаксической конструкции языка, которую этот узел представляет, в рамках типовой системы языка программирования, на котором это дерево создается. Например, в контексте языка Java каждый PSI-узел определяется своим классом (PsiFunction, PsiClass и т. д.) [10].
Сервисы IDE, после манипуляций с PSI, переносят изменения про-граммы в её исходный текст с тем, чтобы эти изменения стали видны пользователю. Для этого на основе изменений дерева формируются текстовые изменения, которые затем применяются к исходному тексту.
Как было указано выше, PSI-дерево является типизированным. Это удобно для разработчиков IDE, однако типы в таком дереве надо описать. Если IDE, например, разрабатывается на языке Java, то для до-ступа к соответствующим узлам дерева потребуется создать большое количество интерфейсов и классов [10]. Создание такого кода является очень трудоёмким из-за большого количества типов и чревато ошибками. По этой причине целесообразно использовать генеративный подход, т.е. на основе заранее созданной спецификации типов синтаксических конструкций языка программирования автоматически генерировать классы и интерфейсы доступа к узлам PSI-дерева.
В рамках Saint-Petersburg Research Center разрабатывается мультиязыковая платформа SRC IDE, предназначенная для разработки IDE различных языков программирования. В частности, на основе этой плат-формы в настоящий момент создаются IDE для Java и Python.
Для этой платформы SRC IDE важно иметь единую подсистему работы со структурой исходного кода программы. Для каждой конкретной IDE требуется свое PSI-дерево и средства для манипуляции с ним, а также компонента для отображения изменений в документе. Но принципы генерации интерфейсов доступа к PSI-дереву являются общими и могут быть реализованы в рамках платформы и повторно использованы в различных IDE.
1. Постановка задачи
Целью данной выпускной квалификационной работы является разработка подсистемы модификации структуры программы с генерируемым внешним интерфейсом в контексте мультиязыковой платформы, предназначенной для создания сред разработки (IDEs).
Для её достижения были поставлены следующие задачи.
1. Провести обзор предметной области — платформы SRC IDE, подходов к построению PSI-дерева и средств для его модификации, алгоритмов получения текстовых изменений.
2. Сформулировать требования к подсистеме.
3. Спроектировать механизм преобразований PSI-дерева и исходного документа, а также генератора классов и интерфейсов.
4. Реализовать генерацию внешних интерфейсов и классов для работы с системой модификации PSI-дерева.
5. Выполнить реализацию подсистемы преобразований PSI-дерева и исходного документа.
6. Апробировать созданную подсистему в контексте создания средств рефакторинга и быстрых исправлений.


Возникли сложности?

Нужна помощь преподавателя?

Помощь в написании работ!


В ходе выпускной квалификационной работы были достигнуты сле-дующие результаты.
• Выполнен обзор предметной области:
— изучена текущая платформа SRC IDE;
— рассмотрены механизмы модификации PSI-дерева: изменяемое дерево, неизменяемое дерево через Rewriter, а также персистентное дерево с Rewriter, разработанное Microsoft, которое и было выбрано;
— рассмотрены подходы для получения текстовых изменений: RTED, ChangeDistiller, GumTree. Был выбран подход GumTree с учетом особенностей SRC IDE.
• Сформулированы функциональные и нефункциональные требования к подсистеме, в рамках которых производились проектирование архитектуры и реализация.
• Спроектирована архитектура генератора классов и интерфейсов, механизма преобразований над PSI-деревом и исходным документом (Java/IntelliJ IDEA).
• Реализована генерация необходимых интерфейсов и классов языка Java для системы модификации PSI-дерева на основе спецификации в формате JSON.
• Реализованы механизм модификации дерева в виде персистентного дерева и Rewriter-а и механизм получения текстовых изменений в виде алгоритма GumTree.
• Выполнена апробация в рамках написания подсистем рефакторингов и исправлений кода в средах разработки для Java и Python.
Результаты данной работы были приняты для публикации в Proceedings of ISP RAS и для защиты на конференции SYRCoSE 2023 (г. Пенза).



[1] IntelliJ IDEA.— URL: https://www.jetbrains.com/idea/ (дата обращения: 27 марта 2023 г.).
[2] Visual Studio.— URL: https://visualstudio.microsoft.com/(дата обращения: 27 марта 2023 г.).
[3] Refactorings.— URL: https://www.jetbrains.com/help/idea/tutorial-introduction-to-refactoring.html (дата обращения: 27 марта 2023 г.).
[4] Quick Fixes.— URL: https://www.jetbrains.com/help/rider/
Code_Analysis Quick-Fixes.html (дата обращения: 27 марта
2023 г.).
[5] Rename Refactoring.— URL: https://www.jetbrains.com/help/idea/rename-refactorings.html (дата обращения: 27 марта 2023 г.).
[6] Extract Method Refactoring.— URL: https://www.jetbrains.com/help/idea/extract-method.html (дата обращения: 27 марта 2023 г.).
[7] Alfred V. Aho Ravi. Sethi Jeffrey D. Ullman. Compilers: Principles, Techniques, and Tools. — 1986. — P. 69-70.
[8] Program Structure Interface.— URL: https://plugins.jetbrains.com/docs/intellij/psi.html (дата обращения: 27 марта 2023 г.).
[9] The IntelliJ Platform: A Framework for Building Plugins and MiningSoftware Data/ Zarina Kurbatova, Yaroslav Golubev, Vladimir Ko¬valenko, Timofey Bryksin // 2021 36th IEEE/ACM International Con-ference on Automated Software Engineering Workshops (ASEW).— 2021. — P. 14-17.
[10] IntelliJ Community Github: PSI.— URL: https://github.com/JetBrains/intellij-community/tree/master/java/java-psi-api/src/com/intellij/psi (дата обращения: 27 марта 2023 г.).
[11] Protocol Buffers. — URL: https://protobuf.dev/ (дата обращения: 26 апреля 2023 г.).
[12] FlatBuffers.— URL: https://github.com/google/flatbuffers(дата обращения: 26 апреля 2023 г.).
[13] Spring Data JPA.— URL: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ (дата обращения: 29 апреля 2023 г.).
[14] Microsoft Visual Studio Code. — URL: https://code.visualstudio.com/ (дата обращения: 25 апреля 2023 г.).
[15] Language Server Protocol Overview.— URL: https://microsoft.github.io/language-server-protocol/overviews/lsp/overview/(дата обращения: 18 декабря 2022 г.).
[16] Codenvy.— URL: https://github.com/codenvy/codenvy(дата обращения: 25 апреля 2023 г.).
[17] Red Hat.— URL: https://www.redhat.com/en(дата обращения: 25 апреля 2023 г.).
[18] Eclipse Che.— URL: https://www.eclipse.org/che/ (дата обращения: 25 апреля 2023 г.).
[19] Eclipse Cloud Development.— URL: https://ecdtools.eclipse.org/ (дата обращения: 25 апреля 2023 г.).
[20] Java support for Visual Studio Code.— URL: https://github.com/redhat-developer/vscode-java(дата обращения: 25 апреля 2023 г.).
[21] Eclipse JDT Language Server.— URL: https://github.com/eclipse/eclipse.jdt.ls (дата обращения: 25 апреля 2023 г.).
[22] IntelliJ Platform GitHub.— URL: https://github.com/JetBrains/intellij-community(дата обращения: 25 апреля 2023 г.).
[23] JetBrains Fleet.— URL: https://www.jetbrains.com/fleet/#distributive (дата обращения: 25 апреля 2023 г.).
[24] Language Servers.— URL: https://microsoft.github.io/
language-server-protocol/implementors/servers/ (дата
обращения: 18 декабря 2022 г.).
[25] Language Server Protocol: Code Action Request. — URL: https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_codeAction(дата обращения: 14 апреля 2023 г.).
[26] Retaining comments when refactoring code/ Peter Sommerlad, Guido Zgraggen, Thomas Corbat, Lukas Felber.— 2008.— 01.— P. 653-662.
[27] Overbey Jeffrey L. Immutable Source-Mapped Abstract Syntax Tree: A Design Pattern for Refactoring Engine APIs // Proceedings of the 20th Conference on Pattern Languages of Programs.— PLoP ’13.— USA : The Hillside Group, 2013. — 8 p.
[28] Roberts Don, Brant John, Johnson Ralph. A Refactoring Tool for Smalltalk. //TAPOS. — 1997. — 01. — Vol. 3. — P. 253-263.
[29] Garrido Alejandra. Program Refactoring in the Presence of Preproces-sor Directives : Ph. D. thesis / Alejandra Garrido. — USA : University of Illinois at Urbana-Champaign, 2005. — AAI3199001.
[30] IntelliJ Platform SDK — Modifying the PSI. — URL: https://plugins.jetbrains.com/docs/intellij/modifying-psi.html(дата обращения: 18 декабря 2022 г.).
[31] Eclipse Java development tools (JDT).— URL: https://www.eclipse.org/jdt/ (дата обращения: 18 декабря 2022 г.).
[32] C/C++ development tools (CDT).— URL: https://projects.eclipse.org/projects/tools.cdt (дата обращения: 18 декабря 2022 г.).
[33] Roslyn GitHub.— URL: https://github.com/dotnet/roslyn(дата обращения: 18 декабря 2022 г.).
[34] Persistence, Facades and Roslyn’s Red-Green Trees. — URL: https://learn.microsoft.com/en-us/archive/blogs/ericlippert/persistence-facades-and-roslyns-red-green-trees (дата обращения: 18 декабря 2022 г.).
[35] GNU Diffutils.— URL: https://www.gnu.org/software/diffutils/ (дата обращения: 5 апреля 2023 г.).
[36] Bille Philip. A survey on tree edit distance and related problems // Theoretical Computer Science.— 2005.— Vol. 337, no. 1.— P. 217¬239.— URL: https://www.sciencedirect.com/science/article/pii/S0304397505000174.
[37] Pawlik Mateusz, Augsten Nikolaus. RTED: A Robust Algorithm for the Tree Edit Distance. — 2011. — 1201.0230.
[38] Change Detection in Hierarchically Structured Information / Sudar- shan S. Chawathe, Anand Rajaraman, Hector Garcia-Molina, Jen¬nifer Widom // Proceedings of the 1996 ACM SIGMOD International Conference on Management of Data. — SIGMOD ’96. — New York, NY, USA : Association for Computing Machinery, 1996.— P. 493-504.— URL: https://doi.org/10.1145/233269.233366.
[39] Change Distilling:Tree Differencing for Fine-Grained Source Code Change Extraction / Beat Fluri, Michael Wursch, Martin PInzger, Harald Gall //IEEE Transactions on Software Engineering. — 2007. — Vol. 33, no. 11.-P. 725-743.
[40] Fine-Grained and Accurate Source Code Differencing/ Jean-Remy Fal- leri, Floreal Morandat, Xavier Blanc et al. // Proceedings of the 29th ACM/IEEE International Conference on Automated Software Engi-neering. — ASE ’14. — New York, NY, USA : Association for Comput¬ing Machinery, 2014.— P. 313-324.— URL: https://doi.org/10.1145/2642937.2642982.
[41] GumTree Tool. — URL: https://github.com/GumTreeDiff/gumtree(дата обращения: 5 апреля 2023 г.).
[42] GSON Library.— URL: https://github.com/google/gson (дата обращения: 4 апреля 2023 г.).
[43] IntelliJ Platform Python PSI.— URL: https://github.
com/JetBrains/intellij-community/tree/master/python/python-psi-api/src/com/jetbrains/python/psi (дата
обращения: 4 апреля 2023 г.).
[44] JavaPoet Library.— URL: https://github.com/square/javapoet(дата обращения: 4 апреля 2023 г.).
[45] Chilowicz Michel, Duris Etienne, Roussel Gilles.Syntax tree finger-printing for source code similarity detection// 2009 IEEE 17th Inter-national Conference on Program Comprehension. — 2009. — P. 243¬247.
[46] A Framework for Software Product Line Practice, version 5.0. — Soft-ware Engineering Institute, 2006. — .— URL: https://doi.org/10.1145/2642937.2642982.
[47] Попова Т.Н. Кознов Д.В. Тинова А.А. Романовский К.Ю. Эволюция общих активов в семействе средств реинжиниринга программного обеспечения // Системное программирование, 1.— 2005. — P. 184-198.
[48] JetBrains PyCharm. — URL: https://www.jetbrains.com/pycharm/ (дата обращения: 4 апреля 2023 г.).


Работу высылаем на протяжении 30 минут после оплаты.



Подобные работы


©2025 Cервис помощи студентам в выполнении работ