Система модификации структуры исходного кода для интегрированных сред разработки
|
Введение 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
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. Апробировать созданную подсистему в контексте создания средств рефакторинга и быстрых исправлений.
Одной из наиболее важных задач 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 (г. Пенза).
• Выполнен обзор предметной области:
— изучена текущая платформа 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 (г. Пенза).
Подобные работы
- Повторно используемая инфраструктура мультиязыковой среды разработки для языка Python
Бакалаврская работа, информационные системы. Язык работы: Русский. Цена: 4295 р. Год сдачи: 2023 - Повторно используемая инфраструктура
мультиязыковой среды разработки для
языка Python
Дипломные работы, ВКР, программирование. Язык работы: Русский. Цена: 4700 р. Год сдачи: 2023 - Вопросы построения систем защиты информации для программных пакетов, используемых в монопольном доступе
Диссертации (РГБ), информационные системы. Язык работы: Русский. Цена: 700 р. Год сдачи: 2006 - Анализ методов защиты информации без использования вспомогательных аппаратных средств
Диссертация , информационные системы. Язык работы: Русский. Цена: 500 р. Год сдачи: 2006 - Разработка и оснащение операций технологического процесса
изготовления детали «Корпус защитного устройства»
с визуальной верификацией траекторий обработки
Дипломные работы, ВКР, автоматика и управление. Язык работы: Русский. Цена: 4900 р. Год сдачи: 2021 - Разработка и оснащение операций технологического процесса изготовле-
ния детали "Штуцер", с визуальной верификацией траекторий обработки
Дипломные работы, ВКР, автоматика и управление. Язык работы: Русский. Цена: 4900 р. Год сдачи: 2021



