[do it yourself] Compilation

Compilation [do it yourself] - Programmation

Marsh Posté le 24-06-2002 à 22:13:58    

yop tous !
 
 
pour des raisons de fun, apprentissage et tonification capilaire, je suis en train d'ecrire un *chtit* compilo. (je vous le concede, avec le temps qu'il fait dehors, c'est un peu dommage, mais bon, passons)L'affaire se presente plutot bien,  le titi compile comme il se doit des expressions plus ou moins farfelues,  mais la je suis face a un leger soucis "d'optimisation". (entre guillements car c'est un bien grand pour une si petite chose)
 
Voila le bleme :
 

Code :
  1. float toto;
  2. float titi;
  3. toto = 2;
  4. toto = titi + 1 + 1 ;


 
(ca ressemble a du C, mais la c'est bien le langage que je suis en train de bricoler)
 
N'importe quel humain doté du bagage mathematique d'un CE1 et de 4 neurones montées en série vous dira que ceci peut se simplifier en :
 
toto = titi + 2;
 
(ca va, tout le monde suit ? [:nofret])
 
Seulement, pas mon compilo (explications sur le pourquoi du comment plus tard)
 
par contre, si je fais :
 
toto = titi + (1+1);
 
ou bien
 
toto = 1 + 1 + titi;
 
la ca se transforme bien en  
 
toto = 2 + titi;
 
La cause profonde vient de l'arbre de syntaxe abstraite (d'une part) et de la méthode "d'optimisation" que j'ai employé (d'autre part). En effet, pour optimiser, je procede (en gros) de la maniere suivante :
 


Operande compile()
{
   Operande op1 = fils1->compile();
   Operande op2 = fils2->compile();
 
   si op1.estNumerique == vraie ET op2.estNumerique == vraie
       retourne op1 + op2;
 
   Operande op3;
   Instruction instr = "add op3,op1,op2"; // op3 = op1 + op2
   ajouteInstruction(instr);
   retourne op3;
}


 
bien, si les deux fils sont numérique, au lieu de faire une nouvelle instruction, je calcule la valeur et je renvoie une nouvelle operande numerique contenant op1+op2. Sinon je fais une nouvelle operande qui contiendra le resultat de l'instruction "add" et je renvoie celle ci.
 
Ceci peut sembler marcher (du moins, moi j'y croyais dur comme fer :D), mais en fait non, car apres parse de "titi + 1+1"  j'obtiens l'arbre suivant :
 


               +
              /  \
             /    \
            +      1
           /\
          /  \
        titi 1


 
 
 
Resultat  des courses : echec complet. La condition "op1.estNumerique == vraie ET op2.estNumerique == vraie" est jamais vérifié, donc aucun bricolage.
Ceci marcherait si a la place j'avais :
 


               +
              /  \
             /    \
            titi   +
                   /\
                  /  \
                 1   1


 
 
(ce que j'obtiens donc en changent le titi + 1 + 1 en 1 + 1 +titi ou avec des parentheses)
 
La question du jour étant bien entendu : comment faire pour n'avoir qu'une instruction et non deux ? (et si possible sans que tout l'édifice ne se mette à respirer le scotch et fil de peche a cause de manipulations douteuses sur l'arbre :D)
 
 
pour info, voila le bout de grammaire yacc incriminé :


 
procInstr :  procInstr '+' procInstr2  {$$ = new ZGCCodePlus($1,$3);}
;
 
procInstr2 : ident    {$$ = new ZGCCodeIdent($1);}
| float      {$$ = new ZGCCodeFloat($1);}
;


 
ident etant donc une chaine de caractere et float....ben un float quoi.
ZGCCodeFloat renvoie true a "estNumerique", tandis que ZGCCodeIdent renvoie faux
 
 
Thanks pour vos lumieres !
 
 
(apres 3 edit je pense que ce post ressemblera enfin a quelque chose [:olimou])


Message édité par chrisbk le 24-06-2002 à 22:19:35
Reply

Marsh Posté le 24-06-2002 à 22:13:58   

Reply

Marsh Posté le 25-06-2002 à 05:41:12    

Bon, faudrait que tu etudies les bouquins de compilation, section "Constant Folding". Le reperage des parties constantes d'une expression avant evaluation et leur traitement est ainsi appellé en theorie des compilos.
Grosso modo, le constant folding remplace une expression binaire ou unaire avec pour parametres des constantes, par leur resultat direct. Note: ce resultat doit etre equiuvalent a ce que la machine cible aurait generé comme résultat (et non pas ce que le compilateur du compilo a envie de mettre, car ca peut etre different, surtout en cas de cross-compilo).
Le constant folding est une "early optimization".
Si tu as deja assimilé toutes les bases de la théorie des compilos (ie tu as lu et compris le dragon book), tu peux continuer par le Advanced Compiler design and implementation de S. Muchnik, bon bouquin, mais cher.
A+,


Message édité par gilou le 25-06-2002 à 05:51:56

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 25-06-2002 à 11:38:24    

thk, j'irais faire un tour sur le net pour cette histoire de constant folding
 
J'ai lu aucun bouquin a ce sujet, mes connaissances la dessus c'est les cours qu'on a eu cette année (qui ne contenait rien sur cette partie la, donc) et du bricolage personnel :D

Reply

Marsh Posté le 25-06-2002 à 13:39:03    

Oui,
Mais c'est une des partie les plus complexes de l'ecriture d'un soft, l'ecriture d'un compilo, et y'a pas mal de methodes qui s'inventent pas car pas evidentes.
Le bouquin de base, c'est le dragon book, mais il est assez theorique. Si tu as pas eu de cours la dessus, essaie plutot de regarder une etude de cas comme les bouquins de Holub ou il implemente un compilo C.
Mais c'est sur que si tu restes avec Lex et Yacc, tu vas avoir des pbs pour implementer un constant folding generique.
A+,


Message édité par gilou le 25-06-2002 à 13:39:36

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 25-06-2002 à 13:42:30    

Gilou, veux tu bien me definir ce que le verbe "implementer" veut dire.
 
Car a ma connaissance ce mot n existe pas en francais.
 
dsl
 
@->--


---------------
The Only Way for Evils to Triumph is for Good Men to do Nothing @->-- Cours Réseaux@->-- Mon Site
Reply

Marsh Posté le 25-06-2002 à 13:46:42    

krzAramis a écrit a écrit :

Gilou, veux tu bien me definir ce que le verbe "implementer" veut dire.
 
Car a ma connaissance ce mot n existe pas en francais.
 
dsl
 
@->--




http://www.dicofr.com/jo/16-09-89-d.html
 
encore une fois google le savait

Reply

Marsh Posté le 25-06-2002 à 13:51:28    

il est cool ton lien "jolie sourire".
Mais ce que tu proposes c est le dico de "l informatique".
A mon avis ce mot est loin d etre incorporer dans le dicionaire de la langue francaise.
Ce qui est rigolo c est que la definition proposee est differente de son homologue anglaise (j en sais qqc je vis en Angleterre).
To implement: mettre en oeuvre !
 
Merci
 
@->--


---------------
The Only Way for Evils to Triumph is for Good Men to do Nothing @->-- Cours Réseaux@->-- Mon Site
Reply

Marsh Posté le 25-06-2002 à 14:12:17    

krzAramis a écrit a écrit :

il est cool ton lien "jolie sourire".
Mais ce que tu proposes c est le dico de "l informatique".
A mon avis ce mot est loin d etre incorporer dans le dicionaire de la langue francaise.
Ce qui est rigolo c est que la definition proposee est differente de son homologue anglaise (j en sais qqc je vis en Angleterre).
To implement: mettre en oeuvre !
 
Merci
 
@->--




 
pour qu'un mot soit incorporé dans un dictionnaire français, il faut que des types, qui soit dit en passant n'ont rien d'autre à foutre, l'ai rencontré un certains nombres de fois dans la presse écrite. Je ne crois pas qu'ils se soient encore interessé à l'internet. Par conséquent ce n'est pas parcequ'un mot n'est pas dans le petit R qu'il n'existe pas  ;)

Reply

Marsh Posté le 25-06-2002 à 14:25:19    

dakodak.
 
n empeche que l an dernier j ai rendu un "memoire" sur la norme MP3. Evidement qd tu t amuse a traduire la norme ISO de l anglais au francais, des "implement" t en a tout les deux mots. Alors pour faire le malin j ai mis des "implementer".
Et je me sius fait tordre !
c est tout !
 
 :pt1cable:  
@->--


---------------
The Only Way for Evils to Triumph is for Good Men to do Nothing @->-- Cours Réseaux@->-- Mon Site
Reply

Marsh Posté le 25-06-2002 à 14:35:44    

moi je repond au premier message...
 
bha en fait, on a fait ça en début de deuzième année d'IUT d'info...
 
ou alors ça ressemblait à mort...
avec l'arbre et tout et tout... on a fait ça en C++, ça nous à pris 2 mois et demi avec un prof un peu naz et des élèves à peine motivés...
 
Vala, c t ma participation inutile du jour...
à demain ! :hello:


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Marsh Posté le 25-06-2002 à 14:35:44   

Reply

Marsh Posté le 25-06-2002 à 14:44:46    

gilou a écrit a écrit :

Oui,
Mais c'est une des partie les plus complexes de l'ecriture d'un soft, l'ecriture d'un compilo, et y'a pas mal de methodes qui s'inventent pas car pas evidentes.
Le bouquin de base, c'est le dragon book, mais il est assez theorique. Si tu as pas eu de cours la dessus, essaie plutot de regarder une etude de cas comme les bouquins de Holub ou il implemente un compilo C.
Mais c'est sur que si tu restes avec Lex et Yacc, tu vas avoir des pbs pour implementer un constant folding generique.
A+,




 
Ben deja le compilo que j'ecris n'est pas hyper sophistiqué. Y'aura pas de feature tordu, de polymorphisme ou du je-ne-sais-quoi. Ca limite la casse. Vu que j'ai deja fait un autre chtit compilateur (une sorte de C sans pointeur) j'ai donc deja qqes connaissances en compilation, mais je ne pense pas que ca aille chercher bien loin...
 
Par contre, tu reproches quoi a flex/yacc ? Quels autre outil me proposerais tu ?
 
 
 
 

Reply

Marsh Posté le 25-06-2002 à 14:45:51    

brisssou a écrit a écrit :

moi je repond au premier message...
 
bha en fait, on a fait ça en début de deuzième année d'IUT d'info...
 
ou alors ça ressemblait à mort...
avec l'arbre et tout et tout... on a fait ça en C++, ça nous à pris 2 mois et demi avec un prof un peu naz et des élèves à peine motivés...
 
Vala, c t ma participation inutile du jour...
à demain ! :hello:  




 
avec le constant folding ?  
 
(celui ci je bosse depuis vendredi, ca avance plutot pas mal, je trouve, mais c vrai que je vois plus trop la lumiere du soleil :crazy: )
 

Reply

Marsh Posté le 26-06-2002 à 17:01:32    

bon, et bien, une recherche google sur "constant folding" m'a renvoyé deux trois trucs interessant.
 
j'ai donc laissé tomber la compilation directe a partir de l'asa pour deja généré du code en langage intermediaire. A partir de la j'ai attaqué l'optimisation du code intermidiaire, et ca marche plutot bien . des blagues genre :
 
a = 1;
b = 5;
t =  a + b + 1 + 1 +1;
 
se transforment maintenant finement en :
t = 9
 
ce qui est tout simplement formidable !
 
bon y'a encore quand meme pas mal de boulot :D
 


Message édité par chrisbk le 26-06-2002 à 17:01:54
Reply

Marsh Posté le 26-06-2002 à 21:00:13    

chrisbk a écrit a écrit :

bon, et bien, une recherche google sur "constant folding" m'a renvoyé deux trois trucs interessant.
 
j'ai donc laissé tomber la compilation directe a partir de l'asa pour deja généré du code en langage intermediaire. A partir de la j'ai attaqué l'optimisation du code intermidiaire, et ca marche plutot bien . des blagues genre :
 
a = 1;
b = 5;
t =  a + b + 1 + 1 +1;
 
se transforment maintenant finement en :
t = 9
 
ce qui est tout simplement formidable !
 
bon y'a encore quand meme pas mal de boulot :D
 
 




 :jap:


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-06-2002 à 21:07:07    

krzAramis a écrit a écrit :

Gilou, veux tu bien me definir ce que le verbe "implementer" veut dire.
 
Car a ma connaissance ce mot n existe pas en francais.
 
dsl
 
@->--




Ah bon, au cours de ma scolarité universitaire, ce verbe, ainsi que le nom derivé "implementation" a ete utilisé de maniere constante.
Je vois pas d'equivalent francais a priori (et certes pas implanter). Le verbe designe quelque chose d'assez precis: l'ensemble des actions entreprises afin de transformer un modele conceptuel en un programme executable (et parfois se restreint a designer la phase de l'ecriture des fichiers en un langage de programmation de cet executable).
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-06-2002 à 21:14:17    

krzAramis a écrit a écrit :

dakodak.
 
n empeche que l an dernier j ai rendu un "memoire" sur la norme MP3. Evidement qd tu t amuse a traduire la norme ISO de l anglais au francais, des "implement" t en a tout les deux mots. Alors pour faire le malin j ai mis des "implementer".
Et je me sius fait tordre !c est tout !
 
 :pt1cable:  
@->--




Tu veux dire quoi par là? que les types qui ont lu ton mémoire t'en ont fait la remarque, moi je les allume quand tu veux sur ce sujet.
Ca prouve leur betise.
L'evolution d'une langue ne se fait pas a coup de decrets, mais par l'usage des utilisateurs de cette langue. Si les utilisateurs emploient majoritairement un terme nouveau, eventuellement emprunté a une autre langue et adapté, pour designer un concept nouveau, ce terme devient de facto un mot nouveau de la langue.
Faire croire qu'un petit comité peut decider de ce qui fait partie de la langue ou non, est un concept qui a ete introduit pour des raisons politiques, mais qui ne correspond pas a la realité linguistique.
A+,


Message édité par gilou le 26-06-2002 à 21:16:50

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-06-2002 à 23:32:38    

brisssou a écrit a écrit :

moi je repond au premier message...
 
bha en fait, on a fait ça en début de deuzième année d'IUT d'info...
 
ou alors ça ressemblait à mort...
avec l'arbre et tout et tout... on a fait ça en C++, ça nous à pris 2 mois et demi avec un prof un peu naz et des élèves à peine motivés...
 
Vala, c t ma participation inutile du jour...
à demain ! :hello:  




 
 :hello: T'as fait l'iut info de grenoble si j'en crois ton profile ?
Moi aussi
 
moi aussi je peux faire des participations inutiles  [:shooter]


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 27-06-2002 à 00:15:00    

chrisbk a écrit a écrit :

bon, et bien, une recherche google sur "constant folding" m'a renvoyé deux trois trucs interessant.
 
j'ai donc laissé tomber la compilation directe a partir de l'asa pour deja généré du code en langage intermediaire. A partir de la j'ai attaqué l'optimisation du code intermidiaire, et ca marche plutot bien . des blagues genre :
 
a = 1;
b = 5;
t =  a + b + 1 + 1 +1;
 
se transforment maintenant finement en :
t = 9
 
ce qui est tout simplement formidable !
 
bon y'a encore quand meme pas mal de boulot :D
 
 




Tu peux aussi essayer de faire un front-end gcc pour ton langage :D
 
http://www.eskimo.com/~johnnyb/computers/toy/

Reply

Marsh Posté le 27-06-2002 à 04:14:14    

Verdoux a écrit a écrit :

 
Tu peux aussi essayer de faire un front-end gcc pour ton langage :D
 
http://www.eskimo.com/~johnnyb/computers/toy/




 
 
restons sobre, veux tu ? :D
 
 
 
(voulais juste dire que le tatouin vient de me pondre ses premieres ligne de code, que j'etais content, et que vu que ca marche je m'autorise a aller me pieuter  :D )

Reply

Marsh Posté le 27-06-2002 à 09:39:26    

mareek a écrit a écrit :

 
 
 :hello: T'as fait l'iut info de grenoble si j'en crois ton profile ?
Moi aussi
 
moi aussi je peux faire des participations inutiles  [:shooter]  




 
en alternance même que !! et pis la je viends juste de finir !!


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed