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 | }@ |