Il y a deux façons de développer un programme de taille importante : la manière descendante (en Anglais : top-down) et la manière ascendante (en Anglais : bottom-up).
La programmation descendante était très en vogue dans les années 1970. L'idée de base est de commencer par une spécification d'assez haut niveau du problème, puis de raffiner celle-ci. On effectue ainsi des raffinages successifs et le processus se termine quand le niveau d'abstraction coïncide avec celui du langage de programmation. Depuis, on s'est aperçu que ce type de programmation générait des programmes peu modulaires et peu réutilisables.
La programmation ascendante est exactement le contraire de la programmation descendante. Le programmeur commence par le langage de programmation, puis augmente son niveau d'abstraction en construisant de nouveaux types et de nouvelles fonctions. Ces nouvelles constructions sont souvent spécifiques à une famille d'applications dont fait partie celle que le programmeur est en train d'écrire. Avec ces nouvelles abstractions, il est non seulement plus facile d'écrire l'application finale, mais aussi de la faire évoluer au fur et à mesure que les besoins du client évoluent.
On peut voir la programmation ascendante comme la création d'un langage dédié pour un domaine d'application. Par exemple, le processus de création d'une application de comptabilité génère un langage dédié à la comptabilité ; la création d'une application de gestion de salles génère un langage dédié à la gestion de ressources, etc. Ces langages ne sont bien sûr pas complets, mais le plus souvent seules quelques constructions supplémentaires sont nécessaires pour faire évoluer l'application.
Le degré de spécificité du langage pour l'application dépend du langage initial, puis en particulier de sa capacité à permettre la construction d'abstractions. La plupart des langages modernes permettent l'abstraction de données ainsi que l'abstraction de contrôle. Ces deux capacités sont importantes, mais un langage dédié construit uniquement avec ces deux capacités sera relativement pauvre en expressivité. Il manque l'abstraction syntaxique !
L'abstraction syntaxique consiste à créer de nouvelles constructions syntaxiques pour capturer des idiomes du domaine de l'application. Certains de ces idiomes peuvent être capturés avec l'abstraction de données ou l'abstraction de contrôle. Pour le reste, il faut la possibilité de créer des abstractions syntaxiques.
Les macros présentées dans ce livre sont assez atypiques, car elles sont générales et non dédiées à un domaine d'applications particulier.
Irene DURAND