Leveraging Software Product Lines Engineering in the Construction of Domain Specific Languages
Application de l'ingénierie des lignes de produits à la construction des langages dédiés.
Résumé
The use of domain-specific languages (DSLs) has become a successful technique in the development
of complex systems because it furnishes benefits such as abstraction, separation of concerns, and improvement of productivity. Nowadays, we can find a large variety of DSLs providing support in various domains. However, the construction of these languages is an expensive task. Language designers are intended to invest an important amount of time and effort in the definition of formal specifications and tooling for the DSLs that tackle the requirements of their companies.
The construction of DSLs becomes even more challenging in multi-domain companies that provide several products. In this context, DSLs should be often adapted to diverse application scenarios, so language development projects address the construction of several variants of the same DSL. At this point, language designers face the challenge of building all the required variants by reusing, as much as possible, the commonalities existing among them. The objective is to leverage previous engineering efforts to minimize implementation from scratch.
As an alternative to deal with such a challenge, recent research in software language engineering has proposed the use of product line engineering techniques to facilitate the construction of DSL variants. This led the notion of language product lines i.e., software product lines where the products are languages. Similarly to software product lines, language product lines can be built through two different approaches: top-down and bottom-up. In the top-down approach, a language product line is designed and implemented through a domain analysis process. In the bottom-up approach, the language product line is built up from a set of existing DSL variants through reverse-engineering techniques.
In this thesis, we provide support for the construction of language product lines according to the two approaches mentioned before. On one hand, we propose facilities in terms of language modularization and variability management to support the top-down approach. Those facilities are accompanied with methodological insights intended to guide the domain
analysis process. On the other hand, we introduce a reverse-engineering technique to support the bottom-up approach. This technique includes a mechanism to automatically recover a language modular design for the language product line as we as a strategy to synthesize a variability model that can be later used to configure concrete DSL variants. The ideas presented in this thesis are implemented in a well-engineered language workbench. This implementation facilitates the validation of our contributions in three case studies. The first case study is dedicated to validate our languages modularization approach that, as we will explain later in this document, is the backbone of any approach supporting language product lines. The second and third case studies are intended to validate our contributions on top-down and bottom-up language product lines respectively.
La complexité croissante des systèmes logiciels modernes a motivé la nécessité d’´élever le niveau d’abstraction dans leur conception et mis en oeuvre. L’usage des langages dédiés a émergé pour répondre à cette nécessité. Malgré les avantages fournis par l’usage des langages dédiés, cette approche présente des inconvénients. L’un de ces inconvénients est le coût de la construction des langages dédiés. La définition et l’outillage de ces langages est une tâche complexe qui prend du temps et qui requiert des compétences techniques spécialisées. Le processus de développement des langages dédiés devient encore plus complexe lorsque nous prenons en compte le fait que, comme les langages naturels, les langages dédiés peuvent avoir plusieurs dialectes. Dans ce contexte, un dialecte est une variante d’un langage qui introduit des différences au niveau de la syntaxe et/ou de la sémantique.
Afin de répondre à la question de recherche précédemment énoncée, la communauté de recherche autour de l’ingénierie des langages a proposé l’usage des lignes de produits. En conséquence, la notion de lignes de langages a récemment émergé. Une ligne de langages est une ligne de produis où les produits sont des langages. D’une manière similaire aux lignes de produits, les lignes de langages peuvent être construites à partir de deux approches différentes: top-down et bottom-up. Dans l’approche top-down, les lignes de langages sont conçues et mis en œuvre au travers d’un processus d’analyse du domaine. Dans l’approche bottom-up, les lignes des langages sont construites à partir d’un ensemble de variantes des langages existant au travers de techniques d’ingénierie inverse.
Dans cette thèse, nous proposons : (1) de facilitées pour le design modulaire des langages ainsi comme la gestion de la variabilité dans le lignes de langages; (2) une technique d’ingénierie inverse pour la construction automatique d’une ligne de langages à partir d’un ensemble de variantes existents. Les idées sont validées à travers de plusieurs cas d’étude.