4.2 L’impl´ementation de l’inf´erence de type
5.1.2 La partie K du langage
La partie Kdu langage consiste en l’introduction d’une nouvelle structure
de composant dans le langage, que nous nommons kell par h´eritage du
kell-calcul. Cette structure vient avec deux ensembles d’op´erateurs permettant de
manipuler les deux s´emantiques ind´ependantes de cette structure.
La s´emantique d’isolation. Les kells forment des fronti`eres entre les
diff´e-rentes parties d’un programme, permettant ainsi de structurer, d’abstraire, et de
contrˆoler les interactions entre les diff´erents constituants un logiciel. Par d´efaut,
les capacit´es de communication d’un kell sont les mˆeme que dans [98] : il ne peut
communiquer qu’avec ses composants proches, c’est `a dire celui qui le contient
(sonp`ere) et ceux qu’il contient (sesfils). Il est toutefois assez facile de voir que
cette isolation forte est extrˆemement p´enalisante lorsque l’on veut
communi-quer avec des composants distants : dans le kell-calcul, il faut encoder une telle
communication distante entre les kellsa et b par une chaˆıne de transmetteurs
qui font passer les messages d’un composant `a un autre, au travers de toute
la structure s´eparant les deux kellsaetb. C’est pourquoi nous avons introduit
dans notre extension desportestr`es similaires `a celles que nous avons pr´esent´ees
dans le Chapitre 3. Leur principe est similaire : elles ouvrent la fronti`ere des
composants pour certains canaux de communication, et les communications
uti-lisant ces canaux ne sont alors plus limit´ees `a ˆetre entre composants p`ere et fils.
N´eanmoins, quelques modifications ont ´et´e apport´ees sur nos portes : dans le
chapitre 3, les communications ´etaient asynchrones et les messages pouvaient
franchir les fronti`eres o`u la porte ´etait ouverte. Ici, la communication est
syn-chrone et, afin de permettre une communication `a la kell-calcul mˆeme lorsque
les portes sont ferm´ees, nous autorisons `a toute communication de franchir au
plus une fronti`ere qui n’est pas ouverte. Nous donnons de plus la capacit´e aux
composants de contrˆoler l’ouverture et la fermeture des portes de leurs
compo-sants fils, rendant dynamique la fronti`ere qui dans notre travail pr´ec´edent ´etait
statique. Enfin, les portes ne sont pas de simples noms ici, comme des atomes,
mais des structures ind´ependantes qu’il faut cr´eer. Ainsi, en cr´eant une porte
personnelle, on peut s’assurer que seul des entit´es de confiance peuvent recevoir
des messages sur ce canal s´ecuris´e o`u peuvent circuler des donn´ees sensibles.
La s´emantique de mobilit´e. Les kells forment aussi des entit´es d’ex´ecution
ind´ependantes que l’on stopper, dupliquer et d´eplacer. Le principe fondamental
de ces diff´erentes op´erations est lapassivation[98]. La passivation est une
com-mande permettant de prendre un kell et de le d´etruire en sauvegardant son ´etat
dans une valeur sp´ecifique. Ainsi, il devient possible de d´etruire cette valeur,
auquel cas le composant est d´efinitivement perdu, ou de l’envoyer vers un autre
kell qui pourra relancer son ex´ecution. Plus pr´ecis´ement, la partieKde notre
langage contient une proc´edure de base,Pack K X, qui prend le contenu du kell
K, et le passive dans une valeur li´ee `a X. Notons que la structure du
compo-sant K est toujours pr´esente, bien que vide, afin que les acc`es ult´erieurs `a la
variableKne causent pas d’erreur. Une telle structure peut de plus ˆetre utilis´ee
de nouveau en y injectant un nouvel ensemble de commande via une proc´edure
de remplacement de kell. Les valeurs issues de la passivation d’un composant,
que nous nommonsvaleurs pack´ees, sont sujettes `a deux types d’op´erations :
des op´erations de modifications et une op´eration de d´eploiement. Cette derni`ere
prend le contenu de la valeur (c’est `a dire tout les processus et les kells fils) et les
places dans le kell courant, prˆet `a ˆetre ex´ecut´e `a nouveau. N´eanmoins afin que
toutes ces structures puissent s’ex´ecuter convenablement, il peut ˆetre n´ecessaire
des les adapter au pr´ealable `a leur nouvel environnement. C’est pourquoi nous
offrons la possibilit´e de modifier les valeurs pack´ees, permettant ainsi de mettre
`a jour certaines r´ef´erences et donn´ees en vu de leur future d´eploiement.
L’en-semble de ces manipulations sur les composants composent uncycle de vie, que
nous r´esumons Figure 5.2. Finalement, un composant poss`ede une variable de
actif passivé K[S1] K[ ] Pack(S1) K[S2] Pack(S! 1) K[S3] K[S3| S! 1] valeur packée
cr´eation d’un kell : kell {K} S1 end passivation : {Pack K X} remplacement du kellK: kell {K} S2 end actif actif actif modification de la valeurX: { Mark X M X’} re-d´eploiement deX: {Unpack X’ Y}
Figure 5.2 – Le cycle de vie d’un composant
statutqui est non li´ee lors de l’ex´ecution normale du kell, et prend une variable
lors de l’arrˆet du composant : soit‘packed’si l’arrˆet est dˆu `a une commande de
passivation, soit‘failed’si l’arrˆet est caus´e par une erreur d’ex´ecution.
Apr`es cette br`eve introduction, nous pr´esentons la syntaxe de notre
exten-sion, qui se limite `a la d´efinition d’une structure de kell, ainsi que diff´erentes
proc´edures de base manipulant portes, kells et valeurs pack´ees.
Nous rajoutons au constructions pr´ec´edentes trois nouveaux ´el´ements : les
kells, lesporteset lapassivation. La syntaxe de ces commandes pour manipuler
ces objets est donn´ee Figure 5.3, o`u les termes K, X, Y, Z, G sont de simples
variables.
Les kells. Ces composants sont cr´e´es avec la commandekell{K} S endo`uK
est la variable li´ee au kell cr´e´e, etS le code ex´ecut´e dans un nouveau processus
par le composant. De plus, la commande {Status K X} permet de monitorer
les composants Oz/K, et de v´erifier leur ´etat de fonctionnement. Il est ainsi
assez facile de d´etecter une erreur d’ex´ecution dans un kell, et de lancer le
code de gestion d’erreur appropri´e. Toute cette gestion est expliqu´ee plus en
d´etail dans la Partie 5.2. Une des probl´ematique de la structure de composant
vient de sa capacit´e `a ˆetre passiv´e, son ex´ecution momentan´ement suspendue
et reprise dans un environnement pouvant ˆetre totalement diff´erent de celui
S ::= . . .
| kell{K} S end Cr´eation d’un kell
| {NewGate X} Cr´eation de porte
| {Send G X} Envoi d’un message
| {Receive G X} Recpetion d’un message
| {Open K G} Ouvre la porteG
| {Close K G} Ferme la porteG
| {Pack K X} Stoppe l’ex´ecution d’un kell
| {Unpack X Y} Continue l’execution d’un kell
| {Mark X Y Z} Remplacement des portes d’un kell stopp´e
| {Status K X} Lecture du status d’un kell
Figure5.3 – La syntaxeK
d’origine. Une telle op´eration peut alors ˆetre source d’incoh´erences dans l’´etat du
syst`eme lorsque l’ex´ecution du composant passiv´e d´epend de son environnement.
C’est pourquoi nous imposons dans notre approche une isolation forte de nos
composants qui ne peuvent communiquer qu’au travers des portes. Une premi`ere
contrainte que nous avons afin d’assurer cette isolation est que le code S ne
doit pas compoter de r´ef´erence `a des variables non li´ees (`a part K qui sera
li´ee durant la cr´eation du kell). En effet, siS comporte des variables non li´ees
provenant de l’ext´erieur du composant, cela impliquerait que le composant et
son environnement peuvent communiquer via ces variables, empˆechant ainsi tout
contrˆole des communications associ´es aux portes. Notons que cette contrainte
n’est pas difficile `a impl´ementer, car elle demande des structures similaires `a
celles utilis´ees pour l’unification, qui est d´ej`a pr´esente dansOz.
Les portes comme outils de communications. La commande {NewGate
G} cr´ee une nouvelle porte (qui est une valeur), et la lie `a la variableG. Cette
variable peut ensuite ˆetre utilis´ee pour les envois de messages ({Send G X}) et
leur r´eception ({Receive G X}). Les ´echanges de messages se font par
rendez-vous atomiques, comme pour le π-calcul synchrone : les envois et r´eceptions
de message sont bloquantes, et ne r´eussissent que lorsqu’une r´eception ou un
envoi correspondant a lieu. Cette s´emantique, avec l’isolation des composants,
permettent d’assurer le bon fonctionnement
3de la commandePackqui stoppe
un composant et sauvegarde son ´etat dans une variable. Notons que l’isolation
3. En effet, avec une communication asynchrone telle que celle que nous avons dans la Chapitre 3, la commandePack peut capturer un message en cours de transmission et ainsi causer un ´etat incoh´erent dans le syst`eme.