La macro-génération est une technique « vieille comme le monde », à la fois largement utilisée et largement critiquée. On l'utilise dans deux optiques :
- Dans un souci d'efficacité : la génération de "code en ligne" est la plus simple des techniques d'optimisation. A l'interprétation d'un programme Lisp, on aimera bien ne pas trop attendre ; pour la compilation, on aimera éviter les appels incompilables à la fonction
eval.
- Dans un souci d'abstraction : on exprime le problème dans ses termes, et on génère du code dans les termes du langage. Dans un langage comme COBOL, où l'on cherche à écrire un programme comme on écrirait un texte en anglais, la technique est presque un concept primitif du langage.
Le gros avantage de la macro-génération en est sa simplicité. Mais cette simplicité ne doit pas masquer certains dangers qui lui sont liés :
- On ne contrôle plus la taille du code généré : même si l'on tient compte de l'augmentation régulière de la puissance des ordinateurs, il faut malgré tout rester dans des limites raisonnables.
- On ne connaît pas a priori l'allure du code généré : la macro-génération peut construire un code totalement aberrant, ou subtilement aberrant ; par exemple en C, la macro-définition :
#define max1(a,b) ((a<b)? (b):(a))
offre toutes les garanties qu'on ne retrouverait pas dans la suivante :
#define max1(a,b) ((a<b)? b:a)
les deux définitions sont pourtant syntaxiquement très voisines.
On trouve dans [KoW 87] une syntaxe pour les macro-définitions en Lisp qui cherche à en faciliter la compréhension : au lieu de proposer classiquement une fonction qui permette de tester sur quelques exemples la macro-génération, on propose un moyen d'expression qui fait ressembler la macro-définition à sa forme macro-générée. Dans [TrY 80] on cherche à réduire l'initiative laissée au programmeur à l'utilisation d'une macro-définition (COBOL) : c'est la macro-définition syntaxique, où les paramètres effectifs doivent répondre à certaines contraintes d'ordre syntaxique qu'on impose à la définition.
1. Les données
2. Les traitements