Paradigmes de programmation, généralités et exemple

Tour d'horizon des paradigmes de programmation


Il existe un grand nombre de paradigmes de programmation (plusieurs dizaines). Certains sont d'ailleurs surement restés inconnus. Le premier d'entre eux et le plus courant, celui dont les premiers langages de programmation se sont inspirés, est la programmation impérative. Ce paradigme décrit les opérations en termes de séquences d'instructions exécutées par l'ordinateur pour modifier l'état d'un programme. La plupart des processeurs fabriqués aujourd'hui fonctionnent sur ce principe. Par la suite, de nombreux langages de programmation se sont développés et ont implémentés de plus en plus de paradigmes différents [1], [2]. Il existe des tentatives de classification des différents paradigmes, mais ils sont tellement différents que cela devient vite compliqué [3].

Certains paradigmes sont comparables à d'autres, tandis que la plupart ne peuvent pas être classés en catégories. Par exemple, on peut dire que la programmation procédurale est comparable à la programmation fonctionnelle. En effet, la première est basée sur l'appel de procédures (c'est-à-dire des fonctions qui ne renvoient rien), alors que la seconde fait appel à des fonctions mathématiques qui s'envoient des résultats les unes aux autres. De la même manière, la programmation par contrainte est comparable à la programmation logique : elles s'appuient toutes les deux sur des relations que vont avoir les entités entre elles (relation contrainte : une variable va évoluer en fonction d'une autre variable, relation factuelle : un fait va avoir des conséquences).

La programmation évènementielle est différente de la programmation séquentielle. L'une est constituée de deux boucles qui récupèrent et qui gèrent les évènements tandis que l'autre exécute toujours les mêmes instructions. Deux différents paradigmes pourraient également être la programmation itérative et la programmation récursive.

[1] Historique complet des langages de programmation : http://www.levenez.com/lang/lang.pdf
[2] Historique plus concis des langages de programmation : http://people.mandriva.com/~prigaux/language-study/diagram-light.png
[3] Taxonomie des principaux paradigmes de programmation : http://www.info.ucl.ac.be/~pvr/paradigmes.html

Pour plus d'informations sur les paradigmes de programmation en général :
http://en.wikipedia.org/wiki/Programming_paradigm

Un paradigme très courant : la programmation par abstraction de données


La programmation par abstraction de données repose sur une notion principale : les types abstraits de données ou TAD. Il s'agit de regrouper et manipuler les données d'un programme comme des boites noires [A], [B], [E].
Du point de vue de l'utilisation, les TAD reposent sur deux règles [C] :
- Déclarer un type de données représentant un concept
- Définir le comportement de ce type de données et les manipulations possibles sur celui-ci.
En revanche, la définition d'un TAD n'est jamais connue d'un utilisateur (ou du moins n'a pas besoin d'être connue).

Prenons par exemple un TAD présent dans la bibliothèque standard du langage C : FILE
Tout programmeur C a déjà vu et utilisé ce type. Il s'agit en effet d'un TAD :
- On sait qu'il existe un type FILE représentant un fichier mémoire
- On connait son comportement : il se comporte de manière à permettre un accès aux données d'un fichier et surtout on sait manipuler ce type (via des fonctions en C comme fopen, fclose, fprintf, …)
En revanche, personne n'a à savoir comment est défini FILE pour pouvoir l'utiliser. Et d'ailleurs, la définition est quasiment impossible à trouver. Sur ma machine, je n'ai réussi qu'à trouver la déclaration dans stdio.h :
struct _IO_FILE;
typedef struct _IO_FILE FILE;

Comme quoi on n'est pas plus avancé après.

Un TAD n'est pas caractérisé par sa structure mais par son comportement et ses possibilités de manipulation. Dans ce sens, on peut dire que la programmation par abstraction de données est un paradigme parent de la programmation orientée objet. Celle-ci étend encore plus ce concept (via le principe d'encapsulation) et met l'accent sur les liens de communication entre les objets (méthodes) alors que les TAD sont beaucoup plus orientés manipulation. Il existe de nombreuses structures de données utilisées la plupart du temps comme un TAD. Les plus classiques sont les types "fichier" (comme FILE), les piles, les files ou les arbres.

Si ce concept de programmation est très largement utilisé, c'est aussi parce de nombreux langages le supportent (ou alors ces langages supportent-ils ce paradigme parce qu'il est très utilisé ?). On a déjà cité le C, il faut ajouter à cela les langages objets (C++, Java, …) et plus généralement l'ensemble des langages permettant au programmeur de définir ses propres types de données (soit une bonne partie des langages existants) [D].

[A] http://dchaffiol.free.fr/info/langages/prg/art_prg_Type_r.htm#AbstractType
[B] http://dchaffiol.free.fr/info/langages/prg/art_prg_Paradigmes_r.htm
[C] http://personnel.univ-reunion.fr/fred/Enseignement/Scheme/SchemeCours/node7.html
[D] http://pages.univ-nc.nc/~touraivane/Java/node3.html#SECTION02140000000000000000
[E] http://en.wikipedia.org/wiki/Abstract_data_type

Comments