Towards a Language-Independent Approach for Reverse-Engineering of Software Product Lines

На основе статьи:

Tewfik Ziadi, Christopher Henard, Mike Papadakis, Mikal Ziane, and Yves Le Traon. 2014. Towards a language-independent approach for reverse-engineering of software product lines. In Proceedings of the 29th Annual ACM Symposium on Applied Computing (SAC '14). ACM, New York, NY, USA, 1064-1071. DOI: http://dx.doi.org/10.1145/2554850.2554874

Часто так получается, что во многих компаниях разрабатывают одни и те же программы (в смысле требуемых от них функций), используют одни и те же библиотеки, совершая при этом одни и те же ошибки. Для того чтобы сократить время разработки и избежать повторяющихся ошибок предполагается использовать feature-based подход, то есть собирать желаемый функционал системы из некоторого высокоуровневого конструктора. Будет рассмотрен алгоритм восстановления частей конструктора(то есть выделение feature) на основе исходного кода программ, сгенерированных с его помощью. Утверждается, что алгоритм не нуждается в каких-то специальных пометках в коде и не зависит от используемого языка программирования.

В статье активно используются различные термины. Хорошо бы их пояснить.

  • Feature - одно из требований к продукту
  • Software Product Line (SPL) - Линейка ПО - высокоуровневый конструктор, позволяющий быстро собрать систему, отвечающую заданным требованиям из набора компонент
  • FST - Дерево синтаксического разбора для требований. Подробнее описано в [1]. Строго говоря, построение такого дерева зависит от языка, но авторы в [1] утверждают, что это “requires only a few hours of effort”(с). Каждой версии конечного ПО соответствует набор поддеревьев FST или набор CP.
  • Construction Primitive(CP) - Вершина в дереве разбора. Одна из деталей конструктора. Может быть обязательной для приложения или необязательной.
  • Set of components(SoCPs) - набор CP
Еще немного определений

Пусть <latex> AllP </latex> - набор всех программных продуктов, из которых мы хотим извлечь features. Тогда для элементов <latex> cp_1, cp_2 \in AllCP </latex> - набора всех СP определяется следующее отношение эквивалентности:

Отношение эквивалентности "зависимость":

<latex>(\exists P \in AllP cp_1 \in P \wedge cp_2 \in P ) \wedge (\forall P \in AllP cp_1 \in P \Leftrightarrow cp_2 \in P)</latex> Легко заметить, что это бинарное отношение является отношением эквивалентности.

Теперь сам алгоритм:

  1. На вход подаются файлы с исходным кодом программ, изготовленных с помощью линейки ПО.
  2. На основе этих файлов строятся FST с помощью фреймворка FeatureHouse
  3. Из FST извлекается набор CP
  4. Набор CP разбивается на классы эквивалентности относительно отношения “зависимость”(Здесь имеется ввиду зависимость между компонентами. По свойствам отношения эквивалентности ясно, что если есть зависимость, то CP лежат в одном классе эквивалентности).
  5. Каждый из непересекающихся классов представляет собой feature.
  6. С помощью фреймворка FeatureHouse генерируется код для features, полученных на предыдущем шаге.(Здесь опять же есть зависимость от целевого языка и для использования произвольного языка программирования требуется писать генератор кода из FST)

Исходный код 3х разных версий:

Соответствующие FST:

Этот подход является высокоуровневым, что лишает его гибкости и препятствует более широкому. Также он никак не учитывает возможные ограничения на выбор features. А ведь они могут быть взаимоисключающими. Для достижения независимости от языков нужно писать и поддерживать парсер для FeaturesHouse. Если посмотреть на статью [1], то можно понять что написать хороший парсер можно только для объектно-ориентированных языков. Чтобы написать такой парсер для Haskell или C, нужно наложить дополнительные ограничения на структуру кода.

[1] Sven Apel, Christian Kastner, and Christian Lengauer. 2009. FEATUREHOUSE: Language-independent, automated software composition. In Proceedings of the 31st International Conference on Software Engineering (ICSE '09). IEEE Computer Society, Washington, DC, USA, 221-231. DOI=10.1109/ICSE.2009.5070523 http://dx.doi.org/10.1109/ICSE.2009.5070523

[2] Tewfik Ziadi, Christopher Henard, Mike Papadakis, Mikal Ziane, and Yves Le Traon. 2014. Towards a language-independent approach for reverse-engineering of software product lines. In Proceedings of the 29th Annual ACM Symposium on Applied Computing (SAC '14). ACM, New York, NY, USA, 1064-1071. DOI: http://dx.doi.org/10.1145/2554850.2554874