Le style de transmission de continuation (CPS) est une méthode de gestion du flux de contrôle dans la programmation informatique qui implique de transmettre le contrôle explicitement via un paramètre de fonction.
L'évolution du style de passe de continuation (CPS)
Les origines du style de transmission de continuation remontent au développement de l'informatique théorique, et le concept de continuation lui-même a ses racines dans le calcul lambda. La première mention explicite du « style de transmission de continuation » en tant qu'expression et de son utilisation dans la pratique a été introduite par l'informaticien Christopher Strachey dans les années 1960. C'est durant cette période que lui et ses collègues exploraient la sémantique dénotationnelle, un cadre permettant de définir la signification des langages de programmation.
Déploiement du style de continuation-passe (CPS)
Le style de transmission de continuation (CPS) est une forme d'organisation de programme qui implique l'utilisation explicite de continuations. Une continuation est une représentation de l'état d'un programme informatique à un moment donné, y compris la pile d'appels et les valeurs des variables.
Dans CPS, chaque fonction reçoit un argument supplémentaire, généralement nommé « cont » ou « k », qui représente la suite du programme – ce qui devrait se passer une fois que la fonction a terminé son calcul. Lorsque la fonction a calculé son résultat, elle « renvoie » ce résultat en le passant à la suite, au lieu de le renvoyer de la manière habituelle.
Le concept peut être vu comme un moyen de rendre explicite le flux de contrôle : au lieu de passer implicitement le contrôle à l'appelant lorsqu'il termine, une fonction CPS passe le contrôle en appelant la continuation.
La structure du style de continuation-passe (CPS)
Dans la convention traditionnelle d'appel de fonction, lorsqu'une fonction est appelée, elle s'exécute et renvoie le contrôle à l'appelant avec une valeur de retour. Cependant, dans le style de transmission de continuation, le contrôle est passé explicitement via un paramètre de fonction, souvent appelé « continuation ».
La suite représente le reste du calcul. Autrement dit, lorsqu'une fonction reçoit une continuation, elle effectue certaines opérations puis transmet le résultat à la continuation reçue. Ainsi, dans le style de transmission de continuation, le retour n'est jamais effectué implicitement.
Une fonction CPS typique dans un pseudo-langage pourrait ressembler à :
cssfunction add(a, b, continuation) {
result = a + b;
continuation(result);
}
Cette fonction « ajouter » effectue une opération d'addition puis transmet le résultat à la suite.
Principales caractéristiques du style de passe de continuation (CPS)
-
Flux de contrôle explicite: Dans CPS, le flux de contrôle est explicite. Il n'y a pas de trace de pile cachée et vous pouvez voir clairement l'ordre d'exécution dans le code.
-
La flexibilité: Étant donné que CPS dissocie le calcul du flux de contrôle, il offre plus de flexibilité pour manipuler le flux de contrôle.
-
Opérations non bloquantes: CPS est très utile pour gérer les opérations non bloquantes ou asynchrones. Il peut être utilisé pour éviter l’enfer des rappels et gérer des scénarios de flux de contrôle complexes dans un code non bloquant.
-
Optimisation des appels de queue: Les langages qui prennent en charge l'optimisation des appels de fin peuvent bénéficier du CPS car il transforme tous les appels en appels de fin, ce qui peut être plus efficace en termes d'utilisation de la mémoire.
Types de style de passe de continuation (CPS)
Il existe principalement deux types de suites, style direct et style de passage de continuation. Ci-dessous une comparaison entre les deux :
Style | Description |
---|---|
Style direct | Dans le style direct, une fonction termine son exécution et rend le contrôle à la fonction appelante. La valeur de retour est souvent un résultat de calcul. |
Style de passe de continuation | En CPS, la fonction reçoit un argument supplémentaire, la suite, et passe le résultat à cette suite. Le flux de contrôle est explicite. |
Utilisation, problèmes et solutions
CPS trouve son utilisation principalement dans les langages de programmation fonctionnels et dans la gestion des opérations asynchrones.
-
JavaScript asynchrone: JavaScript, notamment dans Node.js, utilise CPS pour gérer les opérations asynchrones non bloquantes. Les rappels en JavaScript sont des exemples de CPS.
-
Programmation fonctionnelle: Des langages comme Scheme et Haskell utilisent CPS pour gérer les structures de contrôle telles que les boucles et la gestion des exceptions.
Cependant, le CPS peut entraîner certains problèmes :
- Lisibilité: CPS peut parfois conduire à un code difficile à lire et à comprendre en raison de l'enfer des rappels, surtout s'il y a beaucoup de rappels imbriqués.
- Efficacité: La transformation CPS peut potentiellement augmenter la taille du code en raison de paramètres supplémentaires et d'appels de fonction.
Les solutions à ces problèmes sont :
- Utiliser Promesses ou asynchrone/attendre en JavaScript pour éviter l'enfer des rappels et améliorer la lisibilité.
- L’utilisation de langages de programmation prenant en charge l’optimisation des appels finaux peut atténuer les problèmes d’efficacité.
Comparaisons
Voici une comparaison du CPS avec d’autres paradigmes de programmation :
Paradigme de programmation | Flux de contrôle | Cas d'utilisation |
---|---|---|
Style de passe de continuation (CPS) | Explicite, avec suites. | Opérations non bloquantes/asynchrones, optimisation des appels de queue. |
Style direct | Implicite, la fonction retourne à l'appelant. | Opérations synchrones/bloquantes. |
Coroutines | Effectuez plusieurs tâches de manière coopérative en permettant aux fonctions de suspendre et de reprendre l'exécution. | Flux de contrôle complexe, multitâche coopératif. |
Perspectives d'avenir
CPS continue de jouer un rôle essentiel dans la structuration du code asynchrone, notamment en JavaScript. L'introduction de async/await, qui est un sucre syntaxique par rapport à Promises, peut être considérée comme un développement par rapport au CPS traditionnel, offrant une meilleure syntaxe et évitant l'enfer des rappels.
À mesure que les applications Web et serveur deviennent plus complexes et que la concurrence devient plus importante, le CPS et d'autres paradigmes de programmation asynchrone vont probablement devenir encore plus importants. Des recherches sont en cours pour améliorer les langages de programmation et les systèmes d'exécution afin de mieux prendre en charge ces paradigmes.
Serveurs proxy et CPS
Les serveurs proxy servent d'intermédiaire pour les demandes des clients recherchant des ressources auprès d'autres serveurs. Lors du traitement des demandes client simultanées, un serveur proxy peut utiliser CPS ou des paradigmes de programmation asynchrone similaires pour gérer ces demandes sans blocage, améliorant ainsi le débit et les performances.