Programmation Fonctionnelle et Symbolique - Introduction
- 1.a Un peu d'histoire
- 1.b Programmation Impérative / Déclarative
- 1.c Intelligence Artificielle et Programmation Symbolique
- 1.d La famille Lisp
1.a Un peu d'histoire
Souvent présentés comme le summum de la technologie, les ordinateurs sont en
fait des machines assez simples (dans leur principe), fabriquées à partir de
quelques types de circuits élémentaires : registres, mémoires, additionneurs,
décodeurs etc...
Ces machines fonctionnent de la manière suivante : elles exécutent
séquentiellement des programmes (enregistrés dans une mémoire) qui sont des
suites d'instructions élémentaires. Les données (également en mémoire) que
peuvent manipuler ces instructions appartiennent à quelques types bien
connus: nombres entiers ou réels, caractères, adresses, et c'est à peu près
tout...
Ceci convenait toutefois très bien aux premières applications des
calculateurs : il s'agissait en effet d'effectuer des suites de calculs
longues et répétitives, pour établir des tables numériques (par exemples
calculs balistiques sur le «directeur de tir antiaérien M9» fabriqué par Bell
vers 1942), décrypter des messages secrets (machines britanniques Robinson et
Colossus, même époque), calculs numériques (ENIAC) etc..
Les programmes de l'époque ne pouvaient guère être compliqués, en raison de
la très faible capacité des mémoires disponibles. Cette capacité augmentant
naturellement au fil des années, on s'est avisé qu'il pouvait être
intéressant :
- d'écrire des programmes en utilisant des noms mnémotechniques pour chacune
des instructions de la machine (naissance du langage d'assemblage). Ainsi les
programmes sont plus facile à écrire, et surtout à relire;
-
d'utiliser des langages de programmation indépendants de la machine
utilisée (langages évolués) chaque instruction en langage évolué se
traduisant en une petite séquence d'instructions dans le langage de la
machine.
On remarque que cette évolution préserve deux traits fondamentaux de
l'informatique des origines :
- l'aspect séquentiel des programmes
- la notion d'affectation;
ce qu'on appelle «programmation impérative» puisqu'il s'agit de faire
exécuter une suite d'ordres par une machine bête mais disciplinée.
Ne pouvant dire à la machine «c'est votre problème débrouillez-vous», le
programmeur doit décrire la suite exhaustive des actions à exécuter, en
envisageant les nombreux cas particuliers qui ne manquent jamais de se poser.
Vous connaissez tous l'aspect fastidieux de ce genre d'activité; qui demande
par ailleurs une formation particulière (songez à vos premiers démêlés avec
l'algorithmique).
1.b Programmation Impérative / Déclarative
La plupart des langages de programmation (il en existe plusieurs milliers)
relèvent de la susdite Programmation Impérative; il existe cependant une
autre catégorie : les langages déclaratifs.
Dans un langage déclaratif, l'activité de programmation consiste
essentiellement à décrire le rapport qui existe entre les données et les résultats que l'on veut obtenir,
plutôt que la séquence de traitements qui mène des unes aux autres
(évidemment ceci représente un idéal...)
Deux approches sont fréquemment utilisées :
-
Programmation Fonctionnelle : Puisque le but d'un traitement informatique
est de calculer des résultats à partir de données; pourquoi ne pas assimiler
un programme à une fonction qui, à des données, associe un résultat ?
Un traitement complexe
s'obtiendra en combinant (composant) plusieurs fonctions intermédiaires
(correspondant à des sous-traitements).
exemples : Ml, Hope, Lisp...
- Programmation Logique : On décrit, par une formule logique,
la relation qui
existe entre les données et les résultats.
exemples : Prolog, Qlog ..
1.c Intelligence Artificielle et Programmation Symbolique
Dès la fin des années 50, un certain nombre d'équipes ont mené des recherches
importantes dans le domaine baptisé communément Intelligence Artificielle :
en particulier des programmes de démonstration automatique (Logic Theorist
écrit en IPL par Newell, Shaw et Simon); des programmes de jeu (Echecs,
Dames), etc...
Qu'est-ce que l'IA ? C'est de faire faire par une machine des choses qui nous
paraissent relever de l'Intelligence humaine (ou au moins animale).
Une des particularités de la programmation en Intelligence Artificielle est
la nécessité de manipuler facilement des symboles et des listes de symboles
plutôt que des nombres ou des chaînes de caractères : ce qu'on appelle la
Programmation Symbolique.
Les langages de l'époque n'offrant pas ce genre de facilités, un chercheur du
MIT, John MacCarthy s'est lancé vers 56-58 dans la définition d'un langage ad
hoc baptisé LISP (LISt Processing language).
Depuis LISP 1.5 (la première version largement diffusée), plusieurs centaines
d'implémentations de «dialectes Lisp» ont été développées; en effet
l'écriture d'un interprèteur LISP n'est pas un travail énorme (quelques
milliers d'instructions) comparativement au développement d'un compilateur
pour un langage classique (plusieurs dizaines de milliers d'instructions);
d'où l'éclosion (années 60-70) de centaines de versions différentes (presque
autant que d'utilisateurs, disent les mauvaises langues !).
Ce phénomène est également dù au milieu Lispien: les chercheurs en IA
étaient de fait d'excellents programmeurs peu liés par des contraintes
extérieures de délais; dont le travail consistait d'une part à trouver des
idées; d'autre part à les tester en écrivant des programmes prototypes qui
seront entièrement réécrits si l'idée s'avère fructueuse, et finiront au
panier dans le cas contraire (le plus fréquent).
1.d La famille Lisp
L'engouement récent pour l'IA aidant, la tendance est à la standardisation du
langage LISP : il est évidemment plus économique de disposer du même langage
sur toutes les machines sur lesquelles on désire porter un logiciel
commercial. Parmi les LISP récents citons :
- MACLISP développé au MIT pour la réalisation du systême MACSYMA (calcul
formel);
- FRANZ LISP qui, bien qu'écrit en C par des étudiants (Berkeley), fonctionne
malgré tout sur la plupart des systèmes UNIX;
- LE_LISP développé à l'INRIA par Jérôme CHAILLOUX;
- COMMON LISP, qui est (comme son nom l'indique) une proposition de standard
d'origine américaine;
et enfin SCHEME, version modernisée et plus «propre» de ce langage.
Il est à noter que certains logiciels (par exemple l'éditeur de textes Emacs,
ou logiciel de CAO AutoCad) contiennent un petit interprèteur Lisp qui permet
à l'utilisateur d'écrire des programmes qui étendent les possibilités de base
du logiciel.
M. BILLAUD Département Informatique IUT-A Bordeaux (1989)