Parrot est une machine virtuelle conçue pour compiler et exécuter rapidement du bytecode de langages dynamiques. Parrot contient actuellement diverses implémentations de langage (de qualité variable) : Tcl, Javascript, Ruby, Lua, Scheme, PHP, Python, Perl 6, APL, et un traducteur de bytecode .NET.
Contrairement à Perl5, Parrot sépare clairement la phase de compilation et la phrase d'exécution, ce qui permet une grande modularité et facile d'autant le support d'autres langages que Perl.
Parrot a été conçu pour permettre l'interopérabilité entre les langages. Il est théoriquement possible d'écrire une classe en Perl, l'hériter en Python et l'instancier en Tcl. (Pour information, une machine virtuelle .NET (Microsoft ou Mono) permet également ce genre de chose.)
Parrot utilise 4 langages :
* PAST (Parrot Abstract Syntax Tree) : utilisé par les compilateurs (pour générer du PIR ou PASM ?)
* PIR (Parrot Intermediate Representation) : langage le plus haut pour écrire du bytecode
* PASM (Parrot Assembly) : version bas niveau du PIR
* PBC (Parrot Bytecode) : Résultat final de la compilation, code qui sera exécuté par la machine virtuelle
(PAST => PIR => PASM => PBC si j'ai bien compris ?)
Parrot contient un ramasse miettes, un compilateur à la volée (JIT), est écrit en C et distribué sous la licence « Artistic License 2.0 ».
Les développeurs Parrot ne manquant pas d'humour, ce dernier supporte également des langages exotiques comme BrainFuck, lolcode, ook, etc.
Projet Parrot : http://www.parrot.org/
Nouveautés de Parrot 1.0 : http://www.parrot.org/news/2009/Parrot-1.0.0
Je ne souhaite pas publier de dépêche car je n'ai jamais utilisé Parrot et je connais mal le projet. J'ai d'ailleurs rajouté des « ? » quand je n'étais pas sûr. Je vous laisse reprendre mon texte pour en faire une dépêche. Je pense que les commentaires serviront à corriger les fautes les plus évidentes.
# Liens utiles
Posté par Victor STINNER (site web personnel) . Évalué à 10.
https://trac.parrot.org/parrot/
Status des différents langages (est-ce que le tableau lui-même est à jour ?) :
https://trac.parrot.org/parrot/wiki/Languages
Documentation :
http://docs.parrot.org/parrot/latest/html/
L'implémentation de Perl6 pour Parrot s'appelle « Rakudo » :
http://github.com/rakudo/rakudo/tree/master
L'implémentation de Python pour Parrot la plus avancée semble être :
http://code.google.com/p/pynie/
... ne semble pas très avancé. Pirate (l'ancienne implémentation) semble mort depuis 2006.
# Perl 6
Posté par vida18 . Évalué à 2.
# PAST => PIR => PASM => PBC
Posté par ZeroHeure . Évalué à 4.
Je n'ai pas compris la même chose. Extrait de la page d'intro de parrot, avec amélioration de mise en page et fausse traduction à la volée en dessous (à votre service m'sieur-dames):
Parrot can currently accept instructions to execute in four forms.
PIR (Parrot Intermediate Representation) is designed to be written by people and generated by compilers. It hides away some low-level details, such as the way parameters are passed to functions.
PASM (Parrot Assembly) is a level below PIR - it is still human readable/writable and can be generated by a compiler, but the author has to take care of details such as calling conventions and register allocation.
PAST (Parrot Abstract Syntax Tree) enables Parrot to accept an abstract syntax tree style input - useful for those writing compilers.
All of the above forms of input are automatically converted inside Parrot to PBC (Parrot Bytecode).
This is much like machine code, but understood by the Parrot interpreter. It is not intended to be human-readable or human-writable, but unlike the other forms execution can start immediately, without the need for an assembly phase. Parrot bytecode is platform independent.
Parrot accepte 4 formes d'instructions à exécuter (machine vantarde!):
- PIR prévu pour être écrit par les gens ou généré par un compilateur sans trop s'emmerder;
- PASM, un niveau en dessous de PIR, toujours lisible/"écrivable" par des humains ou un compilateur, mais il faut faire attention à des détails bas niveau;
- PAST, plus abstrait, prévu pour les demi-génies qui écrivent un compilateur;
- Les 3 formes ci-dessus sont converties dans Parrot en PBC. Ce bytecode n'est pas compris ni écrit par des humains (vous êtes trop bêtes mes pauvres chéris), mais peut-être éxécuté immédiatement.
donc je comprends plutôt:
PIR \
PASM > PBC exécuté par Parrot
PABST /
"La liberté est à l'homme ce que les ailes sont à l'oiseau" Jean-Pierre Rosnay
[^] # Re: PAST => PIR => PASM => PBC
Posté par ZeroHeure . Évalué à 3.
PIR, PASM, PABST, PBC
\ /
\ /
\ /
\ /
\ /
PBC
traduction:
PIR, PASM, PABST, PBC tombent dans l'entonnoir et il en sort du PBC
"La liberté est à l'homme ce que les ailes sont à l'oiseau" Jean-Pierre Rosnay
[^] # Re: PAST => PIR => PASM => PBC
Posté par Florian Hatat . Évalué à 3.
Il y a par exemple PAST::Block, qui représente... un bloc ! Par exemple : des espaces de noms, des fonctions (ces dernières sont des blocs non immédiats : le corps n'est pas évalué tout de suite), ou encore, par exemple en C, tout ce qui se trouve entre des accolades. Il existe aussi PAST::Op : cette classe contient un appel à un opérateur, avec ses arguments (pour représenter un if/then/else, on mettrait l'opérateur "if" avec un nœud PAST pour la condition, et deux blocs pour le then et le else).
L'avantage de ces classes, c'est que le code est déjà prévu dans Parrot pour les transformer automatiquement en PIR. Cela facilite l'étape de génération de code quand on écrit un compilateur vers Parrot.
Pour écrire un compilateur, plusieurs outils (mini-langages) ont été prévus (ce sont les Parrot Compiler Tools) :
* on décrit la grammaire de son langage avec des regex Perl6,
* un mini-perl (NQP, pour Not Quite Perl) permet de transformer le résultat de l'analyse de la grammaire en nœuds PAST,
* et la plupart du temps, cela suffit à Parrot pour produire du PIR.
Sinon, le compilateur PIR produit directement du PBC, et pas du PASM (même si ça a dû être le cas à une époque : actuellement, la transformation PIR -> PASM n'est pas faite correctement).
# confus
Posté par oau . Évalué à 2.
Parrot a été conçu pour permettre l'interopérabilité entre les langages. Il est théoriquement possible d'écrire une classe en Perl, l'hériter en Python et l'instancier en Tcl. (Pour information, une machine virtuelle .NET (Microsoft ou Mono) permet également ce genre de chose.)
je ne suis pas développeur, enfin autant qu'un sysadmin peut l'être, mais ça me parait pas super ce genre de non ? J'aurais même tendance à éviter de le faire. Me trompe-je ?
[^] # Re: confus
Posté par brouillon . Évalué à 4.
Mais l'idée de pouvoir 'simplement' réutiliser dans un langage (e.g. perl) des composants écrits dans un autre langage (e.g. python), je trouve ca vraiment très intéressant.
[^] # Re: confus
Posté par ckyl . Évalué à 1.
Ça permet d'utiliser le langage le mieux adapté à la tache et d'arrêter de réinventer la roue ou de faire des bindings dégueulasses dans tout les sens. En plus, ca permet enfin aux nouveaux/petits langages d'avoir une chance d'être utilisés car ils héritent des bibliothèques de leur grand frère (autrement c'est comme arriver avec un nouveau noyau mais aucun support matériel, ça n'intéresse personne).
Bref, on t'impose une plateforme d'exécution : CLR, JVM, parrot ou ce que tu veux. Et après en négociant un peu, tu peux utiliser C#/F#/VB/IronPython ou Java/Scala/Clojure/Jython/Javascript etc.
Un utilisateur préférera peut être écrire son appli de 100 lignes de code en python, mais par contre pour les 500 000 lignes de bibliothèques derrière ce n'est peut être pas le meilleur choix...
[^] # Re: confus
Posté par TImaniac (site web personnel) . Évalué à 2.
[^] # Re: confus
Posté par Larry Cow . Évalué à 2.
[^] # Re: confus
Posté par TImaniac (site web personnel) . Évalué à 2.
[^] # Re: confus
Posté par kowalsky . Évalué à 1.
Mais si tu trouve une lib qui te plait en python, mais si c'est un langage de débutant ( :) ), ça serait bien de l'utiliser...!
Bon, en réalité, comme tout existe déjà en Perl, c'est inutile ! :)
# Questions de béotien
Posté par cedbor . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.