|
|
Une taxonomie des principaux paradigmes de programmation
Imprimez cette figure et affichez-là!
|
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").