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 deni par une relationR(N i ;N j): Denition 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 predenis. Dans le terme \let x =t
1 in t
2" par exemple, le calcul de la valeur t
1 aectee 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 signiant 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 denis par cette relation, et R
T l'ensemble de ceux denis 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-aectations et les variables utilisees et modiees 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-aectations 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 aectations supplementaires necessaires aux aectations du resultat nal aux parametres formels de sortie (quand il y a lieu), ainsi que les aectations 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 modiees par le nud N
j. Nous notons R ~ x <(N i ;N j) la relation ainsi denie. 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 modications qui sont obtenues au nud N
Init, les relations R
< entre nuds qui doivent utiliser une variable avant sa modication 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 signiant une duplication de variable, les arcs sont choisis de maniere a minimiser le co^ut en recopie (pour simplier, 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 modiee N, 8N 0 2G 0, nous avons : { soitN 0 n'utilise ni ne modie x, { soitN
0 utilise ou modiex, 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 modier, 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 denie par un let,
{
si x est a la fois utilisee et modiee dans G0, alors les utilisations se font avant les modications,
{
si x est modiee dans G0, 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 eectuant une duplication de sauvegarde de x. Si G
0
t n'est pas choisi pour utiliser ou modier 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 modiees 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 modie 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 modie 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 modiex et que
N
4 utilise une duplication de x (dans le cadre general, nous preferons faire modier la variable con ictuelle plut^ot que sa copie, pour permettre d'avoir des modications successives d'une m^eme variable, de maniere a obtenir un ot tel qu'il est deni 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 modiees par le nud \if-then-else"N
1(en tant que variables utilisees ou modiees 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 modiexsans con it:
x est utilisee parN 1 en N
5 et N 7,
x est modiee 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 modient tous les deux la variablev. Nous pouvons donc choisir l'un ou l'autre pour la modier, 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)