Logique des types et programmation fonctionnelle

Nous sommes tous las de traquer les bugs dans nos lignes de code en programmation objet : PHP, Actionscript, Javascript, Java, etc ... Mais tel est le dur lot de la programmation par Objets. Pourtant, des méthodes alternatives de codage existent, à portée de main, plus efficaces et moins sensibles aux erreurs syntaxiques. Mais elles ne sont pas mises en oeuvre encore en 2006 : Pourquoi ? Vraisemblablement parce que la grande majorité des développeurs est aujourd'hui piégée dans l'univers impitoyable des machines de Turing :)

Pourtant il existe de nombreuses autres formes de logiques qui peuvent présider au fonctionnement d'automates électroniques et à la syntaxe de langages de programmation, et je vousdrait introduire ici la logique des types qui est à la base d'une forme de programmation extrêmement efficace mais assez délaissée : La programmation fonctionnelle.

La Logique mathématique était jusqu'à une période récente constituée de 4 piliers :=> la théorie des Ensembles, collections d'objets appelés Eléments, formalisée par Georg Cantor au XIX° siècle.=> la théorie des Modèles, qui formalise la notion de Vérité en mathématiques, en posant notamment qu'une Théorie est vraie si on peut définir un Univers dans lequel elle est vraie. Elle a été formalisée par Alfred Tarski au début du XX° siècle.=> La théorie de la Démonstration ou de la Preuve, fondée par David Hilbert au début du XX° siècle et finalement invalidée par Kurt Gödel en 1931 (Théorème d'incomplétude).=> la théorie de la Calculabilité ou théorie de la Récursion, initiée par Alan Turing au milieu du XX° siècle (2nde Guerre Mondiale), qui se consacre à la délimitation des catégories de fonctions calculables et non calculables. Cette branche de la logique mathématique connait des développements considérables avec le développement de l'informatique, et recourt au formalisme du lambda calcul. C'est elle qui a permis la création de la plupart des langages de programmation actuels, dits langages impératifs.

Mais depuis quelques années, avec le bond fulgurant de l'informatique, un cinquième grand axe semble se dessiner avec les travaux sur la théorie des Types. Dans cette théorie, les expressions mathématiques sont construites à l'aide de fonctions, où chaque fonction a un type qui décrit le type de ses arguments et le type de la valeur retournée. Les expressions sont bien formées lorsque les fonctions sont bien appliquées à des fonctions ayant le bon type. Ce concept est à la base de nombreux langages de programmation, et surtout les langages fonctionnels typés.

La programmation fonctionnelle est à opposer à la programmation impérative :=> En programmation impérative, on travaille avec une mémoire centrale et des instructions qui modifient son état grâce à des assignations successives. On peut représenter un programme par une machine d'états qui représente les états successifs de la mémoire. Les assignations arbitraires de variables, qui sont plus la règle que l'exception, compliquent grandement la compréhension des programmes et sont la source de nombreuses difficultés et de bogues : en effet, si on oublie de mettre à jour certaines données partagées, si l'ordre chronologique des assignations par les différentes parties du logiciel est incorrect, ou si une zone de mémoire a été désallouée au mauvais moment, le programme se retrouve dans un état imprévu.=> La programmation fonctionnelle s'affranchit de façon radicale de toute opération d'assignation de variables, et de ce fait conduit à des programmes plus robustes et fiables.On n'y utilise pas de machine d'états pour décrire un programme, mais un emboîtement de fonctions que l'on peut voir comme des « boîtes noires » que l'on peut imbriquer les unes dans les autres. Un avantage important des fonctions sans effet de bord est la facilité que l'on a à les tester unitairement. Par ailleurs, l'usage généralisé d'une gestion de mémoire automatique par l'intermédiaire d'un "garbage collector" simplifie la tâche du programmeur. Les langages fonctionnels, afin de s'affranchir de la nécessité de stocker des données temporaires dans des tableaux, font largement appel à la récursivité, ce qui fait qu'il est ainsi généralement possible de réaliser facilement des opérations comme la concaténation de liste, ou l'application d'une fonction à une liste, en une seule ligne de code !

Voilà un exemple flagrant de sous-développement de l'informatique actuelle, et de sous-utilisation des logiques alternatives : Il existe aujourd'hui très peu de langages véritablement fonctionnels (par comparaison avec les langages dits Objets), et les LISP, SCHEME, HASKELL et autres CAML ne passionnent qu'une poignée de théoriciens. A noter toutefois que dans le domaine du développement web, le langage balisé XSLT est de type majoritairement fonctionnel.

Aujourd'hui, le développement des langages fonctionnels est limité par le déficit en outils et en bibliothèques de qualité commerciale et surtout par le manque de programmeurs formés. En outre, les langages fonctionnels souffrent encore d'une réputation de lenteur complètement injustifiée.

Pour aller plus loin :

  • http://www.haskell.org
  • http://www.erlang.org
Bookmark and Share

Commentaires

Authentifiez vous pour commenter.