УДК 004.02+519.1 А.В. Погребной
Выделение общей части в версиях исходного кода программ, представленного графовой моделью
Решение задач анализа структурного сходства объектов на основе применения графовых моделей (ГМ) является одним из актуальных направлений исследований в прикладной теории графов. В статье в качестве объектов для анализа сходства рассматриваются версии исходного кода программ. Существующие системы управления версиями (СУВ) при решении данной задачи работают непосредственно с текстами исходных кодов версий программ. Наделение СУВ возможностью работать с ГМ, адекватно представляющими исходный код версий программ, позволяет существенно улучшить качество выполнения традиционных функций СУВ и расширить инструментарий по сопровождению процесса разработки программ. Оценивать сходство версий программ предлагается на основе выделения в них наибольшей общей части, т.е. наибольшего общего подграфа. Цель исследований заключается в разработке метода решения задачи выделения наибольшей общей части в версиях программ, представленных в виде ГМ. Исследования базируются на применении предложенной автором теории дифференциации вершин графа, в которой модель структуры графа представляется в виде сети автоматов. Важным преимуществом метода является его способность легко адаптироваться к особенностям написания исходного кода программы и используемой версии языка программирования. Метод включает три этапа - составление и кодирование списков атрибутов, приписанных вершинам и дугам ГМ; преобразование ГМ в стандартную форму в виде ориентированного графа; выделение общей части в двух ориентированных графах, представляющих сравниваемые версии программы. Алгоритм выделения общей части, работая со стандартными формами представления ГМ, является инвариантным относительно особенностей описания ГМ и набора используемых атрибутов. Приводится пример решения задачи выделения общей части для двух сравниваемых фрагментов ГМ.
Ключевые слова: графовая модель программы, система управления версиями, общая часть двух графов, подстановка сходства графов, дифференциация вершин графов. ао1: 10.21293/1818-0442-2018-21-3-49-56
Разработка программной системы, как правило, связывается с созданием последовательности работоспособных версий [1-3]. За время разработки над проектом обычно работает множество человек, которые постоянно вносят изменения в исходный код программы. Таким образом, накапливается множество версий исходного кода программы, с которыми невозможно работать без специальных инструментов.
Для работы с версиями программ применяются системы управления версиями (СУВ) [4, 5], например: Git, Mercurial [6, 7]. Данные СУВ работают непосредственно с текстами исходных кодов версий программ. Это порождает ряд проблем, связанных с неоднозначностью форматирования текстов исходного кода, а также невозможностью анализа изменений с целью более интеллектуального разрешения возникающих конфликтов.
Исходный код программ для различных целей представляется в виде самых разных графовых моделей (ГМ) [8-10]. В [11] для поддержки процесса разработки и анализа программ предложено исходный код представлять в виде ГМ, полностью описывающей исходный код программы, т.е. позволяющей конвертировать графовую модель обратно в исходный код без потерь какой-либо информации.
В предлагаемой ГМ вершинами являются фрагменты синтаксических конструкций языка, такие как объявления переменных, вызовов операторов или функций. Соответственно для разных языков программирования правила построения такого графа будут различаться. На рис. 1 приведён пример ГМ для фрагмента исходного кода на языке Java.
В примере для удобства визуализации все вершины разделены на два типа - данные и модули (некоторые действия). Данные в ГМ (замкнутые кривые) имеют три вида изображения. Сплошная линия соответствует локальной переменной. Сплошная линия с точкой отражает свойство класса. Пунктиром изображается промежуточная переменная без указания имени.
Модули изображаются прямоугольниками двух видов. Прямоугольник без точки соответствует модулю, выполняющему оператор, метод. Прямоугольник с точкой обозначает объявление метода класса.
Информационные связи изображаются с указанием стрелок. В тех случаях, когда информационные входы в модуль необходимо различать, то у стрелки входной дуги указывается номер входа (например, для цикла for). Связь без ориентации применяется для отражения принадлежности модуля или свойства объекту.
Управляющие связи (mjb mj2) между модулями помечаются точками, которые условно воспринимаются в качестве переменных. Такие переменные соответствуют появлению сигнала о том, что модуль mji закончил работу, а модуль mj2 может приступать к выполнению.
Приведенный на рис. 1 набор элементов визуализации представляет только те синтаксические конструкции языка Java, которые задействованы в приведенном примере. Этот набор для языка в целом содержит и другие элементы, которые здесь не представлены.
Hash hash = new Hash(10); int sum = 0;
for (int i = 0; i < args.length; i++) { sum += hash.calc(args[i]);
}
class Hash {
private int b; Hash(int b) { this.b = b;
}
int calc(int a) { return (a + b) *
}
3;
Таким образом, каждая вершина в графе имеет набор атрибутов, необходимых для адекватного представления исходного кода. Атрибут, который есть у всех вершин, - это тип вершины. Он же определяет, какие атрибуты могут быть у вершины. Например, если тип вершины - объявление переменной, то у неё будет два атрибута: тип переменной и её имя. Также в атрибутах вершин содержится различная информация о форматировании исходного кода вроде отступов, которая позволяет восстановить исходный код по ГМ.
Наряду с задачами анализа функционирования программ построение такой ГМ даёт возможность расширить и повысить эффективность выполнения задач СУВ. Функционирование СУВ, основанной на ГМ, будет включать три этапа:
1. Построение ГМ для исходного кода.
2. Выявление различий в ГМ, представляющих две разных версии исходного кода.
3. Интерпретация и анализ полученных на предыдущем этапе различий.
Решению второго этапа в условиях, когда версии программы представлены в виде ГМ1 и ГМ2, посвящена данная статья.
В статье предлагается метод, основанный на преобразовании ГМ в стандартную форму представления в виде ориентированного графа. По этому методу версии ГМ1 и ГМ2 преобразуются соответственно в ориентированные графы 01 и 02. Задача выделения общей части в версиях программ в этом случае сводится к задаче определения сходства двух
ориентированных графов 01 и 02. Таким образом, достигается независимость алгоритма от выбранного языка программирования. Обычно при решении задач сходства используются косвенные оценки, как, например, в [12, 13]. В версиях же программ для работы СУВ необходимо определение наибольшей общей части, поэтому задача решается на основе методов, изложенных в [14]. После выделения в графах 01 и 02 общей части в виде подграфа 0> она может быть представлена отдельной ГМе и при необходимости преобразована в текстовую форму в виде исходного кода.
Метод выделения общей части в графовых моделях версий программ
Представление версий программы в виде ГМ сопровождается указанием большого разнообразия атрибутов, приписываемых вершинам и рёбрам ГМ [11]. Такое представление позволяет на основе структуры ГМ и множества атрибутов восстановить исходный код соответствующей версии программы. Вместе с тем исследования показали, что выделение общих частей в версиях непосредственно на основе ГМ1 и ГМ2 оказалось трудно реализовать по ряду причин: громоздкое описание ГМ; отсутствие возможности применения метода взаимозависимой дифференциации вершин для определения сходства структур графов [14]; зависимость алгоритма выделения общей части от версий языка программирования.
Каждая из приведенных выше причин указывает на необходимость разработки иного подхода к решению проблемы выделения общих частей в вер-
сиях программ и его применения в составе СУВ. В основу этого подхода положено предварительное преобразование ГМ в стандартную форму, которая не зависит от состава атрибутов, используемых в ГМ.
В данном подходе все особенности исходного кода, в том числе и для разных языков, должны учитываться на стадии формирования описания ГМ и базовых списков атрибутов. Преобразование ГМ в стандартную форму выполняется по универсальным правилам и независимо от особенностей исходного кода представляет версии ГМ1 и ГМ2 ориентированными графами О1 и 02 соответственно.
Решение проблемы выделения общей части включает три этапа. На первом этапе на основе описания ГМ формируются новые или уточняются имеющиеся базовые списки атрибутов (V, X, 7,...) для вершин и (Ж, В, Н) для дуг. Эти списки отражают особенности языка программирования и включают множества атрибутов, используемых при описании ГМ.
Список V включает атрибуты вида вершин (оператор, переменная, метод, константа и т.д.). Списки X, 7, ... соответствуют идентификаторам вершин, типам вершин и другим атрибутам, входящим в описание вершины. Список Ж включает атрибуты вида дуг (информационные, управляющие, отражающие отношение принадлежности, зависимости и т.д.). Списки В, Н содержат атрибуты, характеризующие входы и выходы дуг.
На втором этапе выполняются операции по преобразованию ГМ] и ГМ2 в О] и О2. Предварительно базовые списки атрибутов пополняются новыми атрибутами из описаний ГМ1 и ГМ2. Далее каждая ГМ представляется четвёркой (Е, и, ЛЕ, Аи), включающей множество вершин Е, множество дуг и, множество кодов атрибутов вершин Ле = = {е1 (V,х1,у1,...)}, множество кодов атрибутов дуг Ли = {(ер,е)(Wji,Ь,Нр)}. Здесь коды (V,х,у,...) и (Жр ,Ь ,Нр) являются порядковыми номерами соответствующих атрибутов вершин и дуг, которые они занимают в базовых списках (V, X, 7,.) и (Ж, В, Н).
В итоге описания ГМ1 и ГМ2 представляются ориентированными графами О1 и О2, у которых атрибуты вершин и дуг заменены на порядковые номера (коды) в соответствующих списках. Структура каждого графа представляется в виде списка инци-денторов входных вершин {еХР(е,))}, где инциден-тор Р(е,) включает множество вершин ер, из которых дуги выходят и поступают на вход в вершину е. Коды атрибутов для вершин е1 и дуг (ер, е) представляются множествами записей в виде {е(У, х, у,...)} и {(ер, е)(Жр, Ь, Нр)}. При отсутствии Ь и Нр указывается только Жр, т.е. запись имеет вид (ер, е)(Жр). Если отсутствует Ь или Нр, то записи имеют вид (ер, е)(Жр, 0, Нр) или (ер, е)(Жр, Ь).
Третий этап включает реализацию алгоритма выделения в графах О1 и О2 общей части Q. В основу алгоритма положен метод оценивания сходства структур двух графов [11]. Общая часть Q соответ-
ствует подстановке сходства вершин графов О1 и О2, которой соответствует наибольшее число совпадающих дуг. Перед решением задачи выделения общей части в графах О1 и О2 удаляются вершины и связанные с ними дуги, которые не могут войти в общую часть. Вершина е1 удаляется из графа О1, если запись е (V , хи у, ...) отсутствует среди записей для графа О2. Аналогично из графа О2 вершина удаляется, если её запись не найдена среди записей графа О1. Оставшиеся части графов О1 и О2 обозначим графами О и Н. При этом часть с меньшим числом вершин будем обозначать как О. Графы О и Н характеризуются тем, что для каждой записи в графе О есть совпадающая с ней запись в графе Н.
Задача выделения общей части в ГМ1 и ГМ2 решается на соответствующих графах О= (ЕО, иО) и Н= (ЕН, иН). Каждый из них представлен списком инциденторов {е(Е(е))} и множествами записей кодов атрибутов вершин {е(¥, х, у, ...)} и дуг {(ер, е)(Жр, Ь, Нр)}. Решение основывается на применении метода взаимозависимой дифференциации вершин графов О и Н.
Для применения метода определяются начальные состояния моделей структур графов. С этой целью в графе О для каждой 1-й записи в множестве
х,у, ...)} назначается код 4° - интегральный описатель кодов атрибутов вершины е. Запись с наименьшим числом атрибутов и минимальным значением среди V, затем среди х1 и т.д. получает код
=1. Все записи, совпадающие с выбранной, также получают код =1. Выбор записей для назначения кода = 2 производится среди оставшихся записей аналогично. В итоге все различающиеся записи получают разные коды . В графе Н вершины ер получают код ё0 = 40 , если записи вершин е1 и ер в графах О и Н совпадают.
После назначения вершинам е1еЕО кодов 4°, а
вершинам ереЕН кодов ё0 начальное состояние моделей структур графов О и Н представляется векторами Б О ={4°} и Бн ={ё0}. С учётом инциденторов вершин получим векторы бО(Р) ={40(Р(4°))} и бН (Р) = {40(Р(4))}. В инциденторах Р(4°) и
Р (40) помимо кодов входных вершин указываются коды атрибутов соответствующих дуг, например: Р (<)=(4б0(Жб,10,0,Нб), <(ЖНК)), 4)Ж20
Сохранение в записях инциденторов кодов атрибутов дуг в виде (Жр1, Ь, Нр) позволяет сравнивать и выделять в графах О и Н дуги с частично совпадающими атрибутами. Это важно в условиях, когда выделение общей части соответствует поиску подстановки сходства с наибольшим числом полностью или частично совпадающих дуг.
Основные положения метода выделения общей части разработаны с учётом особенностей графов О и Н и заключаются в следующем:
1. Векторы Б О (Р) и БН (Р) отражают начальную дифференциацию вершин и разбивают их на группы Е0 (О) и Е0 (Н) независимо от степеней
по входным дугам. Из этого следует, что шаги взаимозависимой дифференциации должны предусматривать возможность интеграции частей совпадающих кодов вершин в сопоставляемых инциденторах
Р(0,) и Р(0у). При интеграции допускается также
частичное совпадение кодов атрибутов соответствующих дуг.
2. Подстановка сходства 2ОН = {(е , е,)} графов О
и Н состоит из пар (е,, е,) с вершинами е, е Е0 (О) и
е, е Е0 (Н), выбранными из пар групп
(Е0(О),Е0(Н)) с кодами 00 = 00 = 0 . Таким образом, область поиска вариантов пар (е,, е,) для включения в 2ОН ограничивается величиной
Е0(О)|х|Е0(Н)|). При этом для каждого 0 чис-
0
ло выбираемых пар (е, е) не превышает значение
ш1и(|Е0(О)|,|Е0( Н )|).
3. Выбор пар (е,, е,) для включения в 1ОН сводится к поиску наилучшего соответствия кодов в
инциденторах Р(0,) и Р(0у) среди пар групп в
множестве {(Е0 (О), Е0 (Н))}. Степень соответствия
кодов в инциденторах Р(0у) и Р(0у), 0, = 0у = 0 оценивается величиной г, (0):
гу (0) = (г0 + Г¥ /ёШ + гЬ /ёЬ + гк /ёк )/ё,. (1)
Здесь г0 - число пар взаимно однозначного соответствия вершин с равными кодами 0, взятых из 1-го и)-го инцидентора;
гК, гь, гк - числа пар кодов по соответствующим атрибутам дуг Ж, Ь, к, которые оказались равными для выделенных в числе г0 пар вершин;
ё™, ёь, ёк - минимальные количества кодов атрибутов дуг среди пар совокупностей (Ш), (Ж, Ь,) или (Ж, Ь, к), приписанных к вершинам, которые образовали пары с равными кодами Ш, ь, к в количестве г™, гь, гк соответственно;
ё,, - минимальное число вершин в одном из
сравниваемых инциденторов Р(0у) и Р(0у).
Например, для инциденторов (2(1,3), 4(8), 6(2,0,3)) и (2(1,4), 4(8,14), 6(2), 6(2,0,3)), согласно (1), г„(0) = (3 +1/2 +1/2 +1/3 +1/3 +1/3) 3 = 5/3. Заметим, что вершина 4(8) в паре с вершиной 4(8,14) воспринимается как 4(8,0).
В множестве пар {(Еу (О),Е0(Н))}, выбор пары для продолжения дифференциации вершин осу*
ществляется по наибольшему значению г, (0):
г* (0) = тах{тах{г, (0)}}. (2)
0 из
*
Поиск подстановки сходства 2он с наибольшим числом совпадающих дуг в общей части осуществляется на дереве траекторий процесса дифференциации вершин [14].
Изложенный выше подход позволяет разработать единый алгоритм решения задачи выделения общей части, инвариантный относительно специфики ГМ1 и ГМ2 и состава атрибутов. Общей частью Q принимаются совпадающие в графах О1 и О2 частичные подграфы с наибольшим числом дуг. Алгоритм выделения общей части Исходными данными для алгоритма являются описания ГМ1 и ГМ2 в виде ориентированных графов О1 и О2. Графы представлены списками инци-денторов вершин {е(Р(е,))}, множествами записей кодов атрибутов вершин {е, (V,х,,у,,...)} и дуг
{(в) шл ,ь, к,)}.
Алгоритм включает следующие операции:
1. Формирование графов О и Н. Для этого у всех пар вершин (е,,е,)е(Ео1 хЕо2) сопоставляются записи в множествах {е, (V,х,-,у, ,...)}о1 и {е, (V,,х,,у, ,...)}о2 . Если совпадающих записей не
найдено, то вершины е и е, исключаются из графов О1 и О2. Сохранившиеся подмножества вершин в графах О1 и О2 и дуг между этими вершинами представляют графы О и Н.
2. Определение векторов БО (Р) и бН (Р) начальных состояний моделей структур графов О и Н. Графы представлены списками инциденторов вершин {е,(Р(е,))}О и {е;(Р(е;))}Н, множествами записей кодов атрибутов вершин {е, (V, х,, у, ,...)}о и {е, V ,Х] ,У] ,...)}н и дуг {(ея,е, )(Жф,Ь, ,кд)}о и {(ег,е,)(Щу- ,Ь/,кг)}н . Каждой записи {е,(V,х ,,у,...)}о для е¡еЕО и записи {е, (V,,х,,у, ,...)}н для е,еЕН назначаются коды 0,°,00 - интегральные описатели
кодов атрибутов данных вершин. Далее по спискам {е,(Р(е,))}О и {е,<Р(е,))}н формируются списки {00(Р(00))}о и {00 (Р(00))}н векторов БО (Р) и
БН (Р). При этом каждой вершине ед е Р(0,) и
ег е Р(010) приписываются записи из множеств
{(Жд,, Ь,, кд)}а и {(Жф Ь, кг)}н для соответствующих дуг (ед, е,) и (ег, е,).
3. Выполнение шага взаимозависимой дифференциации вершин путём преобразований БО (Р) ^ Бо (Р) и БН (Р) ^ БН (Р). В векторах
БО (Р) и БН (Р) выделяются пары вершин (е,, е,) с уникальными и совпадающими записями 00 (Р(0,°)) = 010 (Р(010)). Для таких вершин принимается 0} = 00 и 0} = 00 . Далее выделяются пары вершин с уникальными записями, у которых
d0 = 40 , а инциденторы Р(d0) и Р(40) не совпадают частично или полностью. Для этих вершин также принимается d} = и = с1 0 .
Вершины, не получившие коды d},d}, разбиваются на пары базовых групп (Е0(О), Е0(Н)).
Среди них выбираются пары, которые не содержат переходы на альтернативные траектории дифференциации вершин. Этим свойством обладают пары, в которых одна из групп содержит одну запись, совпадающую частично или полностью только с одной записью в другой группе. Соответствующие вершины е, и ер получают коды d} = = 4 .
Далее выделяются пары групп, у которых величины Гр (4), вычисленные по (1), однозначно устанавливают соответствие в парах вершин {(е,, ер)}. При этом одна пара (е,, ер) получает коды d} = 41 = 4 ,
а остальные получают коды dг1 = 411 , равные одному
из незанятых кодов в последовательности (1, 2,
..., |Ео|).
Среди оставшихся пар групп, согласно (2), выбирается пара (Е0(О),Е0(Н)) с наибольшим значе-
*
нием Тр (4). Вершины (е,, ер), соответствующие ве-
* 11
личине Гц (й), получают коды = = 4 . Вершины
*
(е,, ер) с Тр (4) < Тр (4) получают маскирующие коды
1 1 * 1
4 * = 4 * = 4 и включаются в множество Е* в каче-
, ]
стве точек запуска альтернативных траекторий.
4. Выполнение шага дифференциации бО (Р) ^ бО (Р), БН (Р) ^ БН (Р). Этот и последующие шаги БО(Р) ^ БО+1(Р), БН (Р) ^ БН+1(Р) выполняются операцией 3 до полной дифференциации вершин графа О. При этом на каждом к-м шаге
к к
уникальные коды 4, и 4 р сохраняются, а коды dik+1 и назначаются из незанятых значений
множества (1, 2, ..., |ЕО|). Для состояния полной дифференциации Бо (Р) и БН (Р) определяется подстановка сходства 2ОН и соответствующая общая часть Q с числом дуг шд.
*
5. Поиск подстановки сходства 2 он с наи-
*
большим числом дуг шд в общей части д. Если совокупность {Е*} содержит множество точек запуска то дифференциация выполняется
также и по альтернативным траекториям. При этом дерево траекторий может просматриваться полностью либо частично с применением схемы поиска по методу ветвей и границ [14, 15].
Работу алгоритма покажем на примере выделения общей части в графах О и Н, которые визуально представлены на рис. 2. Здесь же приведены списки кодов атрибутов вершин и дуг.
Графы на рис. 2 содержат четыре вида вершин, V, Vj = (1, 2, 3, 4), и три вида дуг, Wql, Wj = (1, 2, 3). В списках кодов атрибутов вершин указаны их интегральные описатели d°,d0. Исходя из определения
графов G и H, для каждого d0 должен существовать один или несколько d0 = d0 . Аналогично для каждого d0 существует один или несколько d0 = d0 . Из
этого, с учётом |PG| < |PH|, следует, что общая часть Q(G,H) может включать все вершины графа G или их часть.
Результаты работы алгоритма выделения общей части в графах G и H (см. рис. 2) приведены на рис. 3. Структуры графов представлены списками инциденторов {et(F(et))} и {e](F(e]))}, в которых инциденторы включают только входные вершины. Если вершины e или ej не имеют входов, то соответствующие инциденторы F(e t) = F(e}) = 0. В графе G -это вершины e7, e13, в графе H - вершины e1, e5.
Начальные состояния моделей структур
{d0( F (dt0))},{d0 ( F (d 0 ))} получены в результате
замены номеров вершин e , ej в списках инциденто-ров на соответствующие интегральные описатели
d0,d0. При этом к описателям d0 е F (d0) и
d0 е F 0d 0 ) приписываются коды атрибутов дуг (Wqt,
bt, hq) и (Wj bj, h)
Результаты выполнения операции 3 алгоритма
по назначению d} и d1 при переходе D0(F)^D1(F)
отражены на рис. 3 отдельными колонками по каждому из четырёх признаков. По признаку уникальных совпадающих инциденторов назначены коды (5, 8, 6, 9, 3, 4, 11). По признаку совпадения уникальных кодов вершин с разными и частично или полностью совпадающими инциденторами назначены коды (7, 10). По следующему признаку сопоставляются группы с числом вершин | E° (G ) |= 1 и | E-J0 ( H )|= 3, которые не содержат переходы на альтернативные траектории, так как группа E°(G) включает одну вершину. Пара вершин (e2, e6) из этих групп получает код d2 = d6 =1.
По отдельному четвёртому признаку сопоставляется другая пара групп (E° (G),E° (H)), которая
также оказалась без альтернативных траекторий. Здесь для одной пары вершин (e8, e4) с наибольшим значением r84(2) = (3+3/1)/3 = 2 сохранён код d^ = d 4 = 2. Пара вершин (e6, ei0) с оценкой r6,10(2) = (2+2/1)/2 = 2 получила минимальный незанятый код d1 = dj10 =12. Оставшаяся пара вершин (e10, e12) с оценкой r10,12(2) = (1+1/1)/2 = 1 получает код d110 = d112 =13.
Пример на рис. 3 не содержит пар групп, порождающих альтернативные траектории.
13
Ни)
10{ 12
КО)
9Д 10 [ 11
5')-
е, (V,,, х,) — 00 (ед, е) (ШдЬ Ьд, к,) (ед, е,) (Шф, Ьд, к,)
1 (2, 5)—7 (1,2) (1) 1 (3, 1)—9 (1,3)(1)
2 (1, 2)—1 (2,3) (1,0 ,1) 2 (2, 5)—7 (1,4)(1)
3 (2, 3)—5 (2,5) (1,0 ,2) 3 (1, 2)—1 (2,6)(1)
4 (2, 6)—8 (3,6)(1) 4 (1, 3)—2 (3,2) (1,0 ,2)
5 (2, 4)—6 (4,11)(3) 5 (4, 2)—11 (4,3)(2)
6 (1, 3)—2 (5,6)(1) 6 (1, 2)—1 (4,8)(1)
7 (3, 1)—9 (5,8)(1) 7 (2, 4)—6 (5,4) (3)
8 (1, 3)—2 (6,4) (1) 8 (2, 1)—3 (6,7) (1,0 ,2)
9 (2, 1)—3 (6,10) (2) 9 (2, 3)—5 (6,9) (1,0 ,1)
10(1, 3)—2 (7,8)(1) 10(1, 3)—2 (7,4) (1)
11(4, 1)—10 (8,1)(1) 11(2, 6)—3 (7,10) (1)
12(2, 2)—4 (8,9) (1) 12(1, 3)—2 (8,12) (1)
13(4, 2)—>11 (9,10) (1) 13(2, 2)—4 (9,10) (1)
(10,11) (3) 14(1, 2)—1 (9,14) (1)
(10,12) (1) 15(4, 1)—10 (10,11) (1)
(13,8) (3) (11,12) (1) (12,13)(1) (12,15)(3) (14,15)(3)
Рис. 2. Примеры графов О и Н и списков кодов атрибутов вершин и дуг
О: е,(Р(е,))
00( Р (00))
0}( Р (0}))
2он :(е,,е,)^0,
1(8) 7(2(1)) 7 (2(1)) (1,2) —7
2(1) 1(7(1)) 1 (7(1)) (2,6) —1
3(2) 5(1(1,0 ,1)) 5 (1(1,0 ,1)) (3,9) —5
4(6) 8(2(1)) 8 (12(1)) (4,11) —8
5(2) 6(1(1,0 ,2)) 6 (1(1,0 ,1)) (5,7) —6
6(3,5) 2(5(1 ),6(1)) 12 (5(1),6(1)) (6,10) —12
7( 0 ) 9( 0 ) 9 (0 ) (7,1) —9
8(5,7,13) 2(6( 1 ),9( 1), 11 (3)) 2 (6(1),9(1), 11(3)) (8,4) —2
9(8) 3(2(1)) 3 (2(1)) (9,8) —3
10(6,9) 2(2(2),3(1)) 13 (3(1X12(2)) (10,12)—13
11(4,10) 10(8(3),2(3)) 10 (13(3),8(3)) (11,15)—10
12(10) 4(2(1)) 4 (13(1)) (12,13)—4
13( 0) 11( 0 ) 11 (0) (13,5) —11
Н: е(Щ))
00 (Р (00))
0}( Р (0}))
Q: 0, (Р (0,))
1( 0 ) 9( 0 ) 9 (0 ) 1(7)
2(3) 7(1(1,0 ,2)) 7 (*') 2(6,9,11)
3(1,4) 1(9(1 ),2(2)) 3(12)
4(1,5,7) 2(9(1), 11(3),6(1)) 2 (6(1),9(1), 11(3)) 4(13)
5( 0 ) 11( 0 ) 11 (0 ) 5(1)
6(2) 1(7(1)) 1 (7(1)) 6(1)
7(7) 6(1(1,0 ,2)) 6 (1(1,0 ,2)) 7(*)
8(4) 3(2(1)) 3 (2(1)) 8(12)
9(6) 5(1(1,0 ,1)) 5 (1(1,0 ,1)) 9()
10(7,9) 2(6(1 ),5(1)) 12 (5(1),6(1)) 10(13)
11(10) 8(2(1)) 8 (12(1)) 11()
12(8,11) 2(3(1 ),8(1)) 13 (3(1), 8(1)) 12(5,6)
13(12) 4(2(1)) 4 (13(1)) 13(3)
14(9) 1(5(1))
15(12,14) 10(2(3),1(3)) 10 (13(3),(*))
Рис. 3. Выделение общей части в графах О и Н, приведенных на рис. 2
Поэтому состояния Dg (F) и dH (F) соответ-
*
ствуют подстановке сходства Zgh (на рис. 2 приведена справа вверху). Список инциденторов {d¡ (F(d))} для общей части Q(G, H) с Mq = 13 приведен справа внизу. Вершины общей части в графах G и H в изображениях вершин на рис. 2 указаны кодами d, а дуги, вошедшие в общую часть, отмечены жирным.
Заключение
В статье предложен метод решения задачи выделения общей части в версиях программной системы, представленных графовыми моделями (ГМ). Разработаны правила преобразования ГМ, представленных описаниями структур и списками атрибутов вершин и дуг, в стандартную форму в виде ориентированных графов, пригодную для применения взаимозависимой дифференциации вершин. Это позволило разработать алгоритм выделения общей части в ориентированных графах, который является инвариантным по отношению к особенностям описаний структур и набору атрибутов, используемых в сравниваемых ГМ.
Полученные результаты имеют важное значение для дальнейшего развития и расширения функций системы управления версиями. К ним можно отнести функции контроля исходного кода, оптимизации его структуры, визуального анализа фрагментов, иерархической структуризации исходного кода и получения временных оценок функционирования, разработки планов тестирования и ряд других функций по сопровождению разработки программ.
Литература
1. Власов А.И. Системный подход к проектированию при каскадной и итеративной модели жизненного цикла /
A.И. Власов, А.А. Карпунин, Ю.М. Ганев // Тр. междунар. симпозиума «Надежность и качество». - 2015. - Т. 1. -С. 96-99.
2. Брагина Т.И. Сравнительный анализ итеративных моделей разработки программного обеспечения / Т.И. Брагина, Г.В Табунщик // Радюелектрошка, шформатика, управлшня. - 2010. - № 2(23). - С. 130-138.
3. Бахтизин В.В. Модель жизненного цикла программных средств при разработке на основе гибких методов / В.В. Бахтизин, С.Н. Неборский // Доклады БГУИР. -2008. - № 8(38). - С. 65-69.
4. Сиротенко Ф.Ф. Принципы работы и возможности системы управления версиями // Наукоемкие технологии в космических исследованиях Земли. - 2010. - № 1. - С. 15-17.
5. Шурыгин В.Н. Системы контроля версий /
B.Н. Шурыгин, Д.А. Сиваченко // Вестник МГУП. -2015. - № 5. - С. 103-104.
6. Chacon S. Pro Git (2nd ed.) / S. Chacon, B. Straub. -Berkely, CA, USA: Apress, 2014. - 456 p.
7. O'Sullivan B. Mercurial: The Definitive Guide. -O'Reilly Media, 2009. - 284 p.
8. Gold R. Control flow graphs and code coverage // Applied Mathematics and Computer Science. - 2010. - No. 4. -P. 739-749.
9. Feist M.D. Visualizing Project Evolution through Abstract Syntax Tree Analysis / M.D. Feist, E.A. Santos, I. Watts, A. Hindle // 2016 IEEE Working Conference on Software Visualization. - 2016. - P. 11-20.
10. Касьянов В.Н. Графы в программировании: обработка, визуализация и применение / В.Н. Касьянов, В.А. Евстигнеев. - СПб.: БХВ-Петербург, 2003. - 1104 с.
11. Pogrebnoy A.V. Constructing graph models for software system development and analysis // 2017 J. Phys.: Conf. Ser. - URL: http://iopscience.iop.org/article/10.1088/1742-6596/803/1/012118/pdf (дата обращения: 03.10.2018).
12. Дэмер М. Новый функционал информативности для анализа структуры химических графов / М. Дэмер, Ф. Эммерт-Штрайб, Ю.Р. Цой, К. Вармуза // Изв. Том. политехн. ун-та. - 2010. - Т. 316, № 5. - С. 5-11.
13. Dehmer M. Quantum Frontiers of Atoms and Molecules / M. Dehmer, F. Emmert-Streib, R.Y. Tsoy, K. Varmuza. -New York: Nova Publishing, 2011. - 673 p.
14. Погребной А.В. Метод определения сходства структур графов на основе выделения частичного изоморфизма в задачах геоинформатики // Изв. Том. политехн. ун-та. - 2015. - Т. 326, № 11. - С. 56-66.
15. Land A.H. An Automatic Method of Solving Discrete Programming / A.H. Land, A.G. Doig // Problems Economet-rica. - 1960. - Vol. 28, No. 3. - P. 497-520.
Погребной Андрей Владимирович
Аспирант инженерной школы информационных технологий и робототехники (ИШИТР) Томского политехнического университета (ТПУ) Ленина пр-т, д. 30, г. Томск, Россия, 634050 Тел.: +7-952-808-36-82 Эл. почта: avpogrebnoy@gmail.com
Pogrebnoy A.V.
Finding common parts in software source code versions represented by graph models
Solving the problem of the objects structural similarity analysis based on graph models (GM) is one of the actual research directions of the applied graph theory. In the paper, program source code versions are used as objects for similarity analysis. Existing version control systems (VCS) work directly with the text of the program source code. Giving VCS an ability to work with GM, adequately representing program versions source code, opens new ways to improve traditional functions of the VCS and expand program development tools. It is proposed to base program versions similarity estimation on allocating biggest common part in the program source code. The aim of the study is to develop the method of the common part allocation if the program versions, represented as a GM. Research is based on the application of the graph vertices differentiation theory, where graph structure model is represented as a network of the state machines. Important method's advantage is an ability to easily adapt to program source code features. Method includes three stages - forming and encoding list of attributes of GM vertices and edges; transforming GM into standard form as a directed graph; allocating common part in two directed graphs, representing compared program versions. Algorithm of allocating common part is invariant relatively to GM description features and set of used attributes. Example of solving the problem of the common part allocation for two compared GM fragments is provided. Keywords: software graph model, version control system, common part of two graphs, graph similarity substitution, graph nodes differentiation. doi: 10.21293/1818-0442-2018-21-3-49-56
References
1. Vlasov A.I., Karpunin A.A, Ganev Yu.M. Sistemniy podkhod k proektirovaniyu pri kaskadnoy i iterativnoy modeli zhiznennogo tsikla. Trudi Mezhdunarodnogo simpoziuma «Nadezhnost i kachestvo», 2015, vol. 1, pp. 96-99 (In Russ.).
2. Bragina T.I., Tabunshchik G.V. Sravnitelniy analiz it-erativnih modeley razrabotki programmnogo obespecheniya. Radiolektronika, informatika, upravlenie, 2010, no. 2 (23), pp. 130-138 (In Russ.).
3. Bakhtizin V.V., Neborskiy S.N. Model zhiznennogo tsikla programmnikh sredstv pri razrabotke na osnove gibkikh metodov. Dokladi BGYuIR, 2008, no. 8 (38), pp. 65-69 (In Russ.).
4. Sirotenko F.F. Principy raboti i vozmozhnosti sistemi upravleniya versiyami. Naukoemkie tekhnologii v kos-micheskikh issledovaniyakh Zemli, 2010, no 1. pp. 15-17 (In Russ.).
5. Shurygin V.N., Sivachenko D.A. Sistemi kontrolya versiy. VestnikMGUP, 2015, no. 5, pp. 103-104 (In Russ.).
6. Scott Chacon and Ben Straub. Pro Git (2nd ed.). Berkely, CA, USA: Apress, 2014. 456 p.
7. Bryan O'Sullivan. Mercurial: The Definitive Guide. O'Reilly Media. 2009, 284 p.
8. Gold, Robert. Control flow graphs and code coverage. Applied Mathematics and Computer Science. 2010. No. 4, pp. 739-749.
9. Feist M.D., Santos E.A., Watts I., Hindle A. Visualizing Project Evolution through Abstract Syntax Tree Analysis. 2016 IEEE Working Conference on Software Visualization, 2016, pp. 11-20.
10. Kasyanov V.N., Evstigneev V.A. Grafi v programmi-rovanii: obrabotka, vizualizatsiya i primenenie. SPb.: BKhV-Peterburg, 2003, 1104 p. (In Russ.).
11. Pogrebnoy A.V. Constructing graph models for software system development and analysis. 2017 J. Phys.: Conf. Ser. Available at: http://iopscience.iop.org/article/10.1088/ 1742-6596/803/1/012118/pdf (accessed: October 3, 2018).
12. Demer M., Emmert-Shtraib F., Tsoy R.Yu., Var-muza K. Noviy funktsional informativnosti dlya analiza structure khimicheskikh grafov. Bulletin of Tomsk Polytechnic University, 2010, vol. 316, no 5, pp. 5-11 (In Russ.).
13. Dehmer M., Emmert-Streib F., Tsoy R.Y., Varmuza K. Quantum Frontiers of Atoms and Molecules. New York, Nova Publishing, 2011, 673 p.
14. Pogrebnoy An.V. Metod opredeleniya skhodstva struktur grafov na osnove vydeleniya chastichnogo izo-morfisma v zadachakh geoinformatiki. Bulletin of Tomsk Polytechnic University, 2015, vol. 326, no. 11, pp. 56-66 (In Russ.).
15. Land A.H., Doig A.G. An Automatic Method of Solving Discrete Programming. Problems Econometrica, Vol. 28, no. 3, 1960, pp. 497-520.
Andrey V. Pogrebnoy
PhD student, School of Computer Science & Robotics,
Tomsk Polytechnic University
30, Lenin pr., Tomsk, Russia, 634050
Phone: +7-952-808-36-82
Email: avpogrebnoy@gmail.com