Introduction `a
la programmation fonctionnelle
par Scheme
Ann´ee 1993-1994
Jean-Jacques Girardot
girardot@emse.fr
Octobre 1993
Ecole Nationale Sup´erieure des Mines de Saint-Etienne
158 Cours Fauriel
42023 Saint-Etienne C´edex
2
Document de travail. Release 0.34 (c) J.J.Girardot, 1993.
Date d’impression 20 d´ecembre 1993
Preface
0.1 Objectifs
Ce cours a pour but de pr´esenter une autre facette de l’activit´e de programmation, celle des langages applica-
tifs. Pour cel`a, certains des concepts de base de la programmation, ´eventuellement d´eja vus par l’´etudiant dans
le cadre d’un langage imp´eratif, sont repris sous un angle nouveau. Cependant, la programmation fonctionnelle
couvre un champ d’application relativement distinct de celui de la programmation imp´erative, et nous verrons
que, mˆeme sur des probl`emes similaires, les approches sont relativement di´erentes.
0.2 Plan de l’ouvrage
Le chapitre 1 eectue un tour sommaire de la programmation fonctionnelle, du lambda calcul jusqu’au
langage Haskell.
Le chapitre 2 est le chapitre introductif `a Scheme. Y sont abord´es la syntaxe et la s´emantique du langage,
ainsi que les aspects num´eriques.
Le chapitre 3 introduit les aspects de manipulations symboliques, ainsi que la structure de base, la liste.
Le chapitre 4 pr´esente les aspects fonctionnels de Scheme : qu’est-ce qu’une fonction, que peut-on faire avec
les fonctions.
Le chapitre 5 propose une analyse, en terme de complexit´e, des caract´eristiques du langage.
Le chapitre 6 introduit la notion de macro-d´efinition, ainsi que certains aspects non fonctionnels du langage :
manipulation de listes, etc.
Le chapitre 7 aborde un aspect particulier de la programmation fonctionnelle : l’´evaluation retard´ee, grˆace
aux promesses et aux flots.
Le chapitre 8 revient sur les structures de contrˆoles, en introduisant la notion de continuation : cr´eation de
continuation, passage explicite de continuation, primitives correspondante du langage.
Le chapitre 9 propose une vision d’une extension classique de Scheme : l’introduction d’objets.
Bibliographie, index, table des mati`eres.
0.3 Mat´eriaux
0.3.1 Le langage
Le langage de programmation particulier utilis´e commme support de la pens´ee dans un cours d’informatique
ne devrait jouer qu’un rˆole tr`es secondaire vis `a vis des concepts enseign´es. Ce n’est malheureusement presque
jamais le cas, et, en particulier dans le cas des “initiations” `a l’informatique, ce choix du langage joue un
ole pr´epond´erant. Une mode actuelle consiste `a d´ebuter les enseignements par un cours de programmation
dit “fonctionnelle”. Plusieurs langages epondent `a ce crit`ere : les langages de la famille ML comme CAML
([Mau91], [HV92]), Haskell ([HJe92], [HF92]), Miranda ([Tur86]), Gofer, etc.
Nous avons choisi Scheme, qui est plus ancien mais plus epandu, pour lequel la litt´erature est beaucoup
plus importante, et surtout qui a fait depuis longtemps ses preuves dans le domaine de la p´edagogie, avec en
particulier le tr`es r´eput´e Structure and Interpretation of Computer Programs, d’Abelson et Sussman ([ASS85],
et dans sa traduction fracaise, [ASS89]). Citons encore, entre autres ouvrages consacr´es `a Scheme : [Dyb87],
[SF92], ou [pF86].
A l’heure actuelle, un tr`es grand nombre d’universit´es am´ericaines, dont les plus prestigieuses, une centaine
d’universit´es de par le monde, dont plus d’une vingtaine en France, proposent un ou plusieurs enseignements
reposant sur l’utilisation de Scheme. Cet engouement n’est pas sans raisons. Scheme a en eet peu `a peu acquis,
au sein des ´etablissements d’enseignement, la r´eputation d’un bon langage pour la pr´esentation de la plupart
3
4
des concepts de l’informatique (cf. par exemple [FWH89]). Le curriculum de l’Universit´e d’Indiana est ´eloquent
`a ce sujet. Scheme y est utilis´e, comme unique langage de programmation, dans les cours suivants :
emantique et implantation des langages de programmation.
Concepts avanc´es des langages de programmation (langages data-flow et acteurs en particulier).
Operating Systems (cours de base et cours avanc´e).
Compilation (cours de base et cours avanc´e).
emantique d´enotationnelle.
Intelligence artificielle.
(et il peut ˆetre choisi par les ´etudiants pour la remise de projets informatiques dans la plupart des autres
mati`eres).
0.3.2 L’implantation
Le syst`eme Scheme utilis´e comme support des exemples est MIT-Scheme. Ce syst`eme est disponible en
freeware, et peut ˆetre obtenu par ftp sur la machine altdorf.ai.mit.edu, dans le r´epertoire pub/scheme-7.1 .
Di´erents portages ont ´et´e ealis´es pour plusieurs mod`eles de machines.
Les exemples ont ´et´e ex´ecut´es sur Sun SPARC. Cependant, Scheme est un dialecte relativement bien sp´ecifi´e,
et il existe de nombreux syst`emes du domaine publique pour quasiment tous les types de machines.
Le lecteur disposant d’un compatible PC peut utiliser PCScheme. Il s’agit d’une ancienne implantation
commerciale du langage, due `a Texas Instruments, aujourd’hui maintenue et enrichie par Laurent Bartholdi et
Marc Vuilleumier, de l’universit´e de Gen`eve. On les applaudit tr`es fort.
Sur Macintosh, on utilisera par exemple MacGambit, ealis´ee par Marc Feeley et Doug Currie, `a l’universit´e
de Monteal.
0.3.3 Le cours
Le support de cours (ce document) contient des chapitres correspondant, en en´eral, aux objectifs ´enonc´es
ci-dessus. Certains aspects resteront non dits - le lecteur int´eress´e se reportera `a ce document, ou aux documents
cit´es en r´ef´erence.
Ces notes de cours ne sont pas destin´ees `a publication. Elles ne se veulent ni exhaustives ni originales, au
contraire, de nombreuses parties ont ´et´e snarf´ees1ici et l`a. Elles ne couvrent (et c’est heureux) ni l’ensemble des
aspects de la programmation fonctionnelle, ni l’ensemble des caract´eristiques du langage Scheme. De multiples
ef´erences sont donn´ees ¸c`a et l`a, auxquelles le lecteur curieux pourra se reporter.
0.3.4 Autres documents
D’autres documents sont ´egalement rendus accessibles aux ´el`eves:
Manuel de R´ef´erence de MIT-Scheme [Han91b].
Manuel de l’Utilisateur de MIT-Scheme [Han91c].
Norme du langage, dite R4RS [R4R90].
Textes des TPS et documents compl´ementaires distribu´es `a l’occasion.
Quelques ouvrages consacr´es `a Scheme et `a Lisp sont disponibles (ou ne le sont plus) en biblioth`eque.
0.3.5 O`u?
Ou se procurer des informations suppl´ementaires sur Scheme et Lisp?
Une source in´epuisable (et chaque mois renouvel´ee) d’informations est constitu´ee par les FAQ2LISP et
Scheme, accessibles par ftp sur ftp.think.com, dans le epertoire /public/think/lisp.
Enfin, certains documents, et certaines des implantations, sont accessibles par ftp `a l’Ecole des Mines de
Saint-Etienne, sur la machine ftp.emse.fr, dans le epertoire /pub/scheme.
1snarfer : de to snarf , s’emparer d’un texte, d’un fichier, d’une citation, etc, pour la r´eutiliser, avec ou sans l’accord de son
egitime propri´etaire ; expression snarf´ee de [ASS85].
2Frequently Asked Questions.
Chapitre 1
La programmation Fonctionnelle
Ce chapitre pr´esente la programmation fonctionnelle : en quoi celle-ci se distingue-t-elle de la programmation
traditionnelle, ou imp´erative, quelles sont ses origines, ses possibilit´es et ses limites, bref toutes ces sortes de
choses. Un tour complet de la question est fait dans [Hud89] dont ce r´esum´e est tr`es largement inspir´e.
1.1 Introduction
La famille des langages de programmation fonctionnelle, ou applicative, a suscit´e beaucoup d’int´erˆet depuis
une quinzaine d’ann´ees.
Que nous apporte la programmation fonctionnelle ? Les programmes fonctionnels, nous dit-on, sont plus
concis, plus rapidement ´ecrits, de plus haut niveau. Ils se prˆetent bien `a l’analyse de leurs propri´et´es, sont,
comparativement, plus facile `a prouver que les programmes imp´eratifs ´equivalents, et pr´esentent plus de poten-
tialit´es que ceux-ci lorsqu’il s’agit de les compiler ecacement pour certaines classes d’architectures, telles les
machines parall`eles.
1.2 Qu’est-ce que la programmation fonctionnelle?
La programmation fonctionnelle est un style de programmation, dans lequel l’´evaluation s’eectue unique-
ment (ou essentiellement) par des applications de fonctions. Le but de la programmation fonctionnelle est en
fait de proposer un paradigme de programmation, qui soit aussi proche que possible du mod`ele math´ematique.
Une description rapide des principaux paradigmes de programmation permet de mieux cerner ce qu’est
eectivement la programmation fonctionnelle.
1.2.1 Analyse des paradigmes de programmation
Emmanuel Saint-James [SJ91] classe les langages de programmation en trois familles principales :
programmation imp´erative : le calcul s’exprime par des modification de l’´etat de la machine. Parmi les
langages de programmation supportant essentiellement ce mod`ele, citons Ada,Basic,C,Fortran,Pascal
et bien d’autres.
programmation applicative : le calcul se r´ealise par la d´efinition et l’application de fonctions. Les langages
de cette famille sont relativement r´ecents (ann´ees 80) et assez peu connus. Citons ML,Haskell,Miranda.
programmation d´eclarative : le calcul se d´efinit par l’expression des propri´et´es du esultat attendu. On peut
placer dans cette cat´egorie aussi bien Prolog que SQL, bien qu’ils aient tr`es peu de traits en commun.
Dans la pratique, les limites peuvent ˆetre floues ; certains langages vont emprunter des traits `a plusieurs de ces
cat´egories. Il existe des langages fonctionnels “purs”, tels Miranda ou Haskell, alors que d’autres vont conserver
des aspects imp´eratifs (ML).
1.2.1.1 Un bref rappel historique
Les premiers langages de programmation ont ´et´e con¸cus dans l’optique d’une utilisation eective de l’or-
dinateur, dont le coˆut de fonctionnement ´etait alors excessivement ´elev´e. Ces langages refl`etent donc, plus ou
moins fid`element, la machine sous-jacente. Ils se composent essentiellement d’ordres destin´es `a cette machine :
mettre telle donn´ee `a tel endroit, continuer l’ex´ecution `a tel autre endroit, etc. Cependant, ce qui semblait
5
1 / 191 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !