PyPy est construit à l'aide d'une technique appelée méta-trace , une transformation quasi automatique qui prend un interpréteur en entrée et produit un compilateur à la volée avec traçage en sortie. Les interpréteurs étant généralement plus faciles à écrire que les compilateurs , mais plus lents à l'exécution, cette technique facilite la création d'implémentations efficaces des langages de programmation. La chaîne d'outils de méta-trace de PyPy s'appelle RPython .
PyPy prend officiellement en charge Python 2.7 et 3.11 et présente quelques différences d'implémentation par rapport à CPython.
langages dynamiques , en mettant l'accent sur une séparation nette entre la spécification du langage et les aspects d'implémentation. Il vise également à fournir une implémentation conforme, flexible et rapide du langage de programmation Python utilisant ce cadre afin de permettre de nouvelles fonctionnalités avancées sans avoir à encoder les détails de bas niveau.RPython
L'interpréteur PyPy lui-même est écrit dans un sous-ensemble restreint de Python appelé RPython (Restricted Python). RPython impose certaines contraintes au langage Python afin que le type d'une variable puisse être inféré à la compilation.
Le projet PyPy a développé une chaîne d'outils qui analyse le code RPython et le traduit en bytecode , lequel peut être compilé en C. Auparavant, d'autres langages de programmation existaient en plus du C ( Java , C# et JavaScript ), mais ils ont souffert de problèmes de compatibilité et ont été abandonnés. Ainsi, le logo récursif de PyPy représente un serpent qui se mord la queue, car le code RPython est traduit par un interpréteur Python . Le code peut également être exécuté sans traduction pour les tests et l'analyse, ce qui constitue un excellent banc d'essai pour la recherche sur les langages dynamiques.
Il permet l'utilisation de ramasse-miettes modulaires et l'activation optionnelle des fonctionnalités de Stackless Python . Enfin, il intègre un générateur de compilation à la volée (JIT) qui construit un compilateur JIT au sein de l'interpréteur, à partir de quelques annotations dans le code source de ce dernier . Le compilateur JIT généré est un compilateur JIT avec traçage .
RPython est désormais également utilisé pour écrire des implémentations de langages non-Python, comme de CPython : 2.7 et 3.10. La première version de PyPy compatible avec CPython v3 est PyPy v2.3.1 (2014). L’interpréteur PyPy compatible avec CPython v3 est également connu sous le nom de PyPy3.
PyPy prend en charge la compilation JIT sur les processeurs x86 32 bits/64 bits et ARM 32 bits/64 bits . Il est testé quotidiennement sur Windows, Linux, OpenBSD et macOS. PyPy est capable d'exécuter des logiciels Python purs qui ne dépendent pas de fonctionnalités spécifiques à une implémentation.
Il existe une couche de compatibilité pour les extensions de l'API C de CPython, appelée CPyExt, mais elle est incomplète et expérimentale. La méthode privilégiée pour interagir avec les bibliothèques partagées C consiste à utiliser l' interface de fonctions étrangères C intégrée (CFFI) ou les bibliothèques ctypes .
Histoire
PyPy succède au projet Psyco , un compilateur spécialisé à la volée pour Python, développé par Armin Rigo entre 2002 et 2010. L'objectif de PyPy est de proposer un compilateur spécialisé à la volée avec gestion de la portée, fonctionnalité absente de Psyco. Initialement, RPython pouvait également être compilé en bytecode Java , CIL et JavaScript , mais ces interfaces ont été abandonnées faute d'intérêt.
PyPy était initialement un projet axé sur la recherche et le développement. Après avoir atteint une phase de développement mature et une version 1.0 officielle sortie mi-2007, l'objectif suivant était de publier une version prête pour la production avec une meilleure compatibilité avec CPython. De nombreuses modifications apportées à PyPy ont été réalisées lors de sprints de développement .
- En août 2008, PyPy était capable d'exécuter certaines bibliothèques Python populaires comme Pylons , Pyglet , Nevow et Django .
- Le 12 mars 2010, PyPy 1.2 a été publié, axé sur la vitesse. Il comprenait un compilateur juste-à-temps fonctionnel, bien que non encore stable.
- Le 30 avril 2011, la version 1.5 de PyPy a été publiée, qui a atteint la compatibilité avec CPython 2.7.
- Le 9 mai 2013, PyPy 2.0 a été publié, introduisant une prise en charge alpha de la compilation JIT sur ARMv6 et ARMv7 JIT, et incluant CFFI dans la bibliothèque standard.
- Le 20 juin 2014, PyPy3 a été déclaré stable et a introduit la compatibilité avec le Python 3 plus moderne. Il a été publié en même temps que PyPy 2.3.1 et porte le même numéro de version.
- Le 21 mars 2017, le projet PyPy a publié la version 5.7 de PyPy et de PyPy3, cette dernière introduisant une prise en charge de qualité bêta pour Python 3.5.
- Le 26 avril 2018, la version 6.0 a été publiée, avec la prise en charge de Python 2.7 et 3.5 (encore en version bêta sous Windows).
- Le 11 février 2019, la version 7.0 a été publiée, avec prise en charge de Python 2.7 et 3.5.
- Le 14 octobre 2019, la version 7.2 a été publiée, avec prise en charge de Python 3.6.9.
- Le 24 décembre 2019, la version 7.3 a été publiée, avec prise en charge de Python 3.6.9.
- Le 16 février 2020, l'équipe PyPy a annoncé le transfert de l'hébergement du code source de Bitbucket vers heptapod.net, ainsi que des dépôts du projet CFFI (C Foreign Function Interface ). Un nouveau logo et un nouveau design de site web ont également été publiés. Cependant, l'auteur et la licence du nouveau logo restent inconnus.
- Le 29 décembre 2023, PyPy a annoncé que l'hébergement avait été transféré sur GitHub et que le développement serait désormais suivi avec git .
Financement
PyPy a été financé par l' Union européenne dans le cadre d'un projet de recherche ciblé spécifique entre décembre 2004 et mars 2007. En juin 2008, PyPy a annoncé un financement dans le cadre des programmes Google Open Source et s'est engagé à améliorer sa compatibilité avec CPython . En 2009, Eurostars, une agence de financement de l'Union européenne spécialisée dans les PME , a accepté une proposition des membres du projet PyPy intitulée « PYJIT – une boîte à outils rapide et flexible pour les langages de programmation dynamiques basée sur PyPy ». Le financement d'Eurostars a duré jusqu'en août 2011 Lors de la PyCon US 2011, la Python Software Foundation a octroyé une subvention de 10 000 $ à PyPy pour poursuivre ses travaux sur les performances et la compatibilité avec les versions plus récentes du langage . Le portage sur l'architecture ARM a été financé en partie par la Raspberry Pi Foundation .
Le projet PyPy accepte également les dons via ses pages de blog d'état. En 2013, divers sous-projets bénéficiaient d'un financement : compatibilité avec Python 3, prise en charge intégrée et optimisée de NumPy pour les calculs numériques et prise en charge de la mémoire transactionnelle logicielle pour permettre un meilleur parallélisme.