Sophie

Sophie

distrib > Mandriva > 9.0 > i586 > by-pkgid > 0d5cd12c82d627a82c59047e1ba7b8a9 > files > 92

howto-html-fr-9.0-0.2mdk.noarch.rpm

<HTML>
<HEAD>
<TITLE>M&eacute;ta-programmation/macro-traitement</TITLE>
</HEAD>
<BODY>
<H1>4. <A NAME="s4"></A>M&eacute;ta-programmation/macro-traitement</H1>
<P>
<A HREF="Assembly-HOWTO.html#toc4">Contenu de cette section</A></P>

<P></P>
<P>La programmation en assembleur est particuli&egrave;rement p&eacute;nible
si ce n'est pour certaines parties critiques des programmes.</P>
<P>Pour travail donn&eacute;, il faut l'outil appropri&eacute;;
ne choisissez donc pas l'assembleur
lorsqu'il ne correspond pas au probl&egrave;me &agrave; r&eacute;soudre:
C, OCAML, perl, Scheme peuvent &ecirc;tre un meilleur choix
dans la plupart des cas.</P>
<P>Toutefois, il y a certains cas o&ugrave; ces outils n'ont pas un contr&ocirc;le
suffisamment fin sur la machine, et o&ugrave; l'assembleur est utile ou n&eacute;cessaire.
Dans ces cas, vous appr&eacute;cierez un syst&egrave;me de programmation par macros,
ou un syst&egrave;me de m&eacute;ta-programmation, qui permet aux motifs r&eacute;p&eacute;titifs
d'&ecirc;tre factoris&eacute;s chacun en une seule d&eacute;finition ind&eacute;finiment r&eacute;utilisable.
Cela permet une programmation plus s&ucirc;re, une propagation automatique
des modifications desdits motifs, etc.
Un assembleur de base souvent ne suffit pas,
m&ecirc;me pour n'&eacute;crire que de petites routines &agrave; lier &agrave; du code C.</P>
<P></P>
<P></P>
<H2>4.1 <A NAME="ss4.1"></A> Description</H2>

<P></P>
<P>Oui, je sais que cette partie peut manquer d'informations utiles &agrave; jour.
Vous &ecirc;tes libres de me faire part des d&eacute;couvertes que vous auriez d&ucirc; faire
&agrave; la dure...</P>
<P></P>
<P></P>
<H3>GCC</H3>

<P></P>
<P></P>
<P>GCC vous permet (et vous oblige) de sp&eacute;cifier les contraintes
entre registres assembleurs et objets C,
pour que le compilateur puisse interfacer le code assembleur avec
le code produit par l'optimiseur.
Le code assembleur en ligne est donc constitu&eacute; de motifs,
et pas forc&eacute;ment de code exact.</P>
<P>Et puis, vous pouvez mettre du code assembleur dans des macro-d&eacute;finitions
de CPP ou des fonctions "en-ligne" (inline), de telle mani&egrave;re que tout le
monde puisse les utiliser comme n'importe quelle fonction ou macro C.
Les fonctions en ligne ressemblent &eacute;norm&eacute;ment aux macros mais sont parfois plus
propres &agrave; utiliser.
M&eacute;fiez-vous car dans tous ces cas, le code sera dupliqu&eacute;,
et donc seules les &eacute;tiquettes locales (comme <CODE>1:</CODE>)
devraient &ecirc;tre d&eacute;finies dans ce code assembleur. Toutefois, une macro
devrait permettre de passer en param&egrave;tre le nom &eacute;ventuellement n&eacute;cessaire
d'une &eacute;tiquette d&eacute;finie non localement (ou sinon, utilisez des m&eacute;thodes
suppl&eacute;mentaires de m&eacute;ta-programmation).
Notez &eacute;galement que propager du code assembleur en-ligne r&eacute;pandra
les bogues potentiels qu'il contiendrait, aussi,
faites doublement attention &agrave; donner &agrave; GCC des contraintes correctes.</P>
<P>Enfin, le langage C lui-m&ecirc;me peut &ecirc;tre consid&eacute;r&eacute; comme &eacute;tant une bonne
abstraction de la programmation assembleur, qui devrait vous &eacute;viter
la plupart des difficult&eacute;s de la programmation assembleur.</P>
<P>M&eacute;fiez-vous des optimisations consistant &agrave; passer
les arguments en utilisant les registres:
cela interdit aux fonctions concern&eacute;es d'&ecirc;tre
appel&eacute;es par des routines exterieurs (en particulier celles
&eacute;crites &agrave; la main en assembleur) d'une mani&egrave;re standard;
l'attribut asmlinkage devrait emp&ecirc;cher des routines donn&eacute;es
d'&ecirc;tre concern&eacute;es par de telles options d'optimisation.
Voir les sources du noyau Linux pour avoir des exemples.</P>
<P></P>
<P></P>
<P></P>
<H3>GAS</H3>

<P></P>
<P>GAS a quelques menues fonctionnalit&eacute; pour les macro,
d&eacute;taill&eacute;es dans la documentation TeXinfo.
De plus</P>
<P>J'ai entendu dire que les versions r&eacute;centes en  seront
dot&eacute;es... voir les fichiers TeXinfo).
De plus, tandis que GCC reconna&icirc;t les fichiers en .s comme
de l'assembleur &agrave; envoyer dans GAS, il reconna&icirc;t aussi
les fichiers en .S comme devant &ecirc;tre filtrer &agrave; travers CPP
avant d'&ecirc;tre envoyer &agrave; GAS.
Au risque de me r&eacute;p&eacute;ter, je vous convie &agrave; consulter les sources du noyau Linux.</P>
<P></P>
<P></P>
<H3>GASP</H3>

<P></P>
<P>Il ajoute toutes les fonctionnalit&eacute;s habituelles de macro &agrave; GAS.
Voir sa documentation sous forme texinfo.</P>
<P></P>
<P></P>
<H3>NASM</H3>

<P></P>
<P>NASM poss&egrave;de aussi son syst&egrave;me de macros.
Consultez sa documentation.
Si vous avez quelqu'id&eacute;e lumineuse,
contactez les auteurs,
&eacute;tant donn&eacute; qu'ils sont en train de d&eacute;velopper NASM activement.
Pendant ce m&ecirc;me temps, lisez la partie
sur les filtres externes un peu plus loin.</P>
<P></P>
<P></P>
<H3>AS86</H3>

<P></P>
<P>Il poss&egrave;de un syst&egrave;me simple de macros,
mais je n'ai pas pu trouver de documentation.
Cependant, les sources sont d'une approche particuli&egrave;rement ais&eacute;e,
donc si vous &ecirc;tes int&eacute;ress&eacute; pour en savoir plus,
vous devriez pouvoir les comprendre sans probl&egrave;me.
Si vous avez besoin d'un peu plus que des bases,
vous devriez utiliser un filtre externe (voir un peu plus loin).</P>
<P></P>
<P></P>
<H3>Autres assembleurs</H3>

<P>
<UL>
<LI>Win32FORTH: CODE et END-CODE sont des macros qui ne basculent pas
du mode interpr&eacute;tation au mode compilation;
vous aurez donc acc&egrave;s &agrave; toute la puissance du FORTH
lors de l'assemblage.
</LI>
<LI>Tunes: cela ne fonctionne pas encore, mais le langage Scheme
est un langage de tr&egrave;s haut niveau qui permet une
m&eacute;ta-programmation arbitraire.</LI>
</UL>
</P>
<P></P>
<P></P>

<H2>4.2 <A NAME="ss4.2"></A> Filtres externes</H2>

<P>Quelque soit la gestion des macros de votre assembleur, ou quelque
soit le langage que vous utilisez (m&ecirc;me le C), si le langage 
n'est pas assez expressif pour vous, vous pouvez faire passer vos
fichier &agrave; travers un filtre externe gr&acirc;ce &agrave; une r&egrave;gle comme suit
dans votre Makefile:</P>
<P>
<HR>
<PRE>
%.s:    %.S autres_d&amp;eacute;pendances
        $(FILTER) $(FILTER_OPTIONS) &lt; $&lt; &gt; $@
</PRE>
<HR>
</P>
<P></P>
<P></P>
<H3>CPP</H3>

<P>CPP n'est vraiment pas tr&egrave;s expressif, mais il suffit
pour les choses faciles, et il est appel&eacute; d'une mani&egrave;re transparente par GCC.</P>
<P>Comme exemple de limitation, vous ne pouvez pas d&eacute;clarer d'objet
de fa&ccedil;on &agrave; ce qu'un destructeur soit automatiquement appel&eacute; &agrave; la
fin du bloc ayant d&eacute;clar&eacute; l'objet. Vous n'avez pas de diversions
ou de gestion de port&eacute;e des variables, etc.</P>
<P>CPP est livr&eacute; avec tout compilateur C. Si vous pouvez faire sans,
n'allez pas chercher CPP (bien que je me demande comment vous pouvez faire).</P>
<P></P>
<P></P>
<H3>M4</H3>

<P></P>
<P>M4 vous donne la pleine puissance du macro-traitement,
avec un langage Turing-&eacute;quivalent, r&eacute;cursivit&eacute;, expressions r&eacute;guli&egrave;res, etc.
Vous pouvez faire avec tout ce que cpp ne peut faire.</P>
<P>Voir macro4th/This4th que l'on trouve sur
<A HREF="ftp://ftp.forth.org/pub/Forth/">ftp://ftp.forth.org/pub/Forth/</A>
 dans Reviewed/ ANS/ (?),
ou les sources de Tunes 0.0.0.25 comme exemple de programmation
avanc&eacute;e en utilisant m4.</P>
<P>Toutefois, le syst&egrave;me de citation est tr&egrave;s p&eacute;nible &agrave; utiliser et vous
oblige &agrave; utiliser un style de programmation
par fonctions r&eacute;cursives avec passage explicite de continuation (CPS)
pour toute programmation <EM>avanc&eacute;e</EM>
(ce qui n'est pas sans rappeler &agrave; TeX -- au fait
quelqu'un a-t-il d&eacute;j&agrave; essay&eacute; d'utiliser TeX comme
macro-processeur pour autre chose que de la mise-en-page?).
Toutefois, ce n'est pas pire que cpp qui ne permet ni
citation ni r&eacute;cursivit&eacute;.</P>
<P>La bonne version de m4 &agrave; r&eacute;cup&eacute;rer est GNU m4 1.4
(ou ult&eacute;rieure si elle existe).
C'est celle qui contient le plus de fonctionnalit&eacute;
et le moins de bogues ou de limitations.
m4 est con&ccedil;u pour &ecirc;tre intrins&egrave;quement lent pour
toute utilisation sauf la plus simple;
cela suffit sans aucun doute pour la plupart des programmes
en assembleur (vous n'allez quand m&ecirc;me pas &eacute;crire des millions
de lignes en assembleur, si?).</P>
<P></P>
<P></P>
<P></P>
<H3>Macro-traitement avec votre propre filtre</H3>

<P></P>
<P>Vous pouvez &eacute;crire votre propre programme d'expansion de macro
avec les outils courants comme perl, awk, sed, etc.
C'est assez rapide &agrave; faire et vous pouvez tout contr&ocirc;ler.
Mais bien toute puissance dans le macro-traitement doit se gagner &agrave; la dure.</P>
<P></P>
<P></P>
<H3>M&eacute;ta-programmation</H3>

<P></P>
<P>Plut&ocirc;t que d'utiliser un filtre externe qui effectue l'expansion des
macros, une mani&egrave;re de r&eacute;aliser cela est d'&eacute;crire des programmes
qui &eacute;crivent d'autres programmes, en partie ou en totalit&eacute;.</P>
<P>Par exemple, vous pourriez utiliser un programme g&eacute;n&eacute;rant du code source
<UL>
<LI>pour cr&eacute;er des tables de sinus/cosinus (ou autre),</LI>
<LI>pour d&eacute;compiler un fichier binaire en source annot&eacute; annot&eacute;,</LI>
<LI>pour compiler vos bitmaps en des routines d'affichage rapides,</LI>
<LI>pour extraire de la documentation, du code d'initilisation ou finalisation,
des tables de descriptions, aussi bien que du code normal depuis les m&ecirc;mes
fichiers sources;</LI>
<LI>pour utiliser une technique sp&eacute;cifique de production de code,
produite avec un script perl/shell/scheme</LI>
<LI>pour propager des donn&eacute;es d&eacute;finies en une seule fois
dans de nombreux morceaux de code ou tables avec r&eacute;f&eacute;rences crois&eacute;es.</LI>
<LI>etc.</LI>
</UL>
</P>
<P>Pensez-y!</P>
<P></P>
<P></P>
<H3>Backends provenant de compilateur existants</H3>

<P></P>
<P>Des compilateurs comme SML/NJ, Objective CAML, MIT-Scheme, etc, 
ont leur propre g&eacute;n&eacute;rateur de code assembleur,
que vous pouvez ou non utiliser,
si vous souhaitez g&eacute;n&eacute;rer du code semi-automatiquement
depuis les langages correspondants.</P>
<P></P>
<P></P>
<H3>Le New-Jersey Machine-Code Toolkit</H3>

<P></P>
<P>Il s'agit projet utilisant le langage de programmation Icon pour
b&acirc;tir une base de code de manipulation d'assembleur.
Voir    
<A HREF="http://www.cs.virginia.edu/~nr/toolkit/">http://www.cs.virginia.edu/~nr/toolkit/</A>
</P>
<P></P>
<P></P>
<H3>Tunes</H3>

<P>Le projet de syst&egrave;me d'exploitation OS d&eacute;veloppe son propre
assembleur comme &eacute;tant une extension du langage Scheme. Il ne fonctionne
pas encore totalement, de l'aide est bienvenue.</P>
<P>L'assembleur manipule des arbres de syntaxes symboliques, de telle 
mani&egrave;re qu'il puisse servir comme base d'un traducteur de syntaxe
assembleur, un d&eacute;sassembleur, l'assembleur d'un compilateur, etc.
Le fait qu'il utile un vrai langage de programmation puissant comme Scheme
le rend imbatable pour le macro-traitement et pour la m&eacute;ta-programmation.</P>
<P>
<A HREF="http://www.eleves.ens.fr:8080/home/rideau/Tunes/">http://www.eleves.ens.fr:8080/home/rideau/Tunes/</A>
</P>
<P></P>
<P></P>
<P></P>

<HR>
<P>
Chapitre <A HREF="Assembly-HOWTO-5.html">suivant</A>,
Chapitre <A HREF="Assembly-HOWTO-3.html">Pr&eacute;c&eacute;dent</A>
<P>
Table des mati&egrave;res de <A HREF="Assembly-HOWTO.html#toc4">ce chapitre</A>,
 <A HREF="Assembly-HOWTO.html#toc">Table des mati&egrave;res</A> g&eacute;n&eacute;rale</P>
<P>
<A HREF="Assembly-HOWTO.html">D&eacute;but</A> du document,
 <A HREF="#0"> D&eacute;but de ce chapitre</A></P>
</BODY>
</HTML>