J'ai lu récemment à propos de Stackless Python et il semble avoir de nombreux avantages par rapport à Vanilla cPython. Il a toutes ces fonctionnalités intéressantes comme la récursion infinie, les microtitles, les continuations, etc. et en même temps est plus rapide que cPython (environ 10%, si le Python wiki est à croire) et compatible avec lui (au moins les versions 2.5, 2.6 et 3.0).
Tout cela semble presque trop beau pour être vrai. Cependant, TANSTAAFL , je ne vois pas beaucoup d'enthousiasme pour Stackless parmi la communauté Python, et PEP 219 n'a jamais vu le jour. Pourquoi? Quels sont les inconvénients de Stackless? Quels squelettes sont cachés dans le placard de Stackless?
(Je sais que Stackless n'offre pas de réelle concurrence, juste un moyen plus facile de programmer de manière simultanée. Cela ne me dérange pas vraiment.)
Je ne sais pas d'où vient "Stackless est 10% plus rapide" sur le Wiki, mais là encore je n'ai jamais essayé de mesurer ces performances. Je ne peux pas penser à ce que Stackless fait pour faire une si grande différence.
Stackless est un outil incroyable avec plusieurs problèmes organisationnels/politiques.
Le premier vient de l'histoire. Christian Tismer a commencé à parler de ce qui est finalement devenu Stackless il y a environ 10 ans. Il avait une idée de ce qu'il voulait, mais avait du mal à expliquer ce qu'il faisait et pourquoi les gens devraient l'utiliser. C'est en partie parce que ses antécédents n'avaient pas la formation CS concernant des idées comme les coroutines et parce que ses présentations et discussions sont très axées sur la mise en œuvre, ce qui est difficile pour quiconque n'est pas déjà à la pointe de la poursuite de comprendre comment l'utiliser comme solution pour leurs problèmes.
Pour cette raison, la documentation initiale était médiocre. Il y avait quelques descriptions de la façon de l'utiliser, avec le meilleur des contributeurs tiers. Lors de PyCon 2007, j'ai donné une conférence sur " sing Stackless " qui s'est très bien passée, selon les chiffres de l'enquête PyCon. Richard Tew a fait un excellent travail en les collectant, en mettant à jour stackless.com , et en maintenant la distribution lorsque de nouvelles versions Python sortent. Il est un employé de CCP Games , les développeurs d'EVE Online, qui utilise Stackless comme élément essentiel de leur système de jeu.
Les jeux CCP sont également le plus grand exemple concret que les gens utilisent lorsqu'ils parlent de Stackless. Le principal tutoriel pour Stackless est " Introduction to Concurrent Programming with Stackless Python " de Grant Olson, qui est également orienté jeu. Je pense que cela donne aux gens une idée biaisée que Stackless est orienté vers les jeux, alors que les jeux sont plus facilement orientés vers la continuation.
Une autre difficulté a été le code source. Dans sa forme originale, il nécessitait des changements dans de nombreuses parties de Python, ce qui a rendu Guido van Rossum, le Python lead, méfiant. Une partie de la raison, je pense, était le support de call/cc qui était plus tard supprimé comme étant "trop comme supporter un goto quand il y a de meilleurs formulaires de niveau supérieur." Je ne suis pas certain de cette histoire, alors lisez simplement ce paragraphe comme "Stackless nécessitait trop de changements".
Les versions ultérieures n'ont pas nécessité les modifications, et Tismer a continué à pousser pour son inclusion dans Python. Bien qu'il y ait eu une certaine considération, la position officielle (pour autant que je sache) est que CPython n'est pas seulement une implémentation Python mais c'est une implémentation de référence et n'inclura pas la fonctionnalité Stackless car il ne peut pas être implémenté par Jython ou Iron Python.
Il n'est absolument pas prévu de " modifications importantes de la base de code ". Cette citation et l'hyperlien de référence d'Arafangion (voir le commentaire) datent d'environ 2000/2001. Les changements structurels ont été effectués depuis longtemps, et c'est ce que j'ai mentionné ci-dessus. Stackless tel qu'il est maintenant est stable et mature, avec seulement quelques ajustements mineurs à la base de code au cours des dernières années.
Une dernière limite avec Stackless - il n'y a pas de défenseur convaincu de Stackless. Tismer est maintenant profondément impliqué avec PyPy , qui est une implémentation de Python pour Python. Il a implémenté la fonctionnalité Stackless dans PyPy et la considère bien supérieure à Stackless elle-même, et pense que PyPy est la voie de l'avenir. Tew maintient Stackless mais il n'est pas intéressé par le plaidoyer. J'ai envisagé d'être dans ce rôle, mais je ne voyais pas comment je pourrais en tirer un revenu.
Mais si vous voulez vous entraîner en Stackless, n'hésitez pas à contactez-moi ! :)
il a fallu assez de temps pour trouver cette discussion. À ce moment-là, je n'étais pas sous PyPy mais j'ai eu une liaison de 2 ans avec psyco, jusqu'à ce que la santé arrête tout cela brusquement. Je suis à nouveau actif et je conçois une approche alternative - je la présenterai sur EuroPython 2012.
La plupart des déclarations d'Andrews sont correctes. Quelques ajouts mineurs:
Stackless était beaucoup plus rapide que CPython, il y a 10 ans, car j'ai optimisé la boucle d'interpréteur. A cette époque, Guido n'était pas prêt pour ça. Quelques années plus tard, les gens ont fait des optimisations similaires et encore plus et meilleures, ce qui rend Stackless un peu plus lent, comme prévu.
Concernant l'inclusion: eh bien, au début, j'étais très arrogant et convaincu que Stackless est la voie à suivre. Plus tard, quand il a été presque possible de m'inclure, j'ai perdu tout intérêt pour cela et j'ai préféré le laisser ainsi, en partie par frustration, en partie pour garder le contrôle de Stackless.
Les arguments comme "d'autres implémentations ne peuvent pas le faire" me semblaient toujours boiteux, car il existe d'autres exemples où cet argument pourrait également être utilisé. Je pensais que je ferais mieux d'oublier cela et de rester en bonne amitié avec Guido, ayant ma propre distribution.
Pendant ce temps, les choses changent à nouveau. Je travaille sur PyPy et Stackless en tant qu'extension J'en parlerai parfois plus tard
Santé - Chris
Si je me souviens bien, Stackless devait être inclus dans le CPython officiel, mais l'auteur de stackless a dit aux gens de CPython de ne pas le faire, car il prévoyait d'apporter des modifications importantes à la base de code - sans doute voulait-il que l'intégration se fasse plus tard lorsque le projet était plus mature.
Je suis également intéressé par les réponses ici. J'ai joué un peu avec Stackless et il semble que ce serait un bon ajout solide au Python standard.
PEP 219 mentionne des difficultés potentielles avec l'appel de Python à partir du code C, si Python veut passer à une autre pile. Il devrait y avoir des moyens de détecter et empêcher cela (pour éviter de jeter la pile C). Je pense que c'est maniable, donc je me demande aussi pourquoi Stackless doit se débrouiller tout seul.