• Aucun résultat trouvé

1.3.6-Interopérabilité des lignes de produits logiciels

Les lignes de produits logiciels transposent les chaînes de production au monde du logiciel. Une ligne de produit représente un ensemble de systèmes qui partagent des propriétés communes satisfaisant des besoins spécifiques pour le domaine visé. Son objectif principal est d'augmenter la productivité et de diminuer le temps de réalisation des logiciels. Cet objectif peut être atteint en développant simultanément plusieurs logiciels dédiés au même domaine ou des logiciels paramétrés, à la place de les développer séparément.

L'ingénierie des lignes de produits représente une approche qui consiste à regrouper les méthodes, outils et techniques de développement et à maintenir une collection de systèmes logiciels similaires appartenant à un domaine particulier.

Les difficultés liées à cette approche résident dans la conception d’une architecture permettant de définir plusieurs produits en mettant en

évidence leurs points communs, mais aussi leurs différences.

Dans la littérature, [59] et [60] proposent de distinguer dans le développement des lignes de produits relevant de l’ « ingénierie du domaine » et de l' « ingénierie de l’application ». L’ingénierie du domaine consiste à développer et construire les « assets » qui seront réutilisés pour la construction de produits ; il s'agit de développer pour la réutilisation. L'ingénierie de l’application consiste à utiliser les « assets » pour la construction d’un produit ou d’une application particulière après cristallisation des points de variation ; il s’agit d’un développement par la réutilisation.

Dans la littérature, le développement des lignes de produits se fait en utilisant des techniques différentes :

Les techniques de compilation qui permettent la dérivation d’un

produit pendant la phase de compilation. Des exemples de ces techniques sont la compilation conditionnelle et le chargement de bibliothèques.

Les techniques liées aux langages de programmation : les langages

à objets ont apporté quelques techniques utiles pour implémenter la variabilité, comme par exemples le polymorphisme, la surcharge et la liaison dynamique.

Des approches de programmation : des approches récentes de

génie logiciel peuvent être utilisées pour implémenter et gérer la variabilité dans les systèmes. [61] [62] [63] proposent d’utiliser les aspects [64] pour la gestion de la variabilité dans les lignes de produits.

Des approches basées sur la modélisation des lignes de produits en

UML [65], ou en s’appuyant sur les mécanismes d’extension d’UML [59] [66].

Il faut noter dans ce contexte l'initiative de standardisation lancée par l'OMG en septembre 2009, qui vise à standardiser un langage commun pour spécifier la variabilité (CVL : Common Variability

Language) [67]. Ce langage de modélisation doit avoir les

mécanismes de gestion de la variabilité, permettant de gérer la variabilité au sein des lignes de produits et des langages dédiés proches.

Actuellement, le groupe de travail constitué afin de répondre à cet RFP travaille sur la spécification de la variabilité en utilisant un modèle complet des fonctionnalités attendues [68] [69] effectué sur la base des features diagrams [70].

Dans [71], une étude montre l’automatisation de procédures de génération du code à partir d'un langage de contrôle de la gestion des trains (TCL : Train Control Language), en utilisant le même langage de spécification de la variabilité que [69].

Pour conclure ce chapitre, nous avons vu qu'il existe un nombre important de techniques et approches qui essaient de résoudre le problème de l'interopérabilité. Dans le reste de cette thèse, nous nous situons dans la même lignée en essayant de trouver une solution au problème de l'interopérabilité au sein d'une famille de langages dédiés. Comme nous allons le voir, nous nous concentrons sur les techniques qui permettent de continuer d'utiliser les langages d'origine, en essayant aussi de nous concentrer sur l'unification des langages appartenant à la famille.

Chapitre II

2- Sémantique des langages et spécification

algébrique

La syntaxe d'un langage de programmation décrit ses expressions valides sans en préciser le sens. Le mot sémantique qui est relatif au sens (du grec sêmantikos) fournit une signification à cette description textuelle. Étant donné que la syntaxe est un domaine bien défini et bien formalisé qui ne s’intéresse qu'aux propriétés structurelles et grammaticales du langage, une sémantique est nécessaire pour savoir comment exploiter le langage, quel type de problème il peut résoudre et comment un programme peut répondre aux exigences d'une application. Tous ces points relatifs à la programmation proprement dite ne sont perceptibles qu'au travers de la définition d'une sémantique.

La sémantique d'un langage de programmation est composée de la sémantique statique et de la sémantique dynamique. La sémantique statique s'intéresse au respect des règles grammaticales non directement exprimables par la grammaire comme le contrôle du bon usage des types ou les règles de transmission des paramètres à un sous-programme ; elle ne fait référence qu'au texte source du programme et se détermine à la compilation. La sémantique dynamique représente la partie la plus significative dans le sens où elle se rattache directement à l'exécution de ce même texte source en donnant une signification à chacune de ses instructions ou en précisant la valeur retournée par l'évaluation d'une expression à partir de données d'entrée. Pour un langage de programmation donné, la sémantique permet de relier les règles syntaxiques aux règles comportementales.

La sémantique d'un langage de programmation peut s’écrire sous différentes formes parmi lesquelles quatre approches sont généralement exploitées [72] : il s'agit des sémantiques opérationnelle, dénotationnelle, axiomatique et algébrique. La sémantique opérationnelle ne s’intéresse pas seulement au résultat de l'exécution, mais aussi à la façon dont s’exécute le programme. La sémantique dénotationnelle traduit les constructions syntaxiques du langage en fonctions mathématiques au travers de dénotations, alors que la sémantique axiomatique vérifie les propriétés du programme sur la base d'assertions avant et après l'exécution d'une instruction. La

sémantique algébrique qui découle de travaux sur les types abstraits algébriques, traduit les non terminaux d'une grammaire en types et fournit les équations sémantiques qui associent à un programme un terme conforme au type abstrait décrivant le langage ; ce mode de spécification a l'avantage de disposer d'outils et de se prêter à la définition de propriétés pouvant être démontrées rigoureusement.