2010-08-08 29 views
4

J'ai une question à propos de la mise en œuvre de coroutine. J'ai vu coroutine d'abord sur Lua et stackless-python. Je pourrais comprendre le concept de celui-ci, et comment utiliser yield mot-clé, mais je ne peux pas comprendre comment il est mis en œuvre.Comment les coroutines sont-elles implémentées?

Puis-je obtenir des explications à leur sujet?

Répondre

3

Le routage est initié en poussant l'adresse cible, puis chaque commutateur corboutine échange le PC actuel avec le sommet de la pile, qui doit finalement être déclenché pour terminer le routage.

+1

+1, c'est la façon de le faire si vous avez accès à la pile comme vous le faites en C ou la plupart des Smalltalks (ou si vous avez implémenté * votre propre pile *, qui est essentiellement ce que Stackless Python et la Lua VM font). –

+0

Il est également intéressant de noter que les coroutines fonctionnent très bien comme des processus (ou des threads de système d'exploitation) sur un système d'exploitation multitâche coopératif. Chaque processus s'exécute sur le CPU jusqu'à ce qu'il retourne au noyau, à quel point le système d'exploitation sauvegarde le PC (et un tas d'autres choses), choisit un autre processus à exécuter et saute au PC précédemment enregistré pour ce processus. Bien sûr, chaque processus a sa propre pile, comme le font les corotines. – Feuermurmel

2

Voir aussi: Implementing “Generator” support in a custom language. Les générateurs sont fondamentalement une forme limitée de (semi-) coroutines, la plupart de ce qui est discuté dans cette question s'applique ici aussi.

En outre: How are exceptions implemented under the hood? Bien que les exceptions soient évidemment très différentes des coroutines, elles ont toutes deux quelque chose en commun: les deux sont des constructions de flux de contrôle universel avancé. (En fait, vous pouvez implémenter des coroutines en utilisant des exceptions et des exceptions en utilisant des coroutines.)