• Aucun résultat trouvé

Jusqu’à présent, nous avons représenté les aspects par la fonction abstraiteΣψ. Dans cette section, nous précisons une partie de la structure de cette fonction en présentant les points de coupure.

En représentant les points de coupure par des motifsP, la fonctionΣψ est de la forme : Σψ(i:C,Σ) = if match(P, i)then(C )else nil avecC = toweave(σ(φ), i:C)

avecσla substitution telle queσ(P) =i

Un aspect est tissé, si l’instruction courante est filtrée par le motif de l’aspectP. Ce processus de filtrage est représenté par la fonctionmatchqui prend un motif et une instruction en paramètre et retourne un booléen.

match:P ×Instruction→bool

oùInstruction représente l’ensemble des instructions. Dans le cas où l’instruction est filtrée, une nouvelle configuration(C

)est retournée. La continuationC est le nouveau code dans lequel l’action σ(φ)est tissée avant, après ou autour de i. La fonctiontoweave(qui n’est pas définie ici) place l’action à la bonne place dans la continuation suivant le type de l’aspect (before,afteretaround.cf.Sections 2.3 et 2.4). L’étatΣest le nouvel état qui peut conte-nir de nouvelles instances d’aspects. Certaines informations telles que des noms, des types, des valeurs,etc. peuvent être passées d’une instruction à l’action par l’intermédiaire des variables de motif auxquelles des valeurs sont associées par la substitutionσtelle queσ(P) =i.

Un motif standard peut être un terme ou une conjonction, disjonction et négation de motifs. La grammaire deP est définie par :

P ::= Ti | P1∧P2 | P1∨P2 | ¬P

Un termeTi a la même syntaxe qu’une instruction mais peut comporter des variables de motif. Par exemple, le motifcall xfiltre tout appel de fonction en associant à la variablexle nom de la fonction. La fonctionmatchest définie comme suit :

match(Ti, i) = true si∃σtel queσ(Ti) =i

= false sinon

match(P1∧P2, i) = match(P1, i)∧match(P2, i)

match(P1∨P2, i) = match(P1, i)∨match(P2, i)

match(¬P, i) = ¬match(P, i)

La négation peut entraîner des complications car un motif avec une négation peut filtrer une instruction selon plusieurs substitutions. Par exemple, le point de coupure¬(call x), filtre toutes instructions différentes decall. Ce motif filtre par exemple une affectation avec une infinité de valeurs possible pourx. De même¬(x := 2)filtre toutes instructions différentes dex := 2. Il filtre par exemple un appel de méthode avec également une infinité de valeurs possible pourx. Dans ce contexte, nous supposons qu’une variable de motif utilisée dans l’action est associée à une unique valeur par le motif.

2.6 Conclusion

Nous avons présenté un cadre formel qui permet de décrire tout programme à aspect in-dépendamment d’un langage de programmation et sans nécessiter d’étape de traduction. Notre

cadre repose sur une sémantique opérationnelle petit pas qui décrit des aspects inspirés d’As-pectJ tout en étant plus général (par ex.,les aspectsarounddécrits filtrent n’importe quel type d’instruction). Comme présenté au Chapitre 1 (voir Section 1.3.1), Jagadeesan et coll. [BJJR04] proposent un calcul pour la description des programmes à aspect et qui est aussi indépendant d’un langage de programmation. Ce calcul utilise un langage basé sur l’envoi de messages pour décrire l’exécution des aspects. Cette démarche implique une traduction de tout programme de base et aspects vers le langage du calcul. De plus contrairement à notre cadre et aux langages d’aspect existants (AspectJ [KHH+01a], CaesarJ [AGMO06], AspectC [CKFS01],etc.), ce cal-cul ne permet pas de filtrer les instructions des actions. La sémantique que propose Clifton et coll. [CLW03] permet de décrire plusieurs langages d’aspect mais ils dépendent du paradigme objet. De plus, les points de coupure de ces langages doivent être traduits vers un langage de point de coupure général qui permet de filtrer des points de jonction très proches de ceux d’AspectJ. Clifton et Leavens [CL06] proposent une sémantique d’un sous ensemble d’As-pectJ. Cette sémantique décrit uniquement des aspects de typearoundet seuls les appels et exécutions de méthodes sont filtrés par les aspects. Wand et coll. [WKD04] proposent une sé-mantique d’un langage qui possède les concepts du sous ensemble impératif d’AspectJ basé sur du Scheme. Ce langage sélectionne uniquement les appels et exécutions de méthodes, et les exécutions des aspects. Cette sémantique nous semble complexe et difficilement utilisable.

L’originalité de notre approche réside dans le fait que les aspects sont décrits indépendam-ment d’un langage de base précis. Seules les constructions nécessaires du langage de base sont introduites (par ex.,la séquence pour les aspectsbeforeetafter). Une autre originalité est la séparation du processus de filtrage en deux étapes : un filtrage statique qui permet de sélec-tionner l’instruction courante et un filtrage dynamique (par ex., correspondant au prédicat du point de coupureif(...)d’AspectJ). Les travaux précédents (voir Section 1.3.1) utilisent un tissage similaire à notre filtrage statiquec.-à-d.,pour chaque point de jonction, l’ensemble des aspects qui le filtre est tissé. Ils ne formalisent pas le filtrage dynamique qui rend difficile à an-ticiper la sémantique des programmes de style AspectJ. En effet, comme présenté à l’exemple de la Section 1.3.1, page 16, des aspects peuvent être activés pendant l’exécution des actions suite par exemple à une modification de variable qui rend vrai un prédicat d’un point de coupure

if(...)qui ne l’était pas lors du filtrage statique.

Ce cadre est utilisé dans le Chapitre 3 pour raisonner sur le programme de base et les aspects sans regarder le code tissé. Dans le Chapitre 4, le cadre formel est utilisé pour concevoir des langages d’aspect qui assurent par construction que les aspects appartiennent à une catégorie déterminée d’aspects. Enfin, dans le Chapitre 5, nous illustrons l’expressivité de ce cadre, en l’utilisant dans un premier temps pour décrire de façon séparée des constructions importantes (des points de coupure, les exceptions et les instances d’aspect) des langages d’aspect différents, et dans un deuxième temps pour montrer la correction d’une transformation d’aspect.

Chapitre 3

Aspects et préservation de propriétés