PyPy ( / ˈ p aɪ p aɪ / ) es una implementación del lenguaje de programación Python . [2] PyPy a menudo se ejecuta más rápido que la implementación estándar CPython porque PyPy usa un compilador just-in-time . [3] La mayoría del código Python se ejecuta bien en PyPy excepto el código que depende de las extensiones CPython, que no funcionan o incurren en cierta sobrecarga cuando se ejecutan en PyPy.
PyPy se ha creado con una técnica conocida como meta-tracing, que es una transformación casi automática que toma un intérprete como entrada y produce un compilador de seguimiento justo a tiempo como salida. Dado que los intérpretes suelen ser más fáciles de escribir que los compiladores , pero se ejecutan más lentamente, esta técnica puede facilitar la producción de implementaciones eficientes de lenguajes de programación. La cadena de herramientas de meta-tracing de PyPy se llama RPython.
PyPy no tiene compatibilidad total con las versiones más recientes del ecosistema CPython. Si bien afirma ser compatible con Python 2.7, 3.7, 3.8 y 3.9 ("un reemplazo directo para CPython"), carece de algunas de las características y sintaxis más nuevas de Python 3.10, como la sintaxis para la coincidencia de patrones . [4]
PyPy tiene como objetivo proporcionar un marco de trabajo común de traducción y soporte para producir implementaciones de lenguajes dinámicos , haciendo hincapié en una clara separación entre la especificación del lenguaje y los aspectos de implementación. También tiene como objetivo proporcionar una implementación compatible, flexible y rápida del lenguaje de programación Python utilizando el marco mencionado anteriormente para habilitar nuevas funciones avanzadas sin tener que codificar detalles de bajo nivel en él. [5] [6]
El intérprete de PyPy está escrito en un subconjunto restringido de Python llamado RPython (Python restringido). [7] RPython impone algunas restricciones al lenguaje Python de modo que el tipo de una variable se pueda inferir en tiempo de compilación. [8]
El proyecto PyPy ha desarrollado una cadena de herramientas que analiza el código RPython y lo traduce a una forma de código de bytes , que puede ser traducido a C. Solía haber otros backends además de C ( Java , C# y Javascript ), pero estos sufrieron de bitrot y han sido eliminados. Por lo tanto, el logo recursivo de PyPy es una serpiente que se traga a sí misma ya que RPython es traducido por un intérprete de Python . El código también puede ejecutarse sin traducir para pruebas y análisis, lo que proporciona un buen banco de pruebas para la investigación de lenguajes dinámicos.
Permite la inclusión de recolectores de basura enchufables , así como la habilitación opcional de funciones de Stackless Python . Por último, incluye un generador Just-In-Time (JIT) que crea un compilador Just-In-Time en el intérprete, dadas algunas anotaciones en el código fuente del intérprete . El compilador JIT generado es un JIT de rastreo . [9]
RPython ahora también se utiliza para escribir implementaciones en lenguajes distintos de Python, como Pixie. [10]
PyPy a partir de la versión 7.3.17 es compatible con dos versiones de CPython : 2.7 y 3.10. [11] [12] La primera versión de PyPy compatible con CPython v3 es PyPy v2.3.1 (2014). [13] El intérprete de PyPy compatible con CPython v3 también se conoce como PyPy3.
PyPy tiene soporte de compilación JIT en procesadores x86 de 32 bits/64 bits y ARM de 32 bits/64 bits . [14] Se prueba todas las noches en Windows, Linux, OpenBSD y Mac OS X. PyPy puede ejecutar software Python puro que no depende de características específicas de la implementación. [15]
Existe una capa de compatibilidad para las extensiones de la API de C de CPython denominada CPyExt, pero está incompleta y es experimental. La forma preferida de interactuar con las bibliotecas compartidas de C es a través de la interfaz de función externa de C (CFFI) incorporada o las bibliotecas ctypes .
PyPy es una continuación del proyecto Psyco , un compilador especializado just-in-time para Python, desarrollado por Armin Rigo entre 2002 y 2010. El objetivo de PyPy es tener un compilador especializado just-in-time con alcance, que no estaba disponible para Psyco. [ aclaración necesaria ] Inicialmente, RPython también podía compilarse en Java bytecode , CIL y JavaScript , pero estos backends se eliminaron debido a la falta de interés.
PyPy fue inicialmente un proyecto orientado a la investigación y el desarrollo. Alcanzó un estado maduro de desarrollo y una versión oficial 1.0 a mediados de 2007. Su siguiente objetivo fue lanzar una versión lista para producción con mayor compatibilidad con CPython. Muchos de los cambios de PyPy se realizaron durante los sprints de codificación .
PyPy fue financiado por la Unión Europea como un Proyecto de Investigación Específico Dirigido [31] entre diciembre de 2004 y marzo de 2007. En junio de 2008, PyPy anunció la financiación como parte de los programas de código abierto de Google y acordó centrarse en hacer que PyPy sea más compatible con CPython . En 2009, Eurostars, una agencia de financiación de la Unión Europea especialmente centrada en las PYME , [32] aceptó una propuesta de los miembros del proyecto PyPy titulada "PYJIT: un kit de herramientas rápido y flexible para lenguajes de programación dinámicos basados en PyPy". La financiación de Eurostars duró hasta agosto de 2011. [33] En PyCon US 2011, la Python Software Foundation proporcionó una subvención de $10,000 para que PyPy continuara trabajando en el rendimiento y la compatibilidad con versiones más nuevas del lenguaje. [34] El puerto a la arquitectura ARM fue patrocinado en parte por la Raspberry Pi Foundation . [22]
El proyecto PyPy también acepta donaciones a través de sus páginas de blog de estado. [35] A partir de 2013, una variedad de subproyectos tenían financiación: compatibilidad con la versión Python 3, soporte NumPy optimizado integrado para cálculos numéricos y soporte de memoria transaccional de software para permitir un mejor paralelismo. [22]