1.2 La programmation g´
en´
erique par les types
L’id´
ee derri`
ere la programmation g´
en´
erique ou g´
en´
ericit´
eest de ne pas restreindre inutilement le type
des donn´
ees et des fonction, mais au contraire, de le rendre g´
en´
eriques `
a toute valeur compatible avec leur
d´
efinition. En pratique, ceci est fait par le biais de param`
etres de types qui jouent le rˆ
ole de type g´
en´
erique,
pouvant ˆ
etre remplac´
e plus tard par un type sp´
ecifique. Par exemple, en Java 1.5 on peut d´
efinir le type d’une
cellule (dans une liste chaˆ
ın´
ee) dont la nature du contenu d´
epend du param`
etre de type A :
class Cellule<A>{A c o n te n u ; C e l l u l e s u i v a n t };
En C++, on utilisera les partons (templates) pour g´
en´
eraliser le type d’une fonction. Par exemple, voici la
fonction identit´
equi renvoie son arugment sans lui appliquer aucune op´
eration :
template <typename A>
A i d e n t i t y (A x ) {
r e t u r n x ;
}
Ce m´
ecanisme de g´
en´
eralisation est pr´
esent dans beaucoup de langages : C++, Java, Ada, Haskell, Eiffel,
SML, Ocaml. Il permet de concilier flexibilit´
e du typage avec la rigueur du typage statique ; il favorise
fortement la r´
eutilisation du code, et permet ´
egalement le typage plus pr´
ecis (avec moins d’erreurs) du code
g´
en´
erique. Il s’agit d’un exemple r´
eussi de m´
elange de styles de programmation dans la mesure o`
u il a ´
et´
e
adopt´
e par diff´
erents langages de styles tr`
es divers.
1.3 Avantages et contraintes de la programmation fonctionnelle
La programmation fonctionnelle pure (sans effets de bord) pr´
esente beaucoup d’avantages :
1. “Modularit´
e” de la programmation, simplification du d´
ebogagge : les fonctions au sens math´
ematique
peuvent ˆ
etre consid´
er´
ees comme des boˆ
ıtes noires au sein des programmes. Il devient plus facile de les
concevoir s´
epar´
ement, de circonscrire leurs effets, et d’isoler les erreurs. Par ailleurs, la g´
en´
eralisation
des fonctions par le biais de param`
etres fonctionnels favorise la structuration des programmes et la
r´
eutilisation d’algorithmes.
2. Formalisme math´
ematique sous-jacent : cela permet la v´
erification du langage (compilateur, typage,
s´
emantique formelle) mais aussi des programmes via diverses analyses, tests ou `
a l’aide de prouveurs
automatiques.
3. G´
en´
ericit´
e, flexibilit´
e, r´
eutilisation : la programmation g´
en´
erique par les types favorise la r´
eutilisation
du code tout en assurant un typage pr´
ecis. Les fonctions et les donn´
ees deviennent plus g´
en´
eriques et
donc potentiellement r´
eutilisables.
Ces avantages ont un prix : les contraintes impos´
ees par l’usage de la programmation fonctionnelle pure,
parmi lesquelles on peut mentionner :
– Pas d’effets de bords : pas d’affectation, pas de variables modifiables. Seules les constantes sont
admises ;
– Une fonction ne peut pas changer ce qui lui est ext´
erieur ;
– Le comportement d’une fonction ne peut pas ˆ
etre modifi´
e de l’ext´
erieur ;
– Certaines constructions sont proscrites : boucles it´
eratives, goto.
– La r´
ecursivit´
e est `
a utiliser afin de coder les boucles.
– La gestion implicite de la m´
emoire devient indispensable.
4