juillet
2012
Le langage C est réputé proche de la machine. Comme le langage dodo utilise des techniques très bas niveau, on pourrait penser que C serait une plate-forme idéale pour une implémentation efficace.
La réalité n’est pas si simple.
Il y a une fondamentale différence entre la façon dont dodo structure le code et C structure le code. C est un langage procédural, l’unité d’organisation du code est la fonction. De son côté dodo se base sur les continuations.
Nous l’avons vu dans un article précédent, il est possible de simuler les continuations avec des fonctions à l’aide de la boucle de continuations.
Mais C y met un autre obstacle: il n’offre pas de closures. Le rôle des closures est de capturer les variables qui doivent être encore utilisées par la suite. Les fonctions de Clojure font office de closures, ce qui m’a permis d’écrire une première implémentation (dodo0). En C il faut mettre en place un autre mécanisme pour préserver les données qui doivent être réutilisées dans d’autres continuations.
Mon idée est de faire correspondre une fonction dodo à une fonction C. Puisque les variables d’une fonction sont généralement utilisées tout au long de son exécution, on peut les préserver au niveau d’une fonction.
Une continuation est l’équivalent d’un GOTO, et en C la directive switch est aussi équivalente à GOTO. Alors chaque fonction a une boucle avec un switch pour aller d’une continuation à l’autre.
Mais il faut aussi pouvoir appeler d’autres fonctions dodo, qui s’attendent à une continuation de retour. Pour cela chaque fonction C a une fonction auxiliaire qui se charge de sauter directement à la continuation désignée lors de son appel.
J’ai trouvé que dans certaines circonstances il était possible de faire tout cela sans allocation de mémoire, uniquement sur la pile! C’est une bonne nouvelle.
Dans un prochain épisode, je donnerai plus de détails et des exemples de code. A bientôt!