THESE présentée par Jean Marie FAVRE pour obtenir le titre de Docteur de l’Université Joseph Fourier - Grenoble I (arrêtés ministeriels du 5 juillet 1984 et du 30 mars 1992) Spécialité : Informatique Une approche pour la maintenance et la ré-ingénierie globale des logiciels date de soutenance : 26 octobre 1995 Composition du Jury : J.P. Verjus K. Bennett J. Estublier G. Kahn S. Krakowiak A. Van Lamsweerde Thèse préparée au sein du Laboratoire de Génie Informatique - Institut Imagà Carolina et à notre famille❤ ❤ ❤ Je tiens vivement à remercier les membres du jury pour m’avoir fait l’honneur d’y participer et pour le temps qu’ils ont consacrés à cette thèse malgré leurs emplois du temps souvent surchargés : Monsieur Jean-Pierre Verjus, Professeur à l’Institut National Polytechnique de Grenoble, Directeur de l’Institut de Mathématique Appliquée de Grenoble (IMAG), Directeur de l’INRIA Rhône-Alpes, pour m’avoir fait l’honneur de présider le jury de cette thèse. Monsieur Keith Bennett, Professeur à l’université de Durham, Directeur du Laboratoire pour la Maintenance à Durham, Editeur du journal international “Software Maintenance”, pour son accueil à Durham le mois dernier, pour avoir lu en détails cette thèse bien qu’elle soit écrite dans la langue de Molière et pour être venu d’Angleterre malgré un calendrier bien chargé. Monsieur Gilles Kahn, Directeur de recherche INRIA, Directeur Scientifique de l’INRIA France, et Monsieur Axel Van Lamsweerde, Professeur à ...
THESE
présentée par
Jean Marie FAVRE
pour obtenir le titre de
Docteur de l’Université Joseph Fourier - Grenoble I
(arrêtés ministeriels du 5 juillet 1984 et du 30 mars 1992)
Spécialité : Informatique
Une approche pour la maintenance et
la ré-ingénierie globale des logiciels
date de soutenance : 26 octobre 1995
Composition du Jury :
J.P. Verjus
K. Bennett
J. Estublier
G. Kahn
S. Krakowiak
A. Van Lamsweerde
Thèse préparée au sein
du Laboratoire de Génie Informatique - Institut Imagà Carolina et à notre famille❤
❤
❤
Je tiens vivement à remercier les membres du jury pour m’avoir fait l’honneur d’y participer et
pour le temps qu’ils ont consacrés à cette thèse malgré leurs emplois du temps souvent
surchargés :
Monsieur Jean-Pierre Verjus, Professeur à l’Institut National Polytechnique de Grenoble,
Directeur de l’Institut de Mathématique Appliquée de Grenoble (IMAG), Directeur de l’INRIA
Rhône-Alpes, pour m’avoir fait l’honneur de présider le jury de cette thèse.
Monsieur Keith Bennett, Professeur à l’université de Durham, Directeur du Laboratoire pour la
Maintenance à Durham, Editeur du journal international “Software Maintenance”, pour son
accueil à Durham le mois dernier, pour avoir lu en détails cette thèse bien qu’elle soit écrite dans
la langue de Molière et pour être venu d’Angleterre malgré un calendrier bien chargé.
Monsieur Gilles Kahn, Directeur de recherche INRIA, Directeur Scientifique de l’INRIA France,
et Monsieur Axel Van Lamsweerde, Professeur à l’Université Catholique de Louvain (Belgique),
éditeur du journal international “Transactions on Software Engineering and Methodology” pour
avoir consacré de leur temps à rapporter sur ce travail et pour les remarques qu’ils m’ont faites.
Monsieur Jacky Estublier, Directeur de cette thèse, Directeur de recherche CNRS, Directeur de
l’équipe ADELE, pour m’avoir accueilli dans son équipe et pour m’avoir toujours fait confiance.
Je tiens également à lui témoigner ma reconnaissance pour m’avoir permis de travailler dans
d’aussi bonnes conditions.
Monsieur Sacha Krakowiak, Professeur à l’Université Joseph Fourier, Co-directeur du projet
Guide et de l’unité de recherche Bull-Imag, pour m’avoir accueilli en stage, il y a déjà bien
longtemps, dans le projet Guide, et pour l’honneur qu’il me fait aujourd’hui de participer à ce
jury.
Je voudrais aussi remercier tous les membres de l’équipe ADELE qui, de deux personnes lors de
mon arrivée, est passée à plus d’une dizaine aujourd’hui. Tous m’ont permis d’une manière ou
d’une autre de travailler dans la joie et la bonne humeur...
Je tiens aussi à remercier les membres de la escuela de computaciòn qui m’ont si bien accueilli
lors de mon séjour à l’Universidad Central de Venezuela en tant que coopérant. Je garde un très
bon souvenir de ces deux années et de l’accueil exceptionnel qui m’a été fait.
Finalement, ou plutôt avant tout, je tiens à remercier ma famille pour sa patiente et son soutient
inconditionnel ainsi que Carolina pour son courage et son amour .
A tous, merci !!!Introduction
Alors que l’informatique est résolument tournée vers l’avenir, cette thèse se concentre sur le
passé ; non pas par nostalgie mais plutôt parce que le futur des logiciels âgés est une
question d’actualité.
I.1 Contexte
Présentons tout d’abord le contexte général, puis le contexte spécifique.
I.1.1 Contexte général : maintenance, programmation globale et ré-ingénierie
Trop souvent recherche et industrie s’opposent, tout comme théorie et pratique, comprendre et
faire, développer et maintenir, etc.
Cette thèse se réclame comme faisant partie du Génie Logiciel et à ce titre ces oppositions
devraient plutôt être vues comme des complémentarités. En effet, le génie logiciel, comme toute
discipline d’ingénierie, est la rencontre entre la science et l’industrie [Shaw90]. Cette définition
marque la direction à suivre, même si l’on a parfois tendance à l’oublier.
Le génie logiciel est en effet une discipline très large. Selon que l’on se place dans un milieu
académique ou un milieu industriel, sa signification est susceptible de changer. Pour certains ce
terme fait référence à des méthodes abstraites qu’il est aujourd’hui impossible d’appliquer en
pratique. Pour d’autres, il fait référence à des pratiques éloignées de tout fondement scientifique.
Quoi qu’il en soit ces deux visions ne sont que les extrêmes d’un spectre voué à être équilibré.
Cette thèse retient trois thèmes du génie logiciel : la maintenance, la programmation globale et la
ré-ingénierie. Ces thèmes correspondent à des préoccupations industrielles particulièrement
importantes et pourtant elles sont souvent regardées avec dédain dans le monde académique. Cette
tendance est sans doute liée au fait que les notions et les concepts sous-jacents sont
particulièrement flous. Mais n’est ce pas justement parce qu’il y a des problèmes que l’on doit
chercher des solutions? En fait, ces trois thèmes correspondent en eux même à des oppositions.
12
La maintenance s’oppose au développement.
Bien que les problèmes qu’elle pose soient très importants, pendant longtemps ils ont tout
simplement été ignorés. Bien qu’aujourd’hui la situation se soit améliorée, la maintenance reste
l’une des principales zones d’ombre du génie logiciel. Maintenance et rapiéçage sont encore trop
souvent associés dans la réalité.
En génie logiciel, presque tous les efforts pour diminuer les coûts de la maintenance consistent à
améliorer la qualité des logiciels développés. Cette approche est indispensable. Pourtant elle est
loin d’être suffisante : (1) Tout au long de la maintenance, les modifications successives du
logiciel détériore sa qualité initiale. (2) La notion même de qualité évolue dans le temps, tout
comme la technologie. (3) Améliorer la qualité des logiciels lors du développement n’est valable
que pour le futur ; le problème de la maintenance consiste à considérer le passé et le présent.
La programmation globale s’oppose à la programmation détaillée.
Dès le début de l’informatique, ce sont les notions de la programmation détaillée qui ont été
étudiées : les algorithmes et les structures de données. Après plus de 5 décennies, cette discipline
a acquis un niveau de maturité important. Dans ce domaine des théories sont parfois utilisées. Il
est par exemple possible de décrire formellement la sémantique d’un langage de programmation.
Au contraire la programmation globale est basée sur des notions floues. On parle de versions, de
configurations et d’objets dérivés, sans pour autant que les concepts associés soient toujours les
mêmes ; en tout cas ils ne sont que rarement définis formellement. Il est vrai que ce thème a reçu
bien peu d’attention par rapport à la programmation détaillée : ce n’est qu’au cours de la dernière
décennie que des recherches actives y ont été consacrées.
Aujourd’hui de nombreux systèmes de programmation globale voient le jour. Pourtant les
fondements sur lesquels ceux-ci sont basés ne sont pas toujours très clairs. Dans ces conditions
comparer et évaluer ces différents systèmes est difficile. Dans bien des cas, l’apparition d’un
nouveau système correspond plus à des variations de surface qu’à des améliorations de fond.
Cette situation pourrait être comparée, dans le domaine de la programmation détaillée, à la
prolifération de nouveaux langages de programmation dans les années 60. Par contre, dans ce
dernier cas, ces apparitions ont étés suivies par un processus de classification et de rationalisation.
Remarquons finalement que dans le domaine de la programmation globale, l’état de la pratique
est encore dominé par l’utilisation de techniques rudimentaires conçues dans les années 70.
La ré-ingénierie est liée à la différence entre l’état de l’art et l’état de la pratique. Il s’agit d’une
approche pour diminuer le coût de la maintenance. Comme son nom l’indique, l’idée sous jacente
est de “refaire” en utilisant des méthodes et des techniques (plus) adaptées. Refaire, non
seulement parce que quelque chose a été mal fait, mais aussi parce que la manière de faire a
changé. En fait la ré-ingénierie est un support pour l’évolution des logiciels existants mais peut
être vue aussi comme un moyen facilitant le transfert de technologie.
La rétro-ingénierie est l’une des composantes de la ré-ingénierie. Comme son nom le suggère, il
s’agit de “faire les choses à l’envers”. Une telle approche est contestable dans bien des cas ; mais
elle peut aussi être utile. Les fonctionnalités offertes par les logiciels âgés ont souvent été affinées
au cours de longues années et il peut être préférable d’examiner le logiciel existant que de faire
une nouvelle analyse des besoins.
La ré-ingénierie s’est surtout intéressée à la programmation détaillée. Par contre son intersection
avec la programmation globale est quasi-inexplorée.3
I.1.2 Contexte spécifique : maintenance en présence de préprocesseurs
Le point de départ de cette thèse est plus spécifique. Nous nous intéressons aux problèmes posés
par l’utilisation de préprocesseurs dans le domaine de la programmation globale et de son rapport
avec la maintenance et la ré-ingénierie. Le cas du préprocesseur CPP est plus particulièrement
étudié.
CPP est le préprocesseur du langage C. Pour les chercheurs il s’agit d’un outil dépassé et pourtant
il est cité dans de nombreux articles... Pour beaucoup de programmeurs il s’agit d’un outil du
passé mais aussi du présent ; dans le futur, il risque d’être encore présent... L’utilisation extensive
et excessive des préprocesseurs rend les programmes impossibles à lire ; pourtant ils sont utilisés
pour écrire de grands volumes de code... L’utilisation des préprocesseurs rend la maintenance
difficile et pourtant ils sont largement utilisés par les chargés de maintenance... La présence des
préprocesseurs est un problème pour les programmeurs, les chargés de maintenance, les
constructeurs d’outils et pourtant ils sont toujours là... Malgré les problèmes occasionnés par les
préprocesseurs, aucun support ne leur est dédié...
Ces paradoxes forment le