Journal Publication de Parrot 1.0

Posté par (page perso) .
Tags : aucun
22
19
mar.
2009
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 (page perso) . Évalué à 10.

    Wiki :
    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 . Évalué à 2.

    Si Parrot est fini, ça veut dire que la sortie de Perl 6 en version stable est proche.
  • # PAST => PIR => PASM => PBC

    Posté par (page perso) . Évalué à 4.

    (PAST => PIR => PASM => PBC si j'ai bien compris ?)

    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 (page perso) . Évalué à 3.

      zut je n'avais pas vu, mon joli schéma a été détruit par la machine (jalouse, va) donc le revoilà:
       

        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 (page perso) . Évalué à 3.

      PAST n'est pas un langage lu par Parrot, il s'agit uniquement d'un ensemble de classes prédéfinies pour décrire l'arbre de syntaxe abstraite d'un programme.

      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 . É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 . Évalué à 4.

      si on prend cet exemple "écrire une classe en Perl, l'hériter en Python et l'instancier en Tcl" ce n'est peu être pas ce qu'il y a de plus conseillé (et encore, je ne peux même pas affirmer que ce genre de chose est mauvaise).
      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 . Évalué à 1.

      Pourquoi ? Tu peux développer ton point de vue ?

      Ç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 (page perso) . Évalué à 2.

        Oué autant pour le CLR et la JVM, je comprends : y'a un bytecode "commun" qui sert aussi de format de déploiement (et donc réutilisation des composants sans "trop" se soucier du langage) mais pour parrot ? y'a un format de déploiement ?
    • [^] # Re: confus

      Posté par . Évalué à 1.

      Oui, si tu dois ecrire un projet, fais le tout en Perl (un troll se glisse quelque part...), c'est evident !

      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 . Évalué à 2.

    Je n'ai pas trouvé l'info sur le site, alors je demande en vrac : Parrot permet-il de tirer parti de processeurs multicores? Quid des libs (par ex python) tierces? Ca marche vraiment la 1.0? A l'heure actuelle, à quoi ça sert concrètement (Par ex pour faire tourner un prog avec gui wxwindow+qq libs tierces)?

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.