• Aucun résultat trouvé

3.2 Principe de la derivation

4.1.6 Principe

Soit A un arbre abstrait qui code un terme T(nous employons le terme d'\arbre" car nous ne considerons que les nuds qui codent les calculs, et non les feuilles qui repre-sentent les variables, et que l'on peut voir partagees ou non). SoitGun graphe oriente

80 CHAPITRE4. R 

ESOLUTION DESCONFLITSD'ACC 

ES AUX VARIABLES

contenant l'arbreA, auquel nous ajoutons les arcs qui codent les ordres de precedence souhaitables entre calculs. Les ordres codes par le arcs de G sont compatibles avec l'ordre de reduction applicatif (celui des langages de programmation conventionnels, puisque nous avons choisi Ada comme langage du domaine concret).

Notations: Un produit cartesien de variables sera note ~v. Chaque arc du graphe G

du nudN

i vers le nud N

j est de ni par une relationR(N i ;N j): De nition 4.1: R T(N i ;N

j) est la relation entre les nudsN i et N

j due a la dependance des calculs. Nous considerons a la fois les ordres de dependance fonctionnelle (arcs deA orien-tes du nud operande N

i vers le pereN

j) et ceux de dependance operationnelle (de maniere a respecter la semantique des operateurs prede nis. Dans le terme \let x =t

1 in t

2" par exemple, le calcul de la valeur t

1 a ectee a la variable x

doit preceder le calcul de tout sous-terme det

2 dontx est operande).

R ~ v <(N i ;N

j) est la relation entre les nudsN ietN

j signi ant que l'evaluation du texte engendre a partir du nudN

iavant celui engendre a partir du nudN

j est moins co^uteuse car elle evite de dupliquer les variables ~v. Les arcs orientes N

i ! N

j

representent cette relation de precedence. Par abus de langage, nous notons R

< l'ensemble des arcs de nis par cette relation, et R

T l'ensemble de ceux de nis par la dependance des calculs (ensemble des arcs de l'arbre abstrait). Nous notons egalement R

* = R T

[R

<. Nous designons par

R(N i

;N

j) un arc quelconque de R

* lorsque la distinction entre son appartenance a

R

T ou aR

< n'a pas d'importance (ni l'eventuelle variable partagee dans le cas d'un arc deR

<).

Les etapes suivantes de la resolution des con its d'acces sont appliques a G. Nous noteronsN

Initle nud du grapheGqui represente le terme code (il s'agit deN

1lorsque

G code le termeTen partie droite de l'equation a deriver).

L'algorithme de resolution des con its d'acces aux variables procede en plusieurs etapes :

1. Nous calculons pour chaque nud N

i les attributsdestinations, les pre- et post-a ectations et les variables utilisees et modi ees par tous les nuds du sous-arbre dont N

i est la racine. Ces attributs sont synthetises a partir des attributs des nuds operandes. Ils sont calcules en un parcours de tous les nuds du graphe, en profondeur d'abord:

 Calcul pour chaque nud des pre- et post-a ectations telles qu'elles sont decrites par la regle 3.5 page 69. Ceci permet d'ajouter a l'ensemble des cal-culs codes dans l'arbre abstrait, les a ectations supplementaires necessaires aux a ectations du resultat nal aux parametres formels de sortie (quand il y a lieu), ainsi que les a ectations necessaires a la derivation d'un nud \if-then-else" pour avoir une destination commune aux resultats des deux calculs des sous-termes \then" et \else".

4.1. MOTIVATIONS,NOTATIONS,PRINCIPE 81

 Calcul de l'ensemble des doublets N i

N

j tels que le nud N

i utilise des variables ~x qui sont modi ees par le nud N

j. Nous notons R ~ x <(N i ;N j) la relation ainsi de nie. Le respect de l'ordre d'evaluation de ces nuds determine une duplication ou non de la variable. Les arcs orientes N

i ! N

j sont ajoutes a l'arbre abstrait en attribuant les nuds N

i a l'attribut

antecedents de N j.

Nous calculons a partir des utilisations et modi cations qui sont obtenues au nud N

Init, les relations R

< entre nuds qui doivent utiliser une variable avant sa modi cation par un autre nud.

2. Calcul de l'ensemble des cycles qui peuvent exister dans le graphe que nous venons de construire.

3. Recherche de l'ensemble des arcs qui doivent ^etre enleves pour supprimer les cycles. Chaque arc enleve signi ant une duplication de variable, les arcs sont choisis de maniere a minimiser le co^ut en recopie (pour simpli er, le calcul de ce co^ut sera estime au nombre de variables recopiees, et l'algorithme tient compte des cycles ayant des parties communes).

4. Traduction du graphe de calcul obtenu (d.a.g.) en un corps de programme a la syntaxe Ada. Nous ferons une interpretation de l'ensemble du graphe ou, pour chaque nud evalue nous genererons le texte imperatif correspondant.

Le graphe oriente sans cycleG

0=ResConf(G) equivalent aG, et dont la derivation dans le domaine concret est sans con it d'acces aux variables est tel que:

 8N 2 GN 2 G

0, et la valeur calculee au nud N dans le graphe G

0 est celle calculee dans le graphe G,

 8 R(N;N 0)2Gun arc oriente, R(N;N 0)2G 0,  8N 2G

0 tel que la variable xest modi ee N, 8N 0 2G 0, nous avons : { soitN 0 n'utilise ni ne modi e x, { soitN

0 utilise ou modi ex, maisN etN

0appartiennent, l'un a un arbre qui code un sous-terme \then", l'autre a un arbre qui code le sous-terme \else" d'un m^eme \if-then-else",

{ soit N

0 utilise x sans la modi er, et il existe une sequence de n nuds de

G 0 [N i 1 ;:::;N i n] tels que: N i1 =N 0,N in =N, et 8j 2[1;:::;n,1]9 R(N ij ;N ij+1)2G 0 Remarque: R(N ij ;N

ij+1) est un arc deR T

[R <. Consequences: Soit G

0 = ResConf(G) un graphe oriente qui code un terme T. Chaque nud code un sous-terme deT, et les arcs orientes codent les ordres d'execution entre les textes engendres de chaque nud pour calculer la valeur du sous-terme qui y

82 CHAPITRE4. R 

ESOLUTION DESCONFLITSD'ACC 

ES AUX VARIABLES

est code. Le grapheG

0 est sans con it d'acces a une variable entre les textes engendres de chaque nud:

 Quelle que soit le variablex, parametre formel de l'operateur d'inter^et ou variable de nie par un let,

{

si x est a la fois utilisee et modi ee dans G

0, alors les utilisations se font avant les modi cations,

{

si x est modi ee dans G

0, alors elle n'est utilisee qu'une seule fois en mode entree-sortie pour sa valeur de parametre formel de l'operateur d'inter^et.

 Soient tet u deux sous-termes disjoints deT, G t et G

u leurs graphes respectifs, tels que les con its internes aG

t doivent ^etre resolus independamment. Le graphe

G 0

t =ResConf(G

t) doit ^etre considere comme un unique nud, et s'il existe un con it d'acces a une variable x entre un nud N

i de G 0

t et un nudN j de G

u, il doit ^etre resolu, soit en xant un ordre de precedence entre les executions des codes engendres pourG

0 t et N

j, soit en e ectuant une duplication de sauvegarde de x. Si G

0

t n'est pas choisi pour utiliser ou modi er x, une unique duplication, en un nudduplication(x;x

2) ajoute aG

u, est necessaire. Nous remplacons alors toute occurence de xdans G

0 t par x

2.

Exemple de l'application recursive de l'algorithme de resolution de con its:

Exemple 4.4:

Soit le terme a deriver:

T= if b(g(x))then

f(g(x);x) else

h(x) endif

Les variables qui sont modi ees dans le domaine concret par le code engendre pour appliquer l'implementation de l'operateur ou du constructeur dont elles sont operandes, sont soulignees. L'operateur g, par exemple est implemente par une procedure G qui modi e son unique parametre.

4.1. MOTIVATIONS,NOTATIONS,PRINCIPE 83 Soit le codage de Ten un arbre abstrait ou les nuds sont les suivants:

y y y x x x f( , ) h( ) x b( ) g( ) g( ) x

if then else endif

N 4 N 5 N 2 N 3 N 1 N 6

Les destinations des resultats du \then" et du \else" sont supposees calculees (de maniere a ^etre communes). Soity la destination de N

4 et N

6 dans notre exemple. Nous appelons recursivement notre algorithme de resolution des con its (etapes 2, 3 et 4), sur les nudsN

4: \then" et N

6: \else".

Nous avons un con it d'acces a x dans le sous-terme \then" car le texte derive de N

5 modi e x et doit (obligatoirement) ^etre execute avant celui derive de N 4. La seule solution au cycle forme parN

4 et N 5 (N

5 avant N

4 pour respecter la dependance fonctionnelle, etN

4 avant N

5 pour eviter de dupliquerx) est queN

5 modi ex et que

N

4 utilise une duplication de x (dans le cadre general, nous preferons faire modi er la variable con ictuelle plut^ot que sa copie, pour permettre d'avoir des modi cations successives d'une m^eme variable, de maniere a obtenir un ot tel qu'il est de ni au chapitre 6).

Nous ajoutons donc un nudN

7=duplication(x;x

2) en attributduplicationsdeN 4

racine du sous-termethen, qui devientf(g(x);x

2). Sif est implemente par une fonction

F avec les parametres dans le m^eme ordre que les operandes def, nous obtenons comme code derive deN

4:

([[duplication(x;x

2); G(x); y:=F(x;x

2); ]];hjyji)

Les con its des sous-termes \then" et \else" sont resolus. Les variables utilisees et modi ees par le nud \if-then-else"N

1(en tant que variables utilisees ou modi ees par le texte derive pour l'application de l'operateur ou constructeur deN

1) sont considerees ^etre celles des sous-termes \then" et \else". Le nudN

1utilise et modi exsans con it:

x est utilisee parN 1 en N

5 et N 7,

x est modi ee parN 1 en N

5. Nous pouvons maintenant resoudre les con its entreN

1 et les autres nuds:N 2 et

N

3. Les codes derives deN 1 et N

3 modi ent tous les deux la variablev. Nous pouvons donc choisir l'un ou l'autre pour la modi er, et deux solutions (avec notre methode) sont possibles:

84 CHAPITRE4. R 

ESOLUTION DESCONFLITSD'ACC 

ES AUX VARIABLES

Nous ajoutons donc un nud N

8 = duplication(x;x

3) en attribut duplications de

N

1 et remplacons x parx

3, soit dans N

3, soit dans les sous-termes then et else: ([[duplication(x;x 3); G(x); ifB(x) then begin duplication(x 3 ;x 2); G(x 3); y:=F(x 3 ;x 2); end else y:=H(x 3); endif ]], hjyji) ([[duplication(x;x 3); G(x 3); ifB(x 3) then begin duplication(x;x 2); G(x); y:=F(x;x 2); end else y:=H(x); endif ]], hjyji)