“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 210 — #220
i
i
i
i
i
i
i
i
210
4
• La programmation concurrente dataflow
@ et :=), comme une variable affectable dans les langages impératifs. Les cellules
ont été introduites dans le chapitre 1. Avec les cellules, la définition du composant
ressemblerait à ceci :
fun {SC ...}
Ctr={NewCell 0}
proc {P1 ...} Ctr:=@Ctr+1 ... end
proc {P2 ...} ... {P1 ...} {P2 ...} end
proc {P3 ...} ... {P2 ...} {P3 ...} end
fun {Count} @Ctr end
in ´export´(p1:P1 p2:P2 p3:P3 count:Count) end
Dans cette solution, l’interface du composant a une fonction supplémentaire, Count,
et les interfaces à P1, P2 et P3 sont inchangées. Le module qui appelle SC n’a aucun
travail administratif à faire. Le compte est automatiquement initialisé à zéro quand
le composant est instancié. On peut appeler Count à tout moment pour obtenir la
valeur actuelle du compte. On peut aussi ignorer Count complètement, et dans ce
cas le composant a exactement le même comportement qu’avant (sauf une toute petite
différence de performance).
La figure 4.13 compare les deux approches. La figure montre le graphe d’appels
d’un programme avec un composant Main qui appelle le sous-composant SC. Un
graphe d’appels est un graphe orienté dans lequel chaque nœud représente une procédure et il y a une arête entre chaque procédure et les procédures qu’elle appelle. Dans
la figure 4.13, SC est appelée à partir de trois endroits dans le composant principal.
Composant
principal
Main
Main
P3
P1
P2
Sous−composant
Avec un accumulateur
Avec l’état explicite
SC
P3
P1
P2
SC
Figure 4.13 Les changements nécessaires pour compter les appels de la procédure P1.
i
i
i
i
i
i
i
i
210
4
• La programmation concurrente dataflow
@ et :=), comme une variable affectable dans les langages impératifs. Les cellules
ont été introduites dans le chapitre 1. Avec les cellules, la définition du composant
ressemblerait à ceci :
fun {SC ...}
Ctr={NewCell 0}
proc {P1 ...} Ctr:=@Ctr+1 ... end
proc {P2 ...} ... {P1 ...} {P2 ...} end
proc {P3 ...} ... {P2 ...} {P3 ...} end
fun {Count} @Ctr end
in ´export´(p1:P1 p2:P2 p3:P3 count:Count) end
Dans cette solution, l’interface du composant a une fonction supplémentaire, Count,
et les interfaces à P1, P2 et P3 sont inchangées. Le module qui appelle SC n’a aucun
travail administratif à faire. Le compte est automatiquement initialisé à zéro quand
le composant est instancié. On peut appeler Count à tout moment pour obtenir la
valeur actuelle du compte. On peut aussi ignorer Count complètement, et dans ce
cas le composant a exactement le même comportement qu’avant (sauf une toute petite
différence de performance).
La figure 4.13 compare les deux approches. La figure montre le graphe d’appels
d’un programme avec un composant Main qui appelle le sous-composant SC. Un
graphe d’appels est un graphe orienté dans lequel chaque nœud représente une procédure et il y a une arête entre chaque procédure et les procédures qu’elle appelle. Dans
la figure 4.13, SC est appelée à partir de trois endroits dans le composant principal.
Composant
principal
Main
Main
P3
P1
P2
Sous−composant
Avec un accumulateur
Avec l’état explicite
SC
P3
P1
P2
SC
Figure 4.13 Les changements nécessaires pour compter les appels de la procédure P1.
