<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <html> <head> <title>Langage Costaud</title> <META Name="author" Content="Charles Henri-Pierre">  <META HTTP-EQUIV="Content-Type" content="text/html;charset=ISO-8859-1"> <LINK REL=STYLESHEET TYPE="text/css" HREF="/~hpc/commun/StyleHPC.css"> <!-- 2 jours --> <meta http-equiv="refresh" content="172800">  <META Name="description" Content="L'enseignement de la compilation">  <META Name="keywords" Content="Enseignement, compilation, lex, yacc, antlr"> </head> <body> <!-- Dbut du menu gauche --> <TABLE> <TR><TD bgcolor=#009966 VALIGN="top"> <a href="http://www.uvsq.fr/"><img src="/~hpc/commun/uvsq.gif" ALT="Universit"></a><br> <a href="http://www.prism.uvsq.fr"><img src="/~hpc/commun/prism.gif" ALT="Laboratoire"></a><br> <h3><a href="http://src.iut-velizy.uvsq.fr">Dpartement <br> 						SRC</a></h3><br>  <a href="/~hpc/"><img src="/~hpc/commun/hpchome.gif" ALT="H-P Charles"></a><br>H-P Charles<br>  <h3><a href="/~hpc/Enseignement/">Enseignement</a></h3><br> <h3><a href="/~hpc/Recherche/">Recherche</a></h3><br> <h3><a href="/~hpc/Seminaires/">Seminaires</a></h3><br> <h3><a href="http://vlaminck.prism.uvsq.fr:8080/doc/">Documentations</a></h3><br> <h3><a href="/~hpc/Logiciels/">Logiciels</a></h3><br> <h3><a href="/~hpc/WebCam/">WebCam</a></h3><br> Divers<br> </TD><TD bgcolor=#FFFFFF > <!-- Fin du menu gauche -->  <table> <tr><td> <table> <tr><td> <a href="/~hpc/Enseignement/Compilation/" ALT="Retour  la page d'accueil compilation"><img src="/~hpc/Enseignement/Compilation/Compil.gif"></a><br> </td> <td> <a href="/~hpc/Enseignement/Compilation/"><h3>Compilation</h3></a> <ul> <li><a href="/~hpc/Enseignement/Compilation/Cours/">Un cours et des TD en franais</a> <li> Kit de  survie pour  <a href="/~hpc/Enseignement/Compilation/Lex/">Lex</a>,  <a href="/~hpc/Enseignement/Compilation/Yacc/">Yacc</a>,  <a href="/~hpc/Enseignement/Compilation/ANTLR/">ANTLR</a>,   <a href="/~hpc/Enseignement/Compilation/Make/">Make</a>,  <a href="/~hpc/Enseignement/Compilation/Sparc/">Assembleur Sparc</a>.  <li><a href="/~hpc/Enseignement/Compilation/Projets.html">Projets de compilation</a> </ul> </td></tr></table> </TD></tr> <tr><TD bgcolor=#FFFFFF>  <h1>Langage Costaud</h1>	  Le langage Costaud est un interprteur/compilateur au vol d'un sous ensemble du langage FORTH.  <h1>Description</h1>  	Le FORTH est, d'aprs son auteur, un langage de quatrime gnration. C'est un langage  pile qui avait t initialement invent pour contrler un tlescope.   <p>	Plusieurs langages s'en sont inspirs par la suite, Postscript utilise les mmes concepts, certains moniteurs de machines sont des interprteurs FORTH et il existe plusieurs processeurs qui interprtent directement du FORTH.  <h1>Prsentation du langage</h1> 	 	Le langage est bas sur un vocabulaire extensible. Un certain nombre de mots sont disponibles lors du lancement de l'interprteur, et il est possible d'tendre le vocabulaire en rajoutant de nouveaux mots, ventuellement de redfinir d'anciens.   <p>	Il est interprt. Chaque suite de mots tape au clavier est lue, interprte, les rsultats ventuellement affichs et une autre entre est attendue.  	Il contient 2 piles. Une pile d'valuation sur laquelle on met tous les paramtre des mots et une pile de contrle.  <h2>Les oprations de base</h2>  	On peut l'utiliser comme une calculette en notation postfixe. Lorsqu'on tape un nombre, il est empil. Lorsqu'on tape une opration, elle s'effectue sur les oprandes qu'elle trouve sur la pile, qu'elle dpile et elle empile le rsultat.  	Les oprateurs sont les suivants: <ul> <li> * Multiplication <li> / Division entire <li> MOD Modulo <li> /MOD donne le reste et le quotient sur la pile. <li> + Addition <li> - Soustraction </ul>  	Jusque l, FORTH est une calculette classique. 	 <h2>Quelques mots de base</h2>  	Il comprend plusieurs mots de base qui permettent de manipuler les valeurs du sommet de pile.  <ul> <li>DROP <img src="DROP.png"> <li>DUP <img src="DUP.png"> <li>OVER <img src="OVER.png"> <li>ROT <img src="ROT.png"> <li>SWAP <img src="SWAP.png"> </ul>  	Pour chacun des mots <tt> DROP, SWAP, ROT, DUP, OVER</tt> il existe l'instruction ``doubl'correspondante <tt> 2DROP, 2SWAP, 2ROT, 2DUP, 2OVER</tt> qui utilise les entiers en double longueur.  	Avec ces mots de base la ``calculett' est tendue et permet de faire des calculs plus complexes.  <h2>Rupture de squence et boucles</h2> 	 	Pour avoir l'autorisation d'utiliser l'appellation ``langag' il est indispensable de pouvoir faire des calculs itratifs et d'effectuer des comparaisons.  <h2>Les oprateurs de comparaison</h2> Oprateur EGAL  <p><img src="EGAL.png">   <p>	Les comparaisons ne sont pas tout  fait ceux que l'on trouve dans les langages de programmation classiques:  <ul> <li><b>=</b> galit. Sur la figure \ref{fig:EGAL} on a indiqu l'action de cet oprateur. <li> &lt; Infrieur . <li> &gt; Suprieur . <li> 0= Egal  zro. <li> 0&lt; Infrieur  zro. <li> 0&gt; Suprieur  zro. </ul>  	Les 3 premiers oprateurs prennent 2 valeur sur la pile y laissent une valeur boolenne. Les 3 suivants laissent une valeur boolenne aprs n'avoir pris qu'une seule valeur sur la pile.  	L'intruction <tt> NOT </tt> inverse la valeur boolenne qui se trouve sur la pile.  <h2>La rupture de squence</h2>  	L'instruction <tt> IF</tt> a 2 variantes:  <ul> <li> <tt> IF Liste d'intruction THEN</tt> excute \{Liste d'intruction\} si la valeur qui est stocke sur la pile est VRAI. Sinon elle ne fait rien.  <li> <tt> IF \{Liste 1 d'intruction\} ELSE \{Liste 2 d'intruction\} THEN}</tt> Excute \{Liste 1 d'intruction\} si la condition sur la pile est vraie sinon la \{Liste 2 d'intruction\} est excute. </ul>  <h2>L'itration</h2>  Il existe plusieurs fac,ons d'effectuer des boucles:  <p><tt> DO \{ Liste d'instructions\} LOOP</tt>  <p>A l'excution de DO l'interprteur transfre 2 valeurs de la pile d'valuation sur la pile de contrle. Ces 2 valeurs sont appeles limite et index.  <p>L'excution de LOOP compare les 2 donnes prsentes sur la pile de contrle si les 2 valeurs sont gales, l'excution continue en squence, sinon index est incrment et \{ Liste d'instructions\} est rexcut.  <h2>Les entres sorties</h2>  <p>Il existe un certain nombre de mots permettant de faire des affichages: <ul>  <li> . Affiche, dans la base courante, la valeur qui est prsente sur la pile et la dpile.  <li> EMIT Affiche le caractre dont le Nro ASCII est prsent sur la pile.  <li> CR Affiche le caractre Retour Chariot.  <li> PAGE Efface l'cran.  <li> BEEP Affiche le caractre ACSII bel.  <li> BINAIRE Passe la base d'affichage  2.  <li> OCTAL Passe la base d'affichage  8.  <li> HEX Passe la base d'affichage  16. </ul>  <p>Avec le vocabulaire que nous connaissons maintenant, on peut dj faire pas mal de calculs itratifs, contenant des tests et effectuant des affichages. Il manque encore la possibilit de faire des effets de bords.  <h2>Variables et tableau</h2>  <p>La cration et la manipulation de variables s'effectue avec les mots suivants: <ul> <li>  <li> VARIABLE <tt> Nom</tt> Cre une variable et lui donne  le nom <tt> Nom</tt>.  <li> ALLOT <tt> Nom</tt> Cre un tableau d'entiers dont la taille est sur la pile et donne le nom <tt> Nom</tt> comme adresse de base.  <li> <tt> Nom</tt> @ Met la valeur de la variable <tt> Nom</tt> sur la pile.  <li> <tt> Nom</tt> ! Stocke la valeur qui est sur le sommet de la pile dans la variable <tt> Nom</tt>. </ul>  <p>Il ne manque qu'une dfinition pour que cela devienne un vritable langage.  <h2>Dfinition de mots</h2>  <p>La dfinition d'un nouveau mot en FORTH se fait de la fac,on suivante:  <p><b>:</b><tt>Nom</tt> (Liste de mots) <b>;</b>  <p>Permet de dfinir un nouveau mot qui porte le nom <tt> Nom</tt> et dont l'appel provoque l'excution de \{ Liste de mots \}.  <p><img src="VOCABULAIRE.png">  <p>Nous allons traiter ici un exemple et montrer comment cela est stock dans un FORTH standard.  <p>Le vocabulaire d'un interprteur FORTH standard est une liste chaine qui contient les diffrents mots du vocabulaire. Chaque entre pour un mot contient le nom du mot qui permet de le trouver, un lien vers le mot suivant et un pointeur de code qui donne l'adresse d'une procdure qui saura quoi excuter suivant le type de la dfinition.	  <p>Sur la figure \ref{fig:VOCABULAIRE} on donne un exemple d'une telle liste.  <p>Dans cette figure on reprsente une liste de dfinition dont la premire reprsente la dfinition du mot <tt> CARRE</tt>. Ce mot sert  lever au carr la valeur qui se trouve sur la pile et peut tre dfini en FORTH de la fac,on suivante:  <p>: CARRE DUP * ;  <p>La dfinition sera alors constitue d'un enregistrement comprenant le nom de la dfinition, d'un lien permettant de parcourir la liste des dfinitions, d'un pointeur donnant le point d'entre d'une procdure correspondant  l'excution d'un nom et d'une liste de pointeurs donnant les adresses des noms constituant le nom CARRE (Un pointeur sur le nom DUP et un pointeur sur le nom * ).  <p>Dans l'interprteur FORTH standard tout est stock dans cette liste. Une dclaration de variable est stocke sous la forme d'un enregistrement contenant un nom de variable, un lien, un pointeur vers une procdure qui calcule l'adresse de la variable et d'une zone mmoire correspondant  la variable.  <h2>Le travail demand</h2>  <p>Vous devez raliser un interprteur FORTH qui implmente tous les mots qui sont dfinis dans ce document. S'il vous reste du temps vous pourrez ajouter facilement d'autres constructions ( DO, WHILE, ...), tendre les types possibles (Rels, Chaines de caractres, ...), ...  <p>L'interprteur sera programm en C.  <p>Vous n'etes pas oblig d'utiliser la structure de donne explique au paragraphe prcdent c'est mme fortement dconseill.  <p>Vous devrez rendre un cahier des charges dcrivant quelles sont les options que vous avez choisies (Ce que vous avez implant, la structure de donne que vous utilisez, ...), un dossier de programmation dcrivant la structure de votre interprteur, les sources de vos programmes et un programme excutable avec son mode d'emploi.  <p>"Que le FORTH soit avec vous ..."  <h1>Travail  rendre</h1>   </table>  </TD></TR> </TABLE> Modifi pour la dernire fois le Monday, 08-Apr-2002 18:27:04 CEST <address> <a href="mailto:hpc@hpc-home.prism.uvsq.fr">Charles Henri-Pierre</a> </address>  </html> 
