Résumé

Ce cours a pour objectif de présenter les concepts fondamentaux de la programmation fonctionnelle à travers le langage Objective Caml. Il est en effet important pour un élève ingénieur d'être familier avec les différents paradigmes qui fondent les nombreux langages de programmation qu'ils seront amenés à utiliser ou à comprendre. D'autant plus que ces paradigmes ne sont pas si nombreux: le cursus prévoit d'abord la présentation de langages impératifs et ensuite aborde les langages à objets (ce sont parfois les mêmes langages qui sont à la fois impératifs et à objets, tel Java). Il est donc utile de découvrir un autre mode de conception et de programmation via les langages fonctionnels.

Dans un langage fonctionnel, par exemple Lisp, Haskell ou Objective Caml, il n'y a plus de notion d'état, comme dans les langages impératifs où l'état est la représentation en mémoire des données manipulées par le programme. En particulier, le programmeur ne peut modifier directement l'état, comme par exemple modifier la valeur d'une variable, puisqu'il n'a pas accès à l'état courant. D'une certaine façon, l'idée est que le programmeur doit, comme le mathématicien et le logicien, s'abstraire de cette notion de mémoire mutable, considérée comme de bas niveau, et se concentrer sur la déclaration de propriétés et d'équations.

Les variables sont donc en réalité des constantes, comme en mathématique, et les boucles (for, while, repeat etc.) deviennent alors sans objet. Pour réaliser l'équivalent des itérations impératives, il faut définir des fonctions récursives, les paramètres liés aux arguments lors de l'appel jouant le rôle de la modification de variables (locales) dans les langages impératifs.

Ce qui vient d'être dit s'applique en réalité au sous-ensemble purement fonctionnel des langages fonctionnels. En effet, il est nécessaire qu'un programme produise un effet qui ne soit pas lié directement à la logique du calcul (ce qu'on appelle indument un effet de bord dans les langages impératifs (effet secondaire conviendrait mieux que ce barbarisme)) ne serait-ce que pour afficher son résultat (le médium sur lequel se fait cet affichage relevant de l'état).

L'environnement d'exécution des langages fonctionnels, déchargeant le programmeur de la gestion explicite de la mémoire, doit nécessairement inclure un glâneur de cellules (garbage collector), mais ce n'est pas une caractéristique car nombre de langages impératifs en supposent l'usage (Ada, Java, Perl etc.).

Le choix du langage Objective Caml pour illustrer un noyau purement fonctionnel est justifié par le fait que le langage Caml Light, qui est une version simplifiée du premier, est déjà enseigné comme premier langage de programmation dans les universités et classes préparatoires en France. Il possède en outre un système d'inférence de type qui décharge complètement le programmeur de l'obligation d'annoter, même partiellement, son programme avec des types, et permet donc un prototypage rapide. Cette caractéristique est très pratique pour l'enseignement, car le débutant peut se concentrer sur son algorithme, comme en shell Unix, tout en bénéficiant du typage statique fort, qui le protège des erreurs à l'exécution dues à d'éventuelles hypothèses sur les données qui seraient incohérentes par rapport à leur usage.

Les points que nous abordons sont les suivants:

Bibliographie

Emmanuel Chailloux, Pascal Manoury, and Bruno Pagano, Développement d'applications avec Objective Caml, O'Reilly & Associates Inc., Avril 2000.

Évaluation

Examen partiel écrit (1/3) ou deux quizz, examen final écrit (2/3).

Ressources en ligne


Valid HTML 4.01 Transitional