Métaprogrammation statique

Métaprogrammation statique

Librairies actives et programmation générative

Avec la programmation générative et les librairies actives une nouvelle étape est franchie au-delà du modèle objet et de la programmation générique. Il s’agit de repenser le rˆole que tient le compilateur dans le processus de développement allant de la conception de l’architecture logicielle à la création du programme exécutable par la machine [76]. La programmation générative remet en cause les interactions classiques entre librairie, compilateur et application. La compilation de ce genre de code génère des types et des algorithmes qui ne sont pas  définitivement précablés dans le code source, c’est l’utilisation qui induit les structures de données et les calculs nécessaires.

Une librairie active n’est pas une simple collection passive d’objets et d’algorithmes, elle contient du code sous forme de métaprogrammes et participe à la construction des composants logiciels par assemblage de sous-composants à partir des exigences de l’utilisateur. Pour mettre en œuvre ce type de librairie de manière rigoureuse et solide, il est nécessaire de se plier à une certaine discipline concernant quelques aspects de la programmation et de la conception qui sont décrits dans la section suivante.

Paradigmes de programmation émergeants

Même s’ils sont loin d’être tous nouveaux, ces paradigmes de programmation, principes ou méthodes commencent à être mieux connus et mieux implémentés. La programmation générative unifie tous ces domaines : – Domaine spécialisé. Une librairie active est un module dédié à un domaine spécifique dont l’écriture est préférablement laissée à des spécialistes connaissant le domaine, les techniques de programmation et d’optimisation. Ces domaines sont généralement étroits et ont été étudiés exhaustivement : il ne s’agit pas de s’attaquer à des notions d’un genre nouveau ou expérimentales mais d’implémenter, une fois pour toutes, toutes les opérations concernant un domaine bien connu et maitrisé la plupart du temps depuis des années comme par exemple les algorithmes d’ordonnancement.

– Séparation de l’espace des problèmes et des solutions. L’interface abstraite de la librairie n’emprunte que très peu à l’informatique. Les concepts que manipule l’utilisateur se limitent presque uniquement à ceux du domaine considéré. Le lien entre les deux espaces est le Configuration Knowledge qui projette les spécifications vers des spécifications logicielles internes de manière automatique. Exemple : l’adaptation au processeur dans un système. – Programmation générique. Le but est de construire des familles de composants logiciels orthogonales les unes aux autres donc développables séparément et qu’on assemble arbitrairement.

De plus, l’efficacité étant un critère important, ces composants doivent comporter des optimisations spécifiques au domaine et à la situation (machine cible, système d’exploitation, types des données, algorithme). Ils sont généralement au cœur des librairies actives et ne sont manipulés que par la librairie elle-même ce qui pallie la principale faiblesse de la programmation générique qui ne possède pas de mécanisme de configuration et d’assemblage de composants automatiques. Cela épargne à l’utilisateur le travail d’assimilation de la documentation et des informations propres à la mise en œuvre de la librairie (structures de données, techniques d’optimisations) et lui permet de se concentrer sur son domaine.

Principes généraux DEMRAL

(Domain Engineering Method for Reusable Algorithmic Libraries [11] pp. 273- 291) définit une méthodologie complète et détaillée sur le processus de conception et d’écriture d’une librairie active. En voici une synthèse résumant ses objectifs, sa méthode et son architecture. 

Objectifs

– Fournir à l’utilisateur une interface « intentionnelle » abstraite de très haut niveau. Son code spécifie les problèmes en termes de concepts propres au domaine et à un niveau de détail approprié.

Les problèmes liés à l’implémentation des composants ne doivent pas interférer avec le code utilisateur. Il s’agit toujours de décomposer les problèmes en abstractions pertinentes ; – Générer du code efficace en terme de vitesse et de consommation d’espace mémoire. La généricité ne doit pas s’accompagner d’une dégradation des performances, toutes les optimisations possibles doivent être envisagées et mises en œuvre et toute fonctionnalité inutile doit être écartée de l’exécutable résultant ; – Permettre une adaptabilité et une extensibilité maximale. Eviter la duplication de code ´ et l’enchevêtrement des aspects.

Formation et coursTélécharger le document complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *