[Toulouse-pm] Re: [ppm] YAPC::Europe::2003 (3) (fwd)

Michel Rodriguez mirod at xmltwig.com
Tue Jul 29 15:14:05 CDT 2003


Encore un mail, avec des precisions sur Parrot

Michel Rodriguez
Perl & XML
http://www.xmltwig.com

---------- Forwarded message ----------
Date: Tue, 29 Jul 2003 21:36:03 +0200
From: "[iso-8859-1] Stéphane Payrard" <stef at payrard.net>
To: Paris.pm <paris-pm-list at pm.org>
Subject: Re: [ppm] YAPC::Europe::2003 (3)

On Tue, Jul 29, 2003 at 04:42:15PM +0200, Sébastien Aperghis-Tramoni wrote:
> Vendredi 25 juillet

Quel corrections et amplifications.

>
> * Dan Sugalski - Parrot in a nutshell
>     Dan présente Parrot en commençant par expliquer en quoi
>     l'interpréteur Perl5 actuel est un vrai merdier. En effet, Perl5
>     est le résultat de 9 ans de patches successifs pour ajouter un
>     ensemble de fonctionnalités qui n'avaient pas été prévues au
>     départ car cela n'existait pas à l'époque : on pense tout
>     particulièrement au support des threads et d'Unicode.
>
>     Des tas de personnes ont donc proposé des patches en disant
>     "cela ne coûte qu'1% du temps d'exécution". Mais les patches
>     étant acceptés, les pourcentages se sont additionnés pour
>     ralentir de manière sensible l'interpréteur Perl. (Raison pour
>     laquelle Nick Clark indiquait qu'un moyen potentiel d'accélérer
>     un programme était d'utiliser une ancienne version de Perl.)
>
>     Perl6 se base sur une machine virtuelle (VM) totalement nouvelle,
>     Parrot. Cette machine virtuelle a été conçue en utilisant les
>     dernières avancées en matière des techniques de VM, de
>     théorie de compilation et de conception des CPUs (ces domaines
>     étant liés). Le projet est ambitieux mais on espère ainsi que
>     cette VM évoluera de manière plus douce sur la décade à venir.

[snip]
>
>
> * Leopold Tötsch - Of Ops and MOps
>     Dans un anglais quelque peu hésitant, Leo nous explique les
>     bases de la programmation en Parrot.
>
>     On peut d'ores et déjà programmer en PASM, ou Parrot
>     Assembler, qui est un assembleur (en fait c'est plutôt un
>     macro-assembleur) dont la syntaxe semble assez facile.
>     Lors de l'exécution, l'assembleur est convertit en PIR,
>     Parrot Intermediate Representation Language, qui est
>     ensuite exécuté.


                                                 --> génération
                                                     exécutable
Langage de haut niveaux --> PIR --> PASM --> PBC --> NRJIT ---->  interprétation/exécution
                                                 -------------->

NRJIT est l'acronyme que j'invente pour Not Really JIT

En fait les formats sont les suivants:

     PIR: Parrot Intermediate Representation Language. C'est un
           assembleur à base de registres typés qui gère aussi
           les espaces de noms. Les registres sont de types:
           entiers, numériques, chaînes et PMC, pour Perl Magic
           Cookie. PIR propose un nombre illimitée de registre
           appelés registres symboliques.

           IMMC (Intermediate Code Compiler for Parrot, maitenant
           une passe de Parrot) transcrit ça en PASM en passant
           de la fiction du nombre illimité de registres à la
           "réalité" de nombre effectif de registre faisant
           l'allocation avec un algorithme à base de couleurs qui
           représentent les registres réels. A un instant donné,
           deux registres symbolique ne peuvet être affecté au
           même registre réel donc ne peuvent pas avoir la même
           couleur. Quand il y a trop de registres symboliques,
           PIR génère des instructions PASM de gestion de
           débordement dans un tableau pointé par un registre à
           cet effet.

     PASM:

          PASM est le vériable macro-assembleur de Parrot au sens
          qu'une fois les macros expansées il y une bijection
          entre les instructions PASM et les instructions
          binaires de bytecode générées. Mais maitenant que IMCC
          est opérationnel, il n'y a aucune raison de travailler
          à ce niveau. Sauf quand on débugge avec pdb, le parrot
          debugger.

    PBC:

         Parrot Bytcode. Format portable. Il est mappé (mmmap() en mémoire
         après quelque retouches (dont l'endianness) et
         génération de code natif pour les opcodes
         supportable/és dans une architecture donné. Différentes
         instances de parrot utilisant le un-core du même type du même PBC
         devraient partager le BPC mappé en mémoire. Je sais pas si c'est vrai
         aujourd'hui.


>
>     Leo présente ensuite quelques points qui permettent à Parrot
>     d'être très rapide :
>
>     - Parrot est une machine à registre, c'est-à-dire que tant la VM
>       que le langage d'assembleur considère qu'on a beaucoup de
>       registres disponibles, ce qui simplifie la vie du programmeur et
>       est facile à optimiser en aval (par aliasing de registres par
>       exemple). La VM ressemble donc à un processeur RISC (genre
>       PowerPC ou Sparc) mais pas à un processeur Intel ou AMD.
>
>     - les PMC (Parrot Magic Cookies) ont une taille de 32 octets
>       (là je dois reconnaître qu'il m'a un peu embrouillé et je ne
>       pas trop compris ses arguments, mais une comparaison avec
>       les vrais CPUs indique qu'une taille fixe égale à un multiple
>       entier de mots machine permet de se simplifier la vie lors des
>       calculs d'adresses (là encore voir l'opposition entre les CPUs
>       RISC et x86)).

Plus que de calcul d'adresses en soi avec les contraintes
d'alignement que cela suposse, il s'agit surtout d'optimisations
pour le DOD et le GC qui n'ont pas encore l'imprimatur de Dan.
DOD et GC acronymes de Garbage Gollection et Dead Object
Detection. Pour les pros du GC, la distinction (que je n'ai pas
comprise) n'est pas celle entre les deux passes "mark" et "sweep"

Passer de la gestion de la mémoire type comptage de référence
(Perl5) à celui d'un véritable ramassage de miettes a l'effet
souhaité une optimisation optimals des caches. Pour ce faire, Leo
casse les PMCs en deux parties. Les premières parties des PMC
sont allouées dans la même zone, ce qui fait que le GC utilise
mieux les caches du processeur (réel). Mais le coût à payer est
une indirection supplémentaire pour accéder les données allouées
par le PMC.

Le choix est délicat (couramment implémenté par un #ifdef) car il
ne faut pas optimiser indûment le collecteur au détriment du
mutateur. Ce dernier étant dans la terminologie GC le programme
de l'utilisateur avec sa sale propension à tout changer dans le
dos du collecteur.

>
>     - DOD (Dead Object Detection)
>
>     - COW (Copy-on-Write) est un mécanisme qui permet de retarder
>       les opérations d'allocations mémoire au pus tard. L'exemple
>       typique est :
>           $foo = "hello world";
>           $bar = $foo;
>       Habituellement, le contenu de $foo est copié dans un nouvel
>       espace mémoire qui sera pointé par $bar. Avec COW, $bar
>       pointe vers l'espace mémoire de $foo, et ce n'est que si on
>       modifie la valeur de l'une ou l'autre des variables qu'une
>       nouvel espace mémoire est créé.

C'est encore plus fort que ça, puisque ça marche aussi pour les
substrings, les tableaux et sous tableaux. Presque tout est à base
de listes de "morceaux" chaînés sujets à COW. Outre le COW, cela
permet de faire des insertions et effacements au milieu d'un
tableau sans avoir à décaler le reste du tableau dans la mémoire.
Je crois que le contenu d'une chaîne est (encore) en un morceau.
Tout est à base de COW dans Parrot.

Le COW est absolument nécessaire pour la gestion des
continuations qui sont des contextes d'exécution. Ils sont amenés
à diverger et l'implémentatin en terme de COW permet de les faire
diverger morceau par morceau au lieu de copier entièrement les
contextes ou gérer la divergence à la main.

Toutes ces optimisations ne sont pas nouvelles mais n'ont guère
été utilisées jusqu'ici que dans les mondes lisp et assimilés.





>       Cette fonctionnalité semblait particulièrement intéresser
>       certaines personnes du public qui avait posé la question à
>       MJD lors de son talk "Tricks of the Wizard". Le mécanisme
>       sera par la suite mis en scène par Nick Clark lors de son
>       lightning talk, comme l'a déjà décrit Mirod.
>
>     Leo expose ensuite quelques uns des différents run cores
>     disponibles dans Parrot. Si j'ai bien compris, les run cores sont
>     les coeur d'exécution de Parrot, mais comme ils n'étaient pas sûr
>     de savoir quel mécanisme serait le plus efficace, ils ont développé
>     plusieurs run cores : Fast Core, Goto Core, Slow Core, et des
>     combinaisons. Leo montre le Fast Core avec du code C :
>         while(PC) {
>             PC = ((INTERP->op_func_table)[*PC])(PC,INTERP);
>         }
>     Je crois que la majeure partie de la salle est restée dubitative
>     face à ça...

Je suis largué sur ce coup là.

>
>     Leo explique ensuite que Parrot dispose d'un sous-système JIT
>     (Just-In-Time) disponible pour plusieurs architectures (x86,
>     PowerPC, Sparc, ARM, Alpha).
>         Pour rappel, un système JIT (aussi dit de recompilation
>         dynamique), permet de transformer le bytecode en code
>         natif pour le CPU de la machine hôte. C'est ce qui permet
>         à Java d'avoir des vitesses d'exécution à peu près acceptables.
>     Leo nous montre le résultat d'un benchmark qu'il avait lancé au
>     cours de son talk; c'est un truc calculatoire écrit en Perl et en
>     Python. Les temps d'exécution sont lamentables, à peine 2 ops
>     par seconde en Perl et 1 op par seconde en Python. "Times are
>     rounded up!" précise Leo. Il exécute le même en Parrot : quelques
>     secondes, soit presque 800 ops par secondes (son PowerBook
>     tourne à 800 MHz..)
>
>     Après cette démonstration, Leo conclut sur le système JIT en
>     indiquant que comme a pu le constater, on peut arriver à exécuter
>     jusqu'à 1 instruction Parrot par cycle CPU ! Évidemment, c'est
>     surtout valable pour les instructions "simples" (ou du moins
>     disponibles dans le CPU), mais c'est néanmoins assez
>     impressionnant.
>
>     Sa présentation terminée, quelqu'un dans le public demande
>     à Leo de montrer qu'est-ce qu'il utilise pour ses "slides" (du
>     texte affiché dans un terminal qui efface l'écran et défile quand
>     il appuie sur une touche) : "Parrot of course!". Il montre le code
>     assembleur Parrot qu'il a utilisé pour son talk, qui doit faire
>     moins d'une cinquantaine de lignes. Nouvelle salve
>     d'applaudissements.

A propos du JIT et comme indiqué sur un des slides de Dan par un
TLA (Three Letter Acronym) que j'ai oublié : ce n'est pas
vraiment du JIT (Just In Time) puisque la génération du code
natif est faite avant l'exécution.

Et pour finir, news encore chaude, il est maintenant possible de
générer un exécutable (qui doit probablement contenir tout le
run-time).


Note: le rapport hebdomadaire de pdcauley commence par les enchères
YAPC.

   Welcome to another in the ongoing series of Perl 6 summaries in which
    your faintly frazzled summarizer attempts to find a native speaker of
    Esperanto to translate this opening paragraph in honour of the huge
    amount of money (1371 Euros) raised for TPF during the YAPC::Europe
    auction, when the official language of both London.pm and Paris.pm's
    websites were auctioned off as one lot. Somewhat to the surprise of
    everyone, the winning bid was for Esperanto. As Jouke Visser just
    commented on IRC, the price was well worth paying just to see the looks
    of panic on the faces of Mark Fowler, Leon Brocard and other London.pm
    worthies as the price of keeping the website English (and changing
    Paris.pm's website to English in the process) shot up beyond the reach
    of their collective pocket.

pdcauley était à YAPC. Quelqu'un peut me le décrire que je
mette une tête sur son nom?

Dans le BOF parrot, je me suis rencu compte que la communication
entre Dan et Leo etait quelquefois difficile. pdcauley se
souvient de l'échange de parole le plus significatif:

 Dan: I'm really bad at reading my mails Leo: You should at least read
    *my* mails Everyone: Hear! Hear! (or words to that effect)

Leo codant plus vite que son ombre, Dan ne suis pas toujours et la
chose codée n'est pas toujours congruente avec ses cogitations présentes
c'est à dire ses spécifications à venir.

( $a = "Il y a-t'il vraiment un seul Leon" ) =~ s/n$//  ; print "$a\n"

En tout cas, c'est la première fois (je crois) que Dan rencontre Leo
et on a tous constaté Leo existe réellement.

>
>
> Sébastien Aperghis-Tramoni

--
 stef
-
Paris Perl Mongueu(r|se)s  => http://paris.mongueurs.net/mail.html





More information about the Toulouse-pm mailing list