lunes, 29 de noviembre de 2010

PyPy 1.4: ¡más rápido, más furioso!

PyPy

PyPy es una implementación de Python 2.5 (por ahora) escrita en Python, a diferencia de la implementación CPython de referencia. Más específicamente, PyPy es una arquitectura orientada a implementar fácilmente lenguajes dinámicos mediante dos componentes básicos: un intérprete y un framework de traducción.

Obviamente, implementar Python mismo fue el primer paso, y lo que impulsa el proyecto principal. Y con esta nueva versión han alcanzado un hito sumamente importante. En la mayoría de las pruebas estándar de velocidad de ejecución populares dentro de la comunidad Python, ¡PyPy es más rápido que CPython!

¿Suena increíble, verdad? Veamos los resultados de las últimas pruebas (aquí puede verse el análisis completo):

Comparación entre PyPy y Cpython

Para comprender cómo es posible, hay que entender un poco más la manera en que funciona el compilador JIT (just in time, ó a demanda) de PyPy. Que el lenguaje esté implementado sobre sí mismo no quiere decir que se trate de un intérprete sobre otro. PyPy está escrito en Python, pero lo que hace el intérprete es analizar el árbol de expresiones del programa, y a través de su framework de traducción, generar el código ejecutable a nivel de la plataforma objetivo, a medida que va necesitando hacerlo (esta es la parte a demanda).

Por ahora hay disponibles traductores para diferentes sabores de Intel, con los de ARM en camino, para IL de .NET (que a su vez compila a una serie de plataformas) y está en etapa de pruebas el soporte para la máquina virtual de Java.

Otras características PyPy son la capacidad de Sandboxing, es decir, la ejecución en un espacio controlado, lo que permite por ejemplo recibir scripts Python en forma anónima o semi-anónima y ejecutarlos en un servidor restringiendo algunas operaciones, como acceso al file system, comunicaciones de red, etc. Esto es muy útil para permitir crear soluciones extensibles sin generar problemas graves de seguridad.

PyPy también está disponible en versión Stackless que soporta el uso de micro-threads y otras características que permiten una enorme eficiencia en soluciones de muy alta concurrencia.