“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 265 — #275
i
i
i
i
i
i
i
i
5.7 Exercices
265
Implémentez les opérations NewCollector et EndCollect avec cette
représentation.
– C est une paire H|T, où H est la tête de la liste collectionnée et T est une
cellule qui contient sa queue non liée. Collect est implémentée ainsi :
proc {Collect C X}
T in
{Exchange C.2 X|T T}
end
Implémentez les opérations NewCollector et EndCollect avec cette
représentation.
– Nous comparons les deux implémentations par rapport à la gestion de mémoire.
Utilisez le tableau de la section 3.6.2 pour calculer combien de mots de
mémoire sont alloués par chaque version de Collect. Dans chaque version,
combien de ces mots deviennent inactifs tout de suite ? Que cela implique-t-il
pour le ramassage de miettes ? Quelle version est la meilleure ?
Cet exemple est tiré de la conception du système Mozart. La collection dans la
boucle for a d’abord été implémentée avec une version. Cette implémentation a
ensuite été remplacée par l’autre. (Remarquez que les deux versions fonctionnent
correctement dans un contexte concurrent, c’est-à-dire si Collect est appelée
à partir de plusieurs fils.)
➤ Exercice 7 — Le passage par nom
La section 5.4.3 montre comment coder le passage par nom dans le modèle avec
état. Pour cet exercice, considérez l’exemple suivant, qui vient de [26] :
procedure swap(callbyname x,y:integer);
var t:integer;
begin
t:=x; x:=y; y:=t
end;
var a:array [1..10] of integer;
var i:integer;
i:=1; a[1]:=2; a[2]=1;
swap(i, a[i]);
writeln(a[1], a[2]);
Cet exemple montre un comportement curieux du passage par nom. L’exécution
de l’exemple ne permute pas i et a[i], comme on pourrait s’y attendre. Cela
montre une interaction indésirable entre l’état explicite et l’évaluation retardée
d’un argument.
– Expliquez cet exemple avec vos connaissances du passage par nom.
© Dunod – La photocopie non autorisée est un délit
Précédent

- 280/370

Suivant