Parrot es una máquina virtual de procesos basada en registros que ya no se fabrica y que está diseñada para ejecutar lenguajes dinámicos de manera eficiente. Es posible compilar el lenguaje ensamblador de Parrot y la representación intermedia de Parrot (PIR, un lenguaje intermedio) en código de bytes de Parrot y ejecutarlo. Parrot es un software libre y de código abierto . [2]
Parrot fue creado por la comunidad Perl y desarrollado con la ayuda de las comunidades de software libre y de código abierto . Como resultado, se centró en la compatibilidad de licencias con Perl ( licencia Artistic 2.0 ), la compatibilidad de plataformas en una amplia gama de sistemas, la compatibilidad de arquitecturas de procesadores en la mayoría de los procesadores modernos, la velocidad de ejecución, el tamaño pequeño (alrededor de 700k según la plataforma) y la flexibilidad para manejar las diferentes demandas de Raku y otros lenguajes dinámicos modernos .
La versión 1.0, con una interfaz de programación de aplicaciones (API) estable para el desarrollo, fue lanzada el 17 de marzo de 2009. [3] La última versión es la versión 8.1.0 "Andean Parakeet". [1] Parrot fue descontinuado oficialmente en agosto de 2021, después de ser reemplazado por MoarVM en su uso principal (Raku) y nunca convertirse en una máquina virtual convencional para ninguno de sus otros lenguajes compatibles. [4]
El nombre Parrot proviene de una broma del Día de los Inocentes que anunciaba un lenguaje hipotético, llamado Parrot , que unificaría Python y Perl . [5] [6] El nombre fue adoptado más tarde por el proyecto Parrot (inicialmente una parte del esfuerzo de desarrollo de Raku) que tenía como objetivo dar soporte a Raku, Python y otros lenguajes de programación.
La Fundación Parrot se disolvió en 2014. [7] La Fundación se creó en 2008 para mantener los derechos de autor y las marcas registradas del proyecto Parrot, para ayudar a impulsar el desarrollo de las implementaciones del lenguaje y el código base central, para proporcionar una base para el crecimiento de la comunidad Parrot y para llegar a otras comunidades lingüísticas. [8]
Las decisiones de diseño históricas se documentan en forma de Documentos de Diseño de Parrot, o PDD, en el repositorio de Parrot. [9]
Hasta finales de 2005, Dan Sugalski fue el diseñador principal y arquitecto jefe de Parrot. Chip Salzenberg, un hacker veterano de Perl, kernel de Linux y C++, tomó el relevo hasta mediados de 2006, cuando se convirtió en el desarrollador principal. Allison Randal , la desarrolladora principal de Punie y arquitecta principal de las herramientas de compilación de Parrot, fue la arquitecta principal hasta mediados de octubre de 2010, cuando renunció y eligió a Christoph Otto como el nuevo arquitecto principal. [10]
El objetivo de la máquina virtual Parrot era alojar lenguajes cliente y permitir la interoperabilidad entre ellos. Existen varios obstáculos para lograr este objetivo, en particular la dificultad de mapear conceptos, datos y estructuras de datos de alto nivel entre lenguajes.
Las diferentes propiedades de los lenguajes de tipado estático y dinámico motivaron el diseño de Parrot. Las máquinas virtuales populares actuales, como la máquina virtual Java y Common Language Runtime para la plataforma .NET , se han diseñado para lenguajes de tipado estático, mientras que los lenguajes a los que apunta Parrot son de tipado dinámico.
Las máquinas virtuales como la máquina virtual de Java y la actual máquina virtual Perl 5 también están basadas en pila . Los desarrolladores de Parrot eligieron un diseño basado en registros, argumentando que se asemeja más a un diseño de hardware, lo que permite utilizar la vasta literatura sobre optimización de compiladores para generar código de bytes para la máquina virtual Parrot que podría funcionar a velocidades más cercanas al código de máquina . [ cita requerida ] Otras máquinas virtuales basadas en registros inspiraron partes del diseño de Parrot, incluidas LLVM , Lua VM y Dis de Inferno .
Parrot ofrece un amplio soporte para varias características de la programación funcional , incluidos los cierres y las continuaciones , que pueden resultar especialmente difíciles de implementar de forma correcta y portátil, especialmente en combinación con el manejo de excepciones y el subprocesamiento . La mayor ventaja es la capacidad de extensión dinámica de los objetos con métodos, lo que permite contenedores polimórficos (PMC) y códigos de operación asociados . La implementación de soluciones a estos problemas a nivel de máquina virtual evita la necesidad de resolverlos en los lenguajes de cliente individuales.
Parrot ofrece un conjunto de herramientas de escritura de compiladores [11] que incluyen el Parser Grammar Engine (PGE), un generador de analizador híbrido que puede expresar un analizador descendente recursivo así como un analizador de precedencia de operadores , lo que permite una transición libre entre los dos en una única gramática. El PGE alimenta al Tree Grammar Engine (TGE) que transforma aún más el árbol de análisis generado por PGE para la optimización y, en última instancia, para la generación de código.
Las implementaciones de lenguaje más completas dirigidas a Parrot VM fueron Raku (conocido en ese momento como Rakudo Perl 6), Lua y un nuevo lenguaje llamado "Winxed". [12] Se iniciaron proyectos para implementar muchos otros lenguajes, incluidos PHP , Python y Ruby ; junto con lenguajes esotéricos y de demostración como Befunge y el lenguaje tutorial "squaak". [13] Ninguno de estos proyectos tuvo éxito en convertirse en la implementación principal de sus respectivos lenguajes. [4]
Hay tres formas de código de programa para Parrot:
Parrot se basa en registros, como la mayoría de las CPU de hardware , y a diferencia de la mayoría de las máquinas virtuales, que se basan en pilas, Parrot ofrece cuatro tipos de registros:
Parrot proporciona un número arbitrario de registros; este número se fija en el momento de la compilación por subrutina.
En PASM
establecer I1 , 4 inc I1 # I1 ahora es 5 sumar I1 , 2 # I1 ahora es 7 establecer N1 , 42 .0 dec N1 # N1 ahora es 41.0 sub N1 , 2 .0 # N1 ahora es 39.0 imprimir I1 imprimir ' , ' imprimir N1 imprimir "\ n " fin
En PIR
. sub 'main' : main $I1 = 4 inc $I1 # $I1 ahora es 5 $I1 += 2 # $I1 ahora es 7 $N1 = 42.0 dec $N1 # $N1 ahora es 41.0 $N1 -= 2.0 # $N1 ahora es 39.0 print $I1 print ', ' print $N1 print "\n" . fin
mod_parrot es un módulo opcional para el servidor web Apache . Incorpora un intérprete de máquina virtual Parrot en el servidor Apache y brinda acceso a la API de Apache para permitir que los controladores se escriban en lenguaje ensamblador Parrot o en cualquier lenguaje de alto nivel destinado a Parrot.