Participants : Damien Doligez, Cédric Fournet, Georges Gonthier,Florent Guillaume, Jean-Jacques Lévy, Luc Maranget, Didier Rémy (projet CRISTAL )
Mots clefs : parallélisme, parallélisme asynchrone, pi-calcul, langage fonctionnel, programmation répartie, tolérance aux fautes, agents mobiles, concurrence, ramasse-miettes
Ce travail a été principalement mené au cours d'un séminaire hebdomadaire tenu de novembre 1994 à l'été 1995. Ce groupe de travail a défini un nouveau langage de programmation de haut niveau dédié à la programmation distribuée et mobile. Ses membres ont été les chercheurs du projet et d'autres participants plus ponctuels comme B. Pierce (Cambridge), R. Amadio (INRIA-Sophia) et D. Turner (Edimbourg).
Le point de départ était de constater que, depuis quelques années, on assiste à l'explosion d'applications distribuées à très grande échelle dans de nombreux domaines, notamment autour du Web. Pourtant, la plupart des langages disponibles intègrent mal les primitives donnant accès à la distribution. En particulier, la programmation des agents mobiles et de la résistance aux pannes locales est particulièrement ardue, et requiert l'utilisation d'appels-système complexes.
Une belle théorie des processus mobiles, le -calcul, a été introduite par R.
Milner en 1990. Elle suggère qu'un traitement formel du calcul
distribué permettrait de clarifier les problèmes pratiques
rencontrés. Jusqu'à présent, seuls les langages Facile et Pict
correspondent peu ou prou au
-calcul. Facile est distribué, mais n'intègre pas
complètement communication et fonctionalité. Pict, lui, n'est pas
distribué, mais présente une parfaite intégration entre
communication et appels de fonctions. Notre objectif était de
trouver un langage implémentable pour la programmation distribuée
d'ordre supérieur. Il en a résulté la formalisation d'une machine
dite ``chimique réflexive'', qui fournit une version d'ordre
supérieur à la machine chimique de G. Berry et G. Boudol, et la
définition d'un calcul appelé le ``join-calculus''. (cf section
3.2)
Ce modèle très simple nous a permis d'identifier les primitives essentielles pour la distribution d'ordre fonctionnel élevé, d'étudier leur mise en oeuvre effective, et de définir précisément leur comportement en présence de migrations et de pannes.
Notre langage a une portée lexicale globale des
identificateurs, avec extrusion de portées, comme dans le
-calcul. Sa primitive
essentielle est l'envoi de messages asynchrones. Par définition,
il contient un sous-ensemble fonctionnel (à la ML). Dans ce cadre
très simple, nous proposons un modèle distribué avec:
Nos premières applications mettent en oeuvre des protocoles qui illustrent la distribution dynamique du calcul : des programmes-clients créent des agents mobiles qui permettent de déplacer des requêtes complexes vers les machines des programmes-serveurs, et de les y exécuter localement sans encombrer inutilement le réseau ni craindre la perte de messages. A l'aide de quelques détections de pannes, le protocole garantit sous des conditions minimales que chaque requête est finalement prise en compte, même en présence de clients et de serveurs défectueux. Enfin, la programmation d'ordre supérieur permet de séparer cette bibliothèque d'agents du contenu des clients, des agents et des serveurs.
Afin de valider cette approche expérimentalement, une implémentation physiquement distribuée du langage est en cours. Sa réalisation soulève de nombreux problèmes d'algorithmique distribuée -- comme par exemple celui du glaneur de cellules -- et bien sûr de sécurité. Dans ces deux domaines, nous pensons pouvoir tirer parti de la définition précise de notre sémantique distribuée asynchrone pour proposer des solutions originales.