53 votes

Comment mettre en œuvre les continuations ?

Je travaille sur un interpréteur Scheme écrit en C. Actuellement, il utilise la pile du runtime C comme sa propre pile, ce qui pose un petit problème pour l'implémentation des continuations. Ma solution actuelle consiste à copier manuellement la pile C dans le tas, puis à la recopier lorsque cela est nécessaire. Outre le fait qu'il ne s'agit pas de C standard, cette solution n'est guère idéale.

Quelle est la manière la plus simple d'implémenter des continuations pour Scheme en C ?

29voto

Josh Segall Points 1996

Un bon résumé est disponible dans Stratégies de mise en œuvre pour les continuations de première classe un article de Clinger, Hartheimer et Ost. Je recommande de regarder l'implémentation de Chez Scheme en particulier.

La copie de pile n'est pas si complexe et il existe un certain nombre de techniques bien comprises pour améliorer les performances. L'utilisation de cadres alloués au tas est également assez simple, mais vous devez faire un compromis en créant une surcharge pour les situations "normales" où vous n'utilisez pas de continuations explicites.

Si vous convertissez le code d'entrée en style de passage de continuation (CPS), vous pouvez vous en sortir en éliminant complètement la pile. Cependant, bien que le CPS soit élégant, il ajoute une autre étape de traitement en amont et nécessite une optimisation supplémentaire pour surmonter certaines implications en termes de performances.

18voto

Chris Jester-Young Points 102876

Je me souviens avoir lu un article qui pourrait vous être utile : Cheney sur le M.T.A. :-)

Certaines implémentations de Scheme que je connais, telles que SISC allouent leurs trames d'appel sur le tas.

@ollie : Vous n'avez pas besoin de faire le hissage si toutes vos trames d'appel sont sur le tas. Il y a un compromis en termes de performances, bien sûr : le temps de levage, par rapport à la surcharge nécessaire pour allouer toutes les trames sur le tas. Peut-être que cela devrait être un paramètre d'exécution réglable dans l'interpréteur :-P

14voto

Si vous partez de zéro, vous devriez vraiment vous pencher sur la transformation CPS (Continuation Passing Style).

De bonnes sources incluent "LISP in small pieces" et Présentation du schéma de Marc Feeley en 90 minutes .

0 votes

Le livre Lisp In Small Pieces de Queinnec est disponible (du moins dans son édition française chez Paracampus)

8voto

Jay Points 2515

En plus des bonnes réponses que vous avez reçues jusqu'à présent, je vous recommande le livre d'Andrew Appel. Compilation avec les continuations . Il est très bien écrit et, bien qu'il ne traite pas directement du C, il est une source d'idées vraiment intéressantes pour les auteurs de compilateurs.

Le Chicken Wiki contient également des pages que vous trouverez très intéressantes, telles que structure interne et processus de compilation (où le CPS est expliqué avec un exemple réel de compilation).

2 votes

J'aime beaucoup le livre d'Appel. Un bonus est que vous pouvez vous référer au code source du compilateur SML/NJ, qui est un très bon exemple vivant du processus qu'Appel décrit dans le livre.

7voto

La méthode traditionnelle consiste à utiliser setjmp et longjmp mais il y a des réserves.

Voici un explication raisonnablement bonne

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X