76
XII международная конференция CEE-SECR / РАЗРАБОТКА ПО 28 - 29 октября, Москва Михаил Малеванный Устойчивая привязка к синтаксическим конструкциям в изменяющемся коде Академия Строительства и Архитектуры Донской Государственный Технический Университет

Устойчивая привязка к синтаксическим конструкциям в изменяющемся коде

Embed Size (px)

Citation preview

XII международная конференцияCEE-SECR / РАЗРАБОТКА ПО28 - 29 октября, Москва

Михаил Малеванный

Устойчивая привязка к синтаксическим конструкциям в

изменяющемся кодеАкадемия Строительства и Архитектуры

Донской Государственный Технический Университет

ВведениеПредыдущий доклад (SECR-2015):«Аспектная разметка кода для быстрой навигации по проекту»

Реализация:https://github.com/MikhailoMMX/AspectMarkup

2

Сквозная функциональность

Рабочее множество3

Рабочее множество...

...его:Трудно найтиЛегко потерятьНевозможно забыть вспомнить

4

Chris Parnin and Spencer Rugaber. Resumption strategies for interrupted programming tasks. Software Quality Journal 19, 1 (March 2011), 5-34. DOI=http://dx.doi.org/10.1007/s11219-010-9104-9

«Только в 7% случаев перед редактированием не выполняется навигация по коду»

«Только в 10% случаев активная деятельность начинается в пределах минуты после возврата к задаче»

5

6

7

Разметка кода

8

560 полей и методов206 методов visit

9

Задача 1Рабочее множество 1

Задача 2Рабочее множество 2

10

Навигационные ссылки в 1C:Предприятие

11

Навигационная ссылка в IDE

12

•Почта•Баг-

трекер•…

Модель привязки•Сохраняемая информация

13

Синтаксическое деревоСтроится легковесным парсером

по исходному кодуОбщее для разных языковНе зависит от среды разработки

A

B2

B1

C1 C2

C3

D1

D2

E14

Сохраняемая информацияИмя + заголовокТипКонтекст

Родительские узлыСоседние узлыДочерние узлы

A

B2

B1

C1 C2

C3

D1

D2

E15

Сохраняемая информацияИмя + заголовокТипКонтекст:

Родительские узлы

A

B2

B1

C1 C2

C3

D1

D2

E16

Сохраняемая информацияИмя + заголовокТипКонтекст:

Родительские узлыСоседние узлы *Подузлы *

A

B2

B1

C1 C2

C3

D1

D2

E17

Имя и заголовок (Java)

public Component addChild(Component child){

repository.connectComponents(this, child, EdgeKind.CONTAINS);

return child;}private int id;

Заголовок

Имя

18

Типы узлов (Java)

public Component addChild(Component child){

repository.connectComponents(this, child, EdgeKind.CONTAINS);

return child;}private int id;

Тип: Method

Тип: Field

19

Внешний контекст (С#)

• namespace N• class C1 : IVisitor

• namespace N• class C2 : IVisitor

namespace N{

class C1 : IVisitor { public void visit(IVisitor v) { } }

class C2 : IVisitor { public void visit(IVisitor v) { } }}

20

Горизонтальный контекст (yacc)

selection_statement : IF '(' expression ')' statement ELSE statement

IF'('

expression'('

ELSEstateme

nt...

IF'('

expression'('

statement

ELSE

...

21

Внутренний контекст (Pascal)

var X, Y : Double;

var Name, Address : string; Age : integer;

• X, Y : Double

• Name, Address: String

• Age : Integer

22

Модель привязки•Алгоритм поиска

в изменяющемся коде

23

T – исходный узелTi – узлы в новом файле

Для всех Ti вычисляем величину «похожести»:Si = Similarity(T, Ti)

Si ∈ [0, 1]; 0 = ничего общего, 1 = точное совпадение

Величина похожести

24

Редакционное расстояние

Минимальное количество правок, необходимых для преобразования одной строки в другую

Выше Редакционное расстояние – ниже Похожесть

3 версии: Имена (String) Заголовки (Lists<String>) Внешние контексты (List<Headers>)

25

Примеры метрики «похожести»

Строка 1 Строка 2 ПохожестьString String 1load_file loadFile 0.77nextInt nextDouble 0.4String Object 0

26

Примеры метрики «похожести»private static uint GetManagedResourceOffset( ManagedResource

resource, BlobWriter resourceWriter)

private static uint GetManagedResourceOffset( ManagedResource resource, BlobBuilder resourceWriter)

public string GetLine(int LineIndex)public bool IsDocumentOpen(string FileName)

= 0.95

27

= 0.33

Аналогия с помехоустойчивыми кодами

28

Аналогия с помехоустойчивыми кодами

29

Сущности

Аналогия с помехоустойчивыми кодами

30

int GetHashCode()

void WithAttributes()

event EventHandler(…)

void visit(statement)

void visit(expression)int Count()

async Task TestElseIf()

Аналогия с помехоустойчивыми кодами

31

Изменения

Аналогия с помехоустойчивыми кодами

32

Изменения

Аналогия с помехоустойчивыми кодами

33

Аналогия с помехоустойчивыми кодами

34

Изменения

Аналогия с помехоустойчивыми кодами

35

Пример неоднозначности поискаПервая версия:

class expr : Node{ public void Visit(Visitor _vis) { /* */ }}

Вторая версия:

class Expression : Node{ public void Visit(Visitor _vis) { /* */ }}

class Statement : Node{ public void Visit(Visitor _vis) { /* */ }}

Исходный фрагмент

Переименован

Добавлен

36

Разрешение неоднозначности поиска

37

Разрешение неоднозначности поиска

38

Исходный узел из _expr

из Expressionиз Statement

Исследование устойчивости привязки

39

Методика

Ревизия 1(началоанализа)

Ревизия 2(конец

анализа)Initial

commit Исследуемый период

Ревизии:

Привязкако всем

сущностямв ревизии 1

Проверкапривязки

в ревизии 2

40

Изменено файлов 95 из 2 668Изменено сущностей 406 из 83 082 (0,5%)

#326Началоанализа

#653Конец

анализа

#1Initial

commit 9 месяцевразработки

Ревизии:

41

Предварительный результат поиска узлов

246160 Выдан список узловУзел найден

42

Предварительный результат поиска узлов

246160 Выдан список узловУзел найден

43

Удаленные узлы

211

35

160Выдан список узловУзел удаленУзел найден

44

Удаленные узлы

211

35

160Выдан список узловУзел удаленУзел найден

45

Без удаленных узлов

211160 Выдан список узлов

Узел найден

46

Без удаленных узлов

211160 Выдан список узлов

Узел найден

47

Перемещенные узлы

100

111

160Выдан список узловУзел перемещенУзел найден

48

Перемещенные узлы

100

111

160Выдан список узловУзел перемещенУзел найден

49

Анализ перемещенных узлов

100

98

13

160

Выдан список узловВыдан список узлов (перемещенные)Узел найден (перемещенные)Узел найден

50

После учета перемещенных узлов

198173 Выдан список узлов

Узел найден

51

Результат поиска узлов

198173 Первый результат в

спискеУзел найден

52

Окончательный результат поиска узлов

371Найдено безошибочно

53

Окончательный результат поиска узлов

371Найдено безошибочно

100%54

Roslyn

55

Roslyn

Началоанализа

Конецанализа

Initialcommit

1 год разработки

56

Roslyn

Изменено файлов 2 584 из 4 995Изменено сущностей 20 534 из 152 271

(13,5%)

Началоанализа

Конецанализа

Initialcommit

1 год разработки

10 340 ревизий

57

Roslyn

Изменено сущностей: 20 534(...много)

58

Roslyn

Изменено сущностей: 20 534(...много)

Взята выборка из 500 случайных* сущностей* RandomShuffle(), SubList(0, 500).

59

Предварительный результат поиска узлов

132

368

Выдан список узловУзел найден

60

Предварительный результат поиска узлов

132

368

Выдан список узловУзел найден

61

Удаленные узлы

83

49

368

Выдан список узловУзел удаленУзел найден

62

Удаленные узлы

83

49

368

Выдан список узловУзел удаленУзел найден

63

После учета удаленных узлов

83

368

Выдан список узловУзел найден

64

После учета удаленных узлов

83

368

Выдан список узловУзел найден

65

Перемещенные узлы

78

5

368

Выдан список узловУзел перемещенУзел найден

66

Перемещенные узлы

78

5

368

Выдан список узловУзел перемещенУзел найден

67

Анализ перемещенных узлов

78

1

4368

Выдан список узловВыдан список узлов (перемещенные)Узел найден (перемещенные)Узел найден

68

После учета перемещенных узлов

79

372

Выдан список узловУзел найден

69

После учета перемещенных узлов

79

372

Выдан список узловУзел найден

70

Анализ неавтоматически найденных узлов

75

4

372

Первый результат в спискеНе первый результат в спискеУзел найден

71

Анализ неавтоматически найденных узлов

75

4

372

Первый результат в спискеНе первый результат в спискеУзел найден

72

Анализ автоматически найденных узлов

75

42

370

Первый результат в спискеНе первый результат в спискеОшибочный результатУзел найден

73

Окончательный результат поиска узлов

445

6

Узел найден безошибочноОшибочный результат

74

Окончательный результат поиска узлов

445

6

Найдено безошибочноОшибочный результат

98.7%75

РезультатPascalABC.NET326 ревизий9 месяцев

Roslyn10340 ревизий1 год

371

445

6

76