Интерактивная языконезависимая система поиска шаблонов и

advertisement
Интерактивная языконезависимая
система поиска шаблонов и дубликатов
в программном коде
Куделевский Евгений Валерьевич, 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
Проведено тестирование на реальном коде
Download