Parrot est une machine virtuelle de processus basée sur des registres abandonnée conçue pour exécuter efficacement des langages dynamiques . Il est possible de compiler le langage assembleur Parrot et la représentation intermédiaire Parrot (PIR, un langage intermédiaire) en bytecode Parrot et de l'exécuter. Parrot est un logiciel gratuit et open source .
Parrot a été lancé par la communauté Perl et développé avec l'aide des communautés open source et du logiciel libre . Par conséquent, il s'est concentré sur la compatibilité de la licence avec Perl ( licence artistique 2.0 ), la compatibilité de la plate-forme sur un large éventail de systèmes, la compatibilité de l'architecture du processeur avec la plupart des processeurs modernes, la vitesse d'exécution, la petite taille (environ 700 000 selon la plate-forme) et la flexibilité pour gérer les différentes demandes formulées par Raku et d'autres langages dynamiques modernes .
La version 1.0, avec une interface de programmation d'applications (API) stable pour le développement, a été publiée le 17 mars 2009. La dernière version est la version 8.1.0 « Andean Parakeet ». Parrot a été officiellement abandonné en août 2021, après avoir été supplanté par MoarVM dans son utilisation principale (Raku) et n'être jamais devenu une machine virtuelle grand public pour aucun de ses autres langages pris en charge.
Histoire
Le nom Parrot vient d'un poisson d'avril qui annonçait un langage hypothétique, nommé Parrot , qui unifierait Python et Perl . Le nom a ensuite été adopté par le projet Parrot (initialement une partie de l'effort de développement de Raku) qui visait à prendre en charge Raku, Python et d'autres langages de programmation.
La Fondation Parrot a été dissoute en 2014. La Fondation a été créée en 2008 pour détenir les droits d'auteur et les marques déposées du projet Parrot, pour aider à piloter le développement des implémentations linguistiques et de la base de code principale, pour fournir une base pour la croissance de la communauté Parrot et pour atteindre d'autres communautés linguistiques.
Les décisions de conception historiques sont documentées sous la forme de documents de conception Parrot, ou PDD, dans le référentiel Parrot.
Jusqu'à la fin de l'année 2005, Dan Sugalski était le concepteur principal et l'architecte en chef de Parrot. Chip Salzenberg, un hacker de longue date de Perl, du noyau Linux et du C++, a pris la relève jusqu'à la mi-2006, date à laquelle il est devenu le développeur principal. Allison Randal , le développeur principal de Punie et l'architecte en chef des outils de compilation de Parrot, était l'architecte en chef jusqu'à la mi-octobre 2010, date à laquelle elle a démissionné et a choisi Christoph Otto comme nouvel architecte en chef.
Langues
L'objectif de la machine virtuelle Parrot était d'héberger des langages clients et de permettre l'interopérabilité entre eux. Plusieurs obstacles empêchent d'atteindre cet objectif, notamment la difficulté de mapper des concepts, des données et des structures de données de haut niveau entre les langages.
Langages statiques et dynamiques
Les propriétés différentes des langages typés statiquement et dynamiquement ont motivé la conception de Parrot. Les machines virtuelles courantes actuelles telles que la machine virtuelle Java et le Common Language Runtime , pour la plateforme .NET , ont été conçues pour les langages typés statiquement, tandis que les langages ciblés par Parrot sont typés dynamiquement.
Les machines virtuelles telles que la machine virtuelle Java et la machine virtuelle Perl 5 actuelle sont également basées sur la pile . Les développeurs de Parrot ont choisi une conception basée sur les registres, pensant qu'elle ressemble davantage à une conception matérielle, permettant d'utiliser la vaste littérature sur l'optimisation du compilateur pour générer du bytecode pour la machine virtuelle Parrot qui pourrait s'exécuter à des vitesses plus proches du code machine . D'autres machines virtuelles basées sur les registres ont inspiré des parties de la conception de Parrot, notamment LLVM , la VM Lua et Dis d'Inferno .
Concepts fonctionnels
Parrot prend en charge plusieurs fonctionnalités de programmation fonctionnelle, notamment les fermetures et les continuations , qui peuvent toutes deux être particulièrement difficiles à implémenter correctement et de manière portable, en particulier en conjonction avec la gestion des exceptions et le threading . Le plus grand avantage est l'extensibilité dynamique des objets avec des méthodes, ce qui permet d'utiliser des conteneurs polymorphes (PMC) et les opcodes associés . L'implémentation de solutions à ces problèmes au niveau de la machine virtuelle évite d'avoir à les résoudre dans les langages clients individuels.
Outils de compilation
Parrot fournit une suite d'outils d'écriture de compilateurs qui comprend le Parser Grammar Engine (PGE), un analyseur-générateur hybride qui peut exprimer un analyseur de descente récursive ainsi qu'un analyseur de priorité d'opérateur , permettant une transition libre entre les deux dans une seule grammaire. Le PGE alimente le Tree Grammar Engine (TGE) qui transforme ensuite l'arbre d'analyse généré par PGE pour l'optimisation et finalement pour la génération de code.
Implémentations
Les implémentations de langage les plus complètes ciblant la machine virtuelle Parrot étaient Raku (connu à l'époque sous le nom de Rakudo Perl 6), Lua et un nouveau langage appelé « Winxed ». Des projets visant à implémenter de nombreux autres langages ont été lancés, notamment PHP , Python et Ruby , ainsi que des langages ésotériques et de démonstration tels que Befunge et le langage didacticiel « squaak ». Aucun de ces projets n'a réussi à devenir l'implémentation principale de leurs langages respectifs.
Internes
Il existe trois formes de code de programme pour Parrot :
- Le bytecode est binaire et est interprété nativement par Parrot. Le bytecode est généralement stocké dans des fichiers portant l' extension de nom de fichier « .pbc ».
- Le langage assembleur Parrot (PASM) est un langage de bas niveau qui compile le code binaire. Le code PASM est généralement stocké dans des fichiers portant l'extension de nom de fichier « .pasm ».
- La représentation intermédiaire de Parrot (PIR ) est un langage de niveau légèrement supérieur à PASM et se compile également en bytecode. C'est la cible principale des implémentations de langage. PIR gère de manière transparente les conventions d'appel inter-routines de Parrot, fournit une syntaxe améliorée, l'allocation de registres, etc. Le code PIR est généralement stocké dans des fichiers avec l'extension de nom de fichier ".pir".
Exemples
Registres
Parrot est basé sur des registres comme la plupart des processeurs matériels , et contrairement à la plupart des machines virtuelles, qui sont basées sur des piles. Parrot fournit quatre types de registres :
- I : type entier natif
- N : nombres à virgule flottante
- S : registres de chaînes avancés avec prise en charge Unicode
- P : PMC ou Polymorphic Container — type d'objet Parrot
Parrot fournit un nombre arbitraire de registres ; ce nombre est fixé au moment de la compilation par sous-routine.
Opérations arithmétiques
Dans PASM
set I1 , 4 inc I1 # I1 est maintenant 5 add I1 , 2 # I1 est maintenant 7 set N1 , 42 .0 dec N1 # N1 est maintenant 41.0 sub N1 , 2 .0 # N1 est maintenant 39.0 print I1 print ' , ' print N1 print "\ n " fin
Dans PIR
. sub 'main' : main $I1 = 4 inc $I1 # $I1 est maintenant 5 $I1 += 2 # $I1 est maintenant 7 $N1 = 42.0 dec $N1 # $N1 est maintenant 41.0 $N1 -= 2.0 # $N1 est maintenant 39.0 print $I1 print ', ' print $N1 print . end
mod_parrot
mod_parrot est un module optionnel pour le serveur Web Apache . Il intègre un interpréteur de machine virtuelle Parrot dans le serveur Apache et fournit un accès à l'API Apache pour permettre l'écriture de gestionnaires en langage assembleur Parrot ou dans tout autre langage de haut niveau destiné à Parrot.