Esterel : le langage des robots

Thomas VIOLA
Ecosystèmes des langages de programmation
4 min readMay 24, 2017

ESTEREL est un langage de programmation développé dans les années 80 par une équipe de chercheurs des Mines de Paris et de l’INRIA. Il a initialement été conçu pour la programmation de robots industriels.

Massif de l’ Esterel, dans le Var, qui a donné son nom au langage …

Ce langage fut l’un des premiers langages de programmation efficace pour contrôler des systèmes réels et complexes. Les systèmes réels ont de nombreuses interactions avec leur environnement et doivent s’adapter rapidement. Cela peut être des robots ou des véhicules autonomes. La puissance de ce langage est de pouvoir modéliser par un programme court un système complexe qui a de nombreux états possibles.

ESTEREL est un langage impératif et de haut niveau (niveau d’abstraction élevé). Nous allons étudier plus précisément les caractéristiques qui rendent ce langage particulier.

Un langage réactif

ESTEREL est le premier langage informatique impératif et réactif. Cela veut dire que toutes ses variables et ses fonctions s’adaptent en temps réel au système réactif auquel le programme est attaché.

Un petit exemple :

masse_voiture = masse_passagers + poids_à_vide

Si à un moment donné la valeur de masse_passagers change, on aimerait que la valeur de masse_voiture change simultanément. Dans un langage réactif, toutes les valeurs s’adaptent en fonction des autres et de leur environnement. Un système réactif interagit en permanence avec son environnement. Dans le cas d’un système embarqué, le programme va lire en continu les données des capteurs, puis calculer la réponse appropriée.

Dans ESTEREL la transmission d’informations se fait à l’aide de signaux.

Un langage se basant sur les signaux

Les signaux sont incontournables avec ESTEREL. Même des sous-parties d’un programme peuvent communiquer par signaux.

Les signaux de base sont :

await S : instruction bloquante qui attend le signal S

emit S : instruction qui émet le signal S

test S : instruction qui teste la présence du signal S

Un langage synchrone

Un langage synchrone permet de garantir la durée d’exécution du programme.

La notion de temps propre à ce langage est tout à fait intéressante. Le temps est divisé en instants logiques. Le principe d’un langage synchrone est d’abandonner totalement le temps réel.

Pour renouer avec la contrainte de temps réel on fait appel à l’hypothèse de synchronicité.

Conditions pour respecter l’hypothèse de synchronicité

Dans cette hypothèse, chaque calcul ou communication est considérée comme instantanée: la k-ième sortie est obtenue instantanément lors de la réalisation du k-ième événement en entrée. C’est comme si l’ordinateur était infiniment rapide. En pratique, cela revient à vérifier que le temps de calcul est inférieur à la durée entre deux événements d’entrée (schéma b).

C’est primordial dans certains systèmes où la durée d’exécution est une donnée cruciale. L’ airbag est un exemple de système sensible, où la durée de déclenchement du coussin doit être garantie.

Un langage déterministe

Le fait d’être synchrone permet au langage de garantir le temps d’exécution. ESTEREL rajoute une garantie supplémentaire car il est déterministe.

Un langage est déterministe si une seule réaction du système est possible pour une séquence d’entrées donnée. Le comportement de tout le système étant prévisible on peut limiter les problèmes d’accès concurrents par exemple. Le déterminisme facilite également la détection d’erreurs ou d’anomalies dans le code.

Mais il est a noté qu’il existe des cas où il est difficile de respecter la causalité, par exemple, lorsqu’un signal est émis avant d’être pris en compte dans le programme.

Concurrence logique ou parallélisme ?

ESTEREL facilite la concurrence grâce à l’opérateur de composition parallèle synchrone : “||”. Bien sûr ce n’est pas un parallélisme d’exécution, mais une concurrence logique: la notion d’instant logique est globale, partagée par tous les processus, et permet une synchronisation implicite.

Un exemple pour comprendre la puissance d’ ESTEREL :

loop
[
await A
||
await B
];
emit O;
await R
end

Dans ce petit programme une suite d’instructions se répète à l’infini. Tout d’abord le programme attend l’arrivée du signal A et du signal B. Après avoir reçu ces deux signaux, le programme émet le signal O. Enfin, le programme attends l’arrivée du signal R pour recommencer la boucle.

L’avenir d’ ESTEREL

Le développement actuel est plutôt incertain. La dernière tentative de normalisation date de 2007 et a échouée. Mais l’intérêt d’ESTEREL d’un point de vue théorique est encore très important.

L’avènement de nombreux systèmes comme les robots et véhicules autonomes attire à nouveau l’attention sur ce type de langage. Ces systèmes temps-réel nécessitent les mêmes paradigmes de programmation que ceux propres à ESTEREL.

Pour aller plus loin, la publication scientifique présentant Esterel :

Berry, G., & Gonthier, G. (1992). The Esterel synchronous programming language: Design, semantics, implementation. Science of computer programming, 19(2), 87–152.

--

--