Une taxonomie des principaux paradigmes de programmation

Imprimez cette figure et affichez-là!

Peter Van Roy
Département d'Ingénierie Informatique
Université catholique de Louvain (UCL) à Louvain-la-Neuve

Paradigms poster in English

Transparents de l'exposé Les principaux paradigmes de programmation

La richesse des paradigmes de programmation

La programmation est une discipline riche. Il y a beaucoup de différentes manières de programmer un ordinateur, appellées des paradigmes de programmation. Il y a plus de 20 paradigmes importants, qui sont illustrés dans la figure que vous pouvez télécharger sur cette page. Il est important de réaliser que tous ces paradigmes sont importants: il faudrait utiliser celui qui est approprié et il y aura souvent plusieurs paradigmes dans un même programme. Un langage qui ne soutient qu'un paradigme est un langage défectueux dans lequel il n'est pas possible de donner une bonne solution à tous les problèmes. Cette page donne une explication brève de quatre paradigmes: la programmation déclarative, la programmation orientée objet, la programmation multi-agent et la programmation dataflow multi-agent.

Un bon système de programmation devrait soutenir plusieurs paradigmes. Par exemple, il y a plusieurs systèmes qui soutiennent avec succès deux paradigmes de programmation: Prolog (relationnelle et impérative), SQL (relationnelle et transactionnelle) et des langages de modélisation comme Numerica et OPL (contraintes et orientée objet). Dans ces couples de deux paradigmes, le premier paradigme est déclaratif et le deuxième utilise l'état. Le premier est utilisé pour définir les calculs faits par le programme. Le deuxième est utilisé pour la structuration du programme.

Depuis de longues années, nous avons construit un système, le Mozart Programming System, qui soutient la plupart des paradigmes et pour lequel il existe une bonne implémentation en logiciel libre. Nous recommandons aussi le livre Concepts, Techniques, and Models of Computer Programming, qui présente la plupart des paradigmes dans un cadre uniforme qui montre leurs relations. Une traduction en français d'une partie de ce livre a été publiée en 2007 par Dunod. Cette traduction est ciblée pour mon cours universitaire de deuxième année.

La programmation déclarative

Le premier paradigme exemplaire est la programmation déclarative, qui peut être faite avec des fonctions (qui sont directionnelles) ou des relations (qui sont non-directionnelles). La programmation par contraintes est une forme de programmation relationnelle basée sur des algorithmes sophistiqués de résolution de certaines formes de relations. Dans la programmation fonctionnelle, un programme est défini avec des fonctions pures. Une fonction est "pure" quand elle donne toujours le même résultat avec les mêmes arguments: elle est déterministe, indépendante du reste du système et n'a pas de mémoire. La pureté est une propriété importante parce qu'un programme qui est correct à un moment donné restera correct pour toujours. Les fonctions sont des entités de première classe: elles peuvent êtres des arguments et des résultats d'autres fonctions. La programmation déclarative contient en forme embryonique beaucoup des idées des autres paradigmes.

La programmation orientée objet

Le deuxième paradigme exemplaire est la programmation orientée objet. Elle étend la programmation déclarative avec l'abstraction de données, l'état explicite, le polymorphisme et l'héritage. L'abstraction de données permet le partitionnement des programmes en parties appellées abstractions qui peuvent être développées indépendamment. L'état explicite ajoute de la mémoire aux programmes, ce qui introduit une dimension temporelle. Son utilisation la plus importante est pour la modularité: une abstraction peut être changée sans changer le reste du programme. Le polymorphisme permet de structurer les programmes selon les responsabilités: une tâche particulière peut être traitée complètement par une seule abstraction, qui en est responsable. L'héritage permet d'isoler les parties communes des abstractions en un seul endroit du programme.

La programmation multi-agent

Le troisième paradigme exemplaire est la programmation multi-agent, qui est moins bien compris que les autres mais pas moins important. Il est basé sur la réalisation que le monde est plein d'activités indépendantes et d'événements inattendus. Les activités indépendantes sont appellées concurrentes. Si en plus elles s'exécutent sur des ordinateurs différents, elles s'appellent réparties. Des événements inattendus, bénins ou malicieux, peuvent arriver à tout moment. La programmation multi-agent comporte des "agents" indépendants qui interagissent pour réaliser le but global du programme. Il faut maîtriser le comportement des agents pour qu'ils collaborent, avec des opérations de base comme l'exclusion mutuelle, les barrières, les instantanés, les mises à jour cohérentes et différentes formes de protocoles de négociation. La concurrence peut être réalisée en trois manières principales: la première est la concurrence déclarative (qui est aussi pure que la programmation déclarative mais pas toujours assez expressif), ensuite vient la concurrence par envoi de messages (agents indépendants qui s'envoient des messages) et finalement la façon la plus difficile qui est la concurrence par état partagé (des agents qui partagent des données communes). Les contingences sont gérées avec des transactions et des décisions temporisées prises au bon niveau d'abstraction, pas avec des exceptions et des time-outs. Nous expliquons pourquoi ces derniers sont de mauvaises idées.

La programmation dataflow multi-agent

Le quatrième paradigme exemplaire est particulièrement intéressant. Ce paradigme est une synthèse de la programmation multi-agent (envoi asynchrone de messages), la programmation dataflow et la programmation fonctionnelle. Ce paradigme est particulièrement expressif pour faire des programmes concurrents. Un exemple de l'utilité de ce paradigme est le protocole du réseau de contrat ("contract net").