Project

General

Profile

Module extractor strategies » History » Version 4

Evgeny Novikov, 06/15/2018 07:30 PM

1 4 Evgeny Novikov
h1. Module extractor strategies
2 1 Alexey Polushkin
3
h2. Single File
4
5
Эта стратегия сопоставляет каждому объектному файлу, полученому после команды компиляции, свой модуль, который содержит файлы, из которых был скомпилирован этот объектный файл. Данная стратегия не имеет специфичных требований к проекту. 
6
Стратегия не имеет параметров.
7
8 3 Alexey Polushkin
Пример.
9
@"Module extractor": {
10
  "name": "Single File"
11
}@
12
13 1 Alexey Polushkin
h2. Linux Kernel
14
15
Эта стратегия предназначена для извлечения модулей для ядра Linux и объектных файлов ядра Linux. 
16
Стратегия имеет следующие параметры
17
*modules* : bool. По умолчанию True. Данный параметр сообщает стратегии извлекать модули ядра Linux (не объектные файлы самого ядра)
18
*kernel* : bool. По умолчанию False. Данный параметр сообщает стратегии излвекать объектные файлы самого ядра
19
*kernel subdirs* : bool. По умолчанию False. Данный параметр сообщает стратегии о необходимости группировать объектные файлы самого ядра в один модуль, если они находятся в одной подсистеме
20
21 3 Alexey Polushkin
Пример.
22
@"Module extractor": {
23
  "name": "Linux kernel",
24
  "modules": True,
25
  "kernel": False
26
}@
27
28 1 Alexey Polushkin
h2. Graph Partitioner
29
30
Данная стратегия предназначена для извлечения модулей, используя сторонние инструменты: Scotch, Metis. Является предпочитаемой стратегией для использования в произвольных проектах.
31
Стратегия сводит задачу декомпозиции программы на модули к задаче декомпозиции графа на подграфы. Каждому объектному файлу, полученному в результате комплияции сопоставляется вершина графа. Дуга ведет из вершины А в вершину В, если файл, соответстующий вершине А вызывает функции из файла, соответствующего вершине В. Каждой вершине приписано число - размер файла в строках кода. Каждой дуге приписано число - число вызываемых функций. Используемые инструменты производят декомпозицию графа на подграфы таким образом, что сумма чисел, приписанных разрезанным дугам минимальна, а сумма чисел, приписанных вершинам каждого подграфа стремятся быть схожими.
32
Стратегия имеет следующие параметры
33 2 Alexey Polushkin
*bin path* : String. Путь до исполняемого файла, осуществляющего декомпозицию графа. Для Scotch это файл gpart, для Metis gpmetis
34 1 Alexey Polushkin
*tool* : String. Используемый инструмент. Возможные значения - "scotch", "metis"
35
*must modules* : List<List<String>>. Список из списка файлов, которые должны быть в одном модуле.
36
*partitions* : Int. Число частей, на которые необходимо осуществить декомпозицию.
37
*module size* : Int. Размер модуля, выраженный в числе файлов, входящих в него.
38
При этом, должен быть указан один из параметров *partitions*, *module size*.
39
40 3 Alexey Polushkin
Пример.
41
@"Module extractor": {
42
  "name": "Graph Partitioner",
43
  "bin path": "/path/to/bin/metis/gpmetis",
44
  "tool": "metis",
45
  "must modules": [["file1.c", "file2.c"], ["file3.c", "file4.c"]],
46
  "module size": 3
47
}@
48
49 1 Alexey Polushkin
h2. Vertex Merge
50
51
Данная стратегия предназначена для извлечения модулей, компонуя файлы в один модуль, если их вызывают одни и те же модули. Данная стратегия хорошо применима к проектам, содержащим библиотеки или расширения (busybox, nginx, apache). Данная стратегия сводит задачу декомпозиции к задаче декомпозиции графа как и предыдущая стратегия. Затем, на каждой итерации находит две вершины, у которых есть общий предок (вершина, из которой есть дуга в эти вершины) и при этом, размер симметричной разности предков каждой вершины минимален среди остальных. Затем, эти две вершины сливаются в одну, образуя модуль. При этом, у вершин из одной подсистемы приоритет на слияние при прочих равных.
52
Стратегия имеет следующие параметры
53
*max iters* : Int. По умолчанию 200. Максимальное число итераций слияния. Стратегия может завершить свое выполнение и до достижения заданного числа, если не найдены вершины для слияния
54
*max locs* : Int. Максимальное число строк для создаваемых модулей
55
*max files* : Int. Максимальное число файлов для создаваемых модулей
56 3 Alexey Polushkin
*same subsystems* : Bool. По умолчанию False. Производить слияние только файлов из одной подсистемы
57 1 Alexey Polushkin
58 3 Alexey Polushkin
Пример.
59
@"Module extractor": {
60
  "name": "Vertex Merge",
61
  "max locs": 5000,
62
  "max files": 5,
63
  "same subsystems": True
64
}@
65
66 1 Alexey Polushkin
h2. Breadth
67
68
Данная стратегия предназначена для извлечения модулей, обходя граф завимостей между файлами в ширину и генерируя модули до достижения их максимального размера. 
69
Данная стратегия имеет следующие параметры
70
*max locs* : Int. Максимальный размер модуля в строках кода
71
*module size* : Int. По умолчанию 3. Максимальный размер модуля в файлах.
72 3 Alexey Polushkin
73
Пример.
74
@"Module extractor": {
75
  "name": "Breadth",
76
  "max locs": 5000,
77
  "module size": 5
78
}@