Интерактивная языконезависимая система поиска шаблонов и дубликатов в программном коде Куделевский Евгений Валерьевич, 545 группа Научный руководитель: к.ф.-м.н. Мосиенко М.А. Поиск дубликатов Известная задача программной инженерии Эквивалентность фрагментов кода Особенности конкретного языка Порядок элементов Опциональный синтаксис def int n = 1 int n = 1 Скобки и блоки (a * 3) + 1 a * 3 + 1 if (b) { print s; } if (b) print s; Зависимость от языка программирования Подходы к решению def n = 1 Лексический Синтаксический Поиск по шаблону Применения Извлечение знаний Инспекция кода Поиск с помощью регулярных выражений Сложность составления Не всегда возможно описать шаблон Structural Search & Replace Шаблоны описываются на языке программирования, в котором предполагается производить поиск $output$.print($text$) Шаблонные переменные Значения – синтаксические единицы языка либо их последовательности Дополнительные ограничения на значения переменных Замена на другой шаблон if ($condition$) {$statements$} $var$ == 0 $var$ == null Связь с задачей поиска дубликатов Цель работы Разработка и внедрение программного инструмента поиска, удовлетворяющего следующим критериям: Языконезависимость реализации Расширяемость. Возможность учитывать особенности конкретного языка программирования Механизм работы поиска Синтаксический подход Поиск дубликатов Хэширование синтаксического дерева Хэширование блоков Функция стоимости Роли синтаксических конструкций Structural Search Компиляция шаблона Шаблонные переменные заменяются на идентификаторы Контекст разбора Результаты: поиск дубликатов в IntelliJ IDEA Имелось средство поиска дубликатов для Java Реализован инструмент поиска для многих других языков Полная поддержка функциональности, которая имелась ранее для Java Языконезависимость. Простой механизм поддержки нового языка Добавлена поддержка языков PHP, Groovy, JavaScript и HTML Результаты: Structural Search & Replace Имелась поддержка языков Java, HTML, XML и JavaScript Реализован инструмент поиска для многих других языков Полная поддержка функциональности, которая имелась ранее для Java, HTML, XML и JavaScript Языконезависимость. Простой механизм поддержки нового языка Добавлена поддержка языков PHP, Groovy и CSS Возможности расширения Необходимая работа для поддержки нового языка Класс-наследник DuplicatesProfileBase Класс-наследник StructuralSearchProfileBase Роли Блоки GroovyDuplicatesProfile: 47 строк PhpStructuralSearchProfile: 50 строк Описание эквивалентности По умолчанию используется стандартная эквивалентность Апробация Фреймворк MediaWiki 47 Мб кода на языках PHP, JavaScript, HTML и XML Поиск дубликатов Время работы: 95 сек. Найдено более 300 дубликатов Поиск шаблонов Время работы: 5 - 30 сек. в зависимости от сложности шаблона Результаты работы Разработан и внедрен языконезависимый и расширяемый программный инструмент поиска На основе существующего плагина Structural Search & Replace и движка поиска дубликатов для Java Возможно учитывать особенности конкретного языка Добавлена поддержка Groovy, PHP, JavaScript, CSS, HTML Проведено тестирование на реальном коде