“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 256 — #266
i
i
i
i
i
i
i
i
256
5
• La programmation avec état explicite
Chaque appel à Module.apply crée un ensemble de nouveaux modules. Cette
opération fait partie du module Module. Si le foncteur est stocké dans un fichier, il
faudra d’abord le charger avant d’appeler Module.apply.
La communication des composants
Une fois liés ensemble, les composants doivent communiquer. Nous donnons six des
protocoles les plus populaires pour la communication des composants, dans l’ordre
croissant du degré de l’indépendance des composants :
1. La procédure : l’application est séquentielle et un composant appelle l’autre
comme une procédure. Le composant qui appelle n’est pas nécessairement le
seul qui initie des appels ; il peut y avoir des appels imbriqués où le lieu de
contrôle passe et repasse entre les composants. Mais il n’y a qu’un seul lieu de
contrôle global, ce qui lie fortement les deux composants.
2. La coroutine : plusieurs composants s’exécutent indépendamment, mais dans
un contexte séquentiel. Cela introduit le concept d’une coroutine. Chaque fois
qu’un composant en appelle un autre, l’autre continue où il s’était arrêté. Il
y a plusieurs lieux de contrôle, un par composant. Cette organisation est plus
relâchée que la précédente, mais les composants sont toujours dépendants parce
qu’ils s’exécutent en alternance.
3. L’interaction concurrente et synchrone : chaque composant s’exécute de façon
indépendante et peut initier et terminer les communications avec un autre composant, selon un protocole accepté par les deux. Les composants sont concurrents. Il
y a plusieurs lieux de contrôle, les fils, qui s’exécutent indépendamment (voir chapitre 4). Chaque composant fait des appels synchrones, c’est-à-dire que chaque
appel attend une réponse avant de continuer.
4. L’interaction concurrente et asynchrone : un ensemble de composants concurrents qui communiquent par des canaux asynchrones. Chaque composant envoie
des messages aux autres, mais ne doit pas attendre une réponse avant de continuer.
Les canaux peuvent avoir un ordre premier entré premier sorti (FIFO, « first-in,
first-out »), où les messages sont reçus dans l’ordre de leur envoi, ou ne pas
avoir d’ordre. Les canaux s’appellent des flots dans le chapitre 4. Dans cette
organisation, chaque composant connaît l’identité du composant avec lequel il
communique.
5. La boîte à lettres concurrente est une variation du protocole précédent. Les
canaux asynchrones se comportent comme des boîtes à lettres. Il est possible
d’extraire un message d’un canal (par exemple, en utilisant la correspondance
par formes) sans perturber les messages qui restent. C’est une organisation très
utile pour beaucoup de programmes concurrents. Cette technique est utilisée
i
i
i
i
i
i
i
i
256
5
• La programmation avec état explicite
Chaque appel à Module.apply crée un ensemble de nouveaux modules. Cette
opération fait partie du module Module. Si le foncteur est stocké dans un fichier, il
faudra d’abord le charger avant d’appeler Module.apply.
La communication des composants
Une fois liés ensemble, les composants doivent communiquer. Nous donnons six des
protocoles les plus populaires pour la communication des composants, dans l’ordre
croissant du degré de l’indépendance des composants :
1. La procédure : l’application est séquentielle et un composant appelle l’autre
comme une procédure. Le composant qui appelle n’est pas nécessairement le
seul qui initie des appels ; il peut y avoir des appels imbriqués où le lieu de
contrôle passe et repasse entre les composants. Mais il n’y a qu’un seul lieu de
contrôle global, ce qui lie fortement les deux composants.
2. La coroutine : plusieurs composants s’exécutent indépendamment, mais dans
un contexte séquentiel. Cela introduit le concept d’une coroutine. Chaque fois
qu’un composant en appelle un autre, l’autre continue où il s’était arrêté. Il
y a plusieurs lieux de contrôle, un par composant. Cette organisation est plus
relâchée que la précédente, mais les composants sont toujours dépendants parce
qu’ils s’exécutent en alternance.
3. L’interaction concurrente et synchrone : chaque composant s’exécute de façon
indépendante et peut initier et terminer les communications avec un autre composant, selon un protocole accepté par les deux. Les composants sont concurrents. Il
y a plusieurs lieux de contrôle, les fils, qui s’exécutent indépendamment (voir chapitre 4). Chaque composant fait des appels synchrones, c’est-à-dire que chaque
appel attend une réponse avant de continuer.
4. L’interaction concurrente et asynchrone : un ensemble de composants concurrents qui communiquent par des canaux asynchrones. Chaque composant envoie
des messages aux autres, mais ne doit pas attendre une réponse avant de continuer.
Les canaux peuvent avoir un ordre premier entré premier sorti (FIFO, « first-in,
first-out »), où les messages sont reçus dans l’ordre de leur envoi, ou ne pas
avoir d’ordre. Les canaux s’appellent des flots dans le chapitre 4. Dans cette
organisation, chaque composant connaît l’identité du composant avec lequel il
communique.
5. La boîte à lettres concurrente est une variation du protocole précédent. Les
canaux asynchrones se comportent comme des boîtes à lettres. Il est possible
d’extraire un message d’un canal (par exemple, en utilisant la correspondance
par formes) sans perturber les messages qui restent. C’est une organisation très
utile pour beaucoup de programmes concurrents. Cette technique est utilisée
