Project

General

Profile

Module extractor strategies » History » Revision 3

Revision 2 (Alexey Polushkin, 06/15/2018 04:41 PM) → Revision 3/4 (Alexey Polushkin, 06/15/2018 04:46 PM)

h1. Module extractor stategies 

 h2. Single File 

 Эта стратегия сопоставляет каждому объектному файлу, полученому после команды компиляции, свой модуль, который содержит файлы, из которых был скомпилирован этот объектный файл. Данная стратегия не имеет специфичных требований к проекту.  
 Стратегия не имеет параметров. 

 Пример. 
 @"Module extractor": { 
   "name": "Single File" 
 }@ 

 h2. Linux Kernel 

 Эта стратегия предназначена для извлечения модулей для ядра Linux и объектных файлов ядра Linux.  
 Стратегия имеет следующие параметры 
 *modules* : bool. По умолчанию True. Данный параметр сообщает стратегии извлекать модули ядра Linux (не объектные файлы самого ядра) 
 *kernel* : bool. По умолчанию False. Данный параметр сообщает стратегии излвекать объектные файлы самого ядра 
 *kernel subdirs* : bool. По умолчанию False. Данный параметр сообщает стратегии о необходимости группировать объектные файлы самого ядра в один модуль, если они находятся в одной подсистеме 

 Пример. 
 @"Module extractor": { 
   "name": "Linux kernel", 
   "modules": True, 
   "kernel": False 
 }@ 

 h2. Graph Partitioner 

 Данная стратегия предназначена для извлечения модулей, используя сторонние инструменты: Scotch, Metis. Является предпочитаемой стратегией для использования в произвольных проектах. 
 Стратегия сводит задачу декомпозиции программы на модули к задаче декомпозиции графа на подграфы. Каждому объектному файлу, полученному в результате комплияции сопоставляется вершина графа. Дуга ведет из вершины А в вершину В, если файл, соответстующий вершине А вызывает функции из файла, соответствующего вершине В. Каждой вершине приписано число - размер файла в строках кода. Каждой дуге приписано число - число вызываемых функций. Используемые инструменты производят декомпозицию графа на подграфы таким образом, что сумма чисел, приписанных разрезанным дугам минимальна, а сумма чисел, приписанных вершинам каждого подграфа стремятся быть схожими. 
 Стратегия имеет следующие параметры 
 *bin path* : String. Путь до исполняемого файла, осуществляющего декомпозицию графа. Для Scotch это файл gpart, для Metis gpmetis 
 *tool* : String. Используемый инструмент. Возможные значения - "scotch", "metis" 
 *must modules* : List<List<String>>. Список из списка файлов, которые должны быть в одном модуле. 
 *partitions* : Int. Число частей, на которые необходимо осуществить декомпозицию. 
 *module size* : Int. Размер модуля, выраженный в числе файлов, входящих в него. 
 При этом, должен быть указан один из параметров *partitions*, *module size*. 

 Пример. 
 @"Module extractor": { 
   "name": "Graph Partitioner", 
   "bin path": "/path/to/bin/metis/gpmetis", 
   "tool": "metis", 
   "must modules": [["file1.c", "file2.c"], ["file3.c", "file4.c"]], 
   "module size": 3 
 }@ 

 h2. Vertex Merge 

 Данная стратегия предназначена для извлечения модулей, компонуя файлы в один модуль, если их вызывают одни и те же модули. Данная стратегия хорошо применима к проектам, содержащим библиотеки или расширения (busybox, nginx, apache). Данная стратегия сводит задачу декомпозиции к задаче декомпозиции графа как и предыдущая стратегия. Затем, на каждой итерации находит две вершины, у которых есть общий предок (вершина, из которой есть дуга в эти вершины) и при этом, размер симметричной разности предков каждой вершины минимален среди остальных. Затем, эти две вершины сливаются в одну, образуя модуль. При этом, у вершин из одной подсистемы приоритет на слияние при прочих равных. 
 Стратегия имеет следующие параметры 
 *max iters* : Int. По умолчанию 200. Максимальное число итераций слияния. Стратегия может завершить свое выполнение и до достижения заданного числа, если не найдены вершины для слияния 
 *max locs* : Int. Максимальное число строк для создаваемых модулей 
 *max files* : Int. Максимальное число файлов для создаваемых модулей 
 *same subsystems* subsystms* : Bool. По умолчанию False. Производить слияние только файлов из одной подсистемы 

 Пример. 
 @"Module extractor": { 
   "name": "Vertex Merge", 
   "max locs": 5000, 
   "max files": 5, 
   "same subsystems": True 
 }@ 

 h2. Breadth 

 Данная стратегия предназначена для извлечения модулей, обходя граф завимостей между файлами в ширину и генерируя модули до достижения их максимального размера.  
 Данная стратегия имеет следующие параметры 
 *max locs* : Int. Максимальный размер модуля в строках кода 
 *module size* : Int. По умолчанию 3. Максимальный размер модуля в файлах. 

 Пример. 
 @"Module extractor": { 
   "name": "Breadth", 
   "max locs": 5000, 
   "module size": 5 
 }@