Programmation Fonctionnelle
Stefano Guerrini
stefano.guerrini@univ-paris13.fr
http://www.lipn.univ-paris13.fr/~guerrini
LIPN - Institut Galil´ee, Universit´e Paris Nord 13
Licence Info 3
evrier 2013
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 1 / 131
Introduction
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 2 / 131
Introduction `a la programmation
fonctionnelle en OCAML
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 3 / 131
Introduction `a la programmation fonctionnelle et `a OCaml Introduction
Styles de programmation
Style applicatif
IFone sur l’´evaluation d’expressions, o`u le r´esultat ne d´epend que de la valeurs
des arguments (et non de l’´etat de la m´emoire).
IDonne des programmes courts, faciles `a comprendre.
IUsage intensif de la ecursion.
ILangages typiques : Lisp, ML, Caml (Camlight, Ocaml).
Style imp´eratif
IFone sur l’ex´ecution d’instructions modifiant l’´e t a t d e l a m ´e m o i r e .
IUtilise une structure de contrˆole et des structures de donn´ees.
IUsage intensif de l’it´eration.
ILangages typiques : Fortran, C, Pascal.
Style objet
IUn programme est vu comme une communaut´e de composants autonomes
(objets) disposant de ses ressources et de ses moyens d’interaction.
IUtilise des classes pour d´ecrire les structures et leur comportement.
IUsage intensif de l’´echange de message (m´etaphore).
ILangages typiques : Simula, Smalltalk, C++, Java.
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 4 / 131
Introduction `a la programmation fonctionnelle et `a OCaml Introduction
La petite histoire
OCaml (Objective Caml) est le fruit de d´eveloppements continus :
1975 Robin Milner propose ML comme m´etalangage (langage de script)
pour l’assistant de preuve LCF. Il devient rapidement un langage de
programmation `a part enti`ere.
1981 Premi`eres implantations de ML
1985 D´eveloppement de Caml `a l’INRIA et en parall`ele, de Standard ML
`a ´
Edimbourg, de “SML of New-Jersey”, de Lazy ML `a Chalmers,
de Haskell `a Glasgow, etc.
1990 Implantation de Caml-Light par X. Leroy and D. Doligez
1995 Compilateur vers du code natif + syst`eme de modules
1996 Objets et classes (OCaml)
2001 Arguments ´etiquet´es et optionnels, variantes.
2002 M´ethodes polymorphes, librairies partag´ees, etc.
2003 Modules r´ecursifs, private types, etc.
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 5 / 131
Introduction `a la programmation fonctionnelle et `a OCaml Introduction `a OCaml
Domaine d’utilisation du langage OCaml
Un langage d’usage g´en´eral avec des domaines de pr´edilection.
Domaines de pr´edilection
ICalcul symbolique : Preuves math´ematiques, compilation, interpr´etation,
analyses de programmes.
IPrototypage rapide. Langage de script. Langages d´edi´es. Programmation
distribu´ee (bytecode rapide).
Enseignement et recherche
Industrie
IStartups, CEA, EDF, France Telecom, Simulog,... Gros Logiciels
Quelques succ`es : Coq, Ensemble, ASTREE, (voir la bosse d’OCaml)
Plus r´ecemment, outils syst`eme
IUnison
IMLdonkey (peer-to-peer)
ILibre cours (Site WEB)
ILindows (outils syst`eme pour une distribution de Linux)
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 6 / 131
Introduction `a la programmation fonctionnelle et `a OCaml Introduction `a OCaml
Quelques mots cl´es
Le langage OCaml est :
fonctionnel : les fonctions sont des valeurs de premi`ere classe, elles peuvent
ˆetre retourn´ees en r´esultat et pass´ees en argument `a d’autres fonctions.
`a gestion m´emoire automatique (comme JAVA)
fortement typ´e : le typage garantit l’absence d’erreur (de la machine) `a
l’ex´ecution.
avec synth`ese de types : les types sont facultatifs et synth´etis´es par le
syst`eme.
compil´e ou interactif (mode interactif = grosse calculette)
De plus le langage poss`ede :
une couche `a objets assez sophistiqu´ee,
un syst`eme de modules tr`es expressif.
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 7 / 131
Introduction `a la programmation fonctionnelle et `a OCaml Introduction `a OCaml
Principales caract´eristiques d’OCaml (1/3)
Langage fonctionnel
IUne seule notion fondamentale : la notion de valeur. Les fonctions elles-mˆemes
sont consid´er´ees comme des valeurs.
IUn programme est essentiellement constitu´e d’expressions et le calcul consiste
en l’´evaluation de ces expressions.
Le syst`eme de typage
ILe langage est typ´e statiquement.
IIl poss`ede un syst`eme d’inf´erence de types : le programmeur n’a besoin de
donner aucune information de type : les types sont synth´etis´es
automatiquement par le compilateur.
Le polymorphisme param´etrique
IUn type peut ˆetre non enti`erement d´etermin´e. Il est alors polymorphe.
ICeci permet de d´evelopper un code g´en´erique utilisable pour di´erentes
structures de donn´ees tant que la repr´esentation exacte de cette structure n’a
pas besoin d’ˆetre connue dans le code en question.
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 8 / 131
Introduction `a la programmation fonctionnelle et `a OCaml Introduction `a OCaml
Principales caract´eristiques d’OCaml (2/3)
M´ecanismes particuliers
Ipattern matching : OCaml poss`ede un m´ecanisme de programmation par cas’
tr`es puissant.
IOCaml poss`ede un m´ecanisme d’exceptions pour interrompre l´evaluation
d’une expression. Ce m´ecanisme peut aussi ˆetre adopt´e comme style de
programmation.
IIl y a des types r´ecursifs mais pas de pointeurs.
ILa gestion de la m´emoire est di´e r e n t e d e c e l l e d u C . O C a m l i n t `e g r e u n
ecanisme de ecueration automatique de la m´emoire.
Autres aspects de OCaml
IOCaml poss`ede des aspects imp´eratifs. La programmation imp´erative est
possible mais non souhait´ee.
IOCaml interagit avec le C.
IOCaml poss`ede des aspects objets. Les fonctions peuvent manipuler des objets.
ILes programmes peuvent ˆetre structur´es en modules param´etr´es (s´eparation du
code et de l’interface).
IOCaml ex´ecute des processus l´eger (threads).
IOCaml communique avec le r´eseau internet.
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 9 / 131
Introduction `a la programmation fonctionnelle et `a OCaml Introduction `a OCaml
Principales caract´eristiques d’OCaml (3/3)
Environnement de programmation
IOCaml dispose de trois modes d’ex´ecution.
Fle mode interactif : c’est une boucle d’interaction. La boucle d’interaction
d’OCaml utilise du code-octet pour ex´ecuter les phrases qui lui sont envoy´ees.
Fcompilation vers du code-octet (bytecode) interpr´et´e par une machine virtuelle
(comme Java).
Fcompilation vers du code machine ex´ecut´e directement par un microprocesseur.
IOCaml dispose de nombreuses biblioth`eques de programmes.
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 10 / 131
Introduction `a la programmation fonctionnelle et `a OCaml Modes d’utilisation de OCaml
Compilation
Commandes
Iocaml : lance la boucle d’interaction
Iocamlrun : interpr`ete de code-octet
Iocamlc : compilateur en ligne de code-octet
Iocamlopt : compilateur en ligne de code natif
Iocamlmktop : constructeur de nouvelles boucles d’interaction
Unit´es de compilation : c’est la plus petite d´ecomposition d’un programme
pouvant ˆetre compil´ee.
IPour la boucle d’interaction, c’est une phrase du langage. On va voir plus loin
ce qu’est une phrase.
IPour les compilateurs en ligne, c’est un couple de fichiers (le source .ml et
l’interface facultative .mli).
Extensions des fichiers objets
ILes fichiers objets en code-octet ont pour extension .cmo,.cma (biblioth`eque
objet), .cmi (interface compil´ee).
ILes fichiers objets en code natif ont les extensions .cmx et .cmxa.
Options du compilateur
IL’option -c indique au compilateur de n’engendrer que le code objet.
IL’option -custom de ocamlrun permet de cr´eer un code autonome il contient
le code-octet du programme plus l’interpr`ete du code-octet).
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 11 / 131
Introduction `a la programmation fonctionnelle et `a OCaml Modes d’utilisation de OCaml
Mode interactif
L’option -I catalogue permet d’indiquer un chemin dans lequel se fera la
recherche de fichiers sources ou compil´es.
La boucle poss`ede plusieurs directives de compilation qui permettent de
modifier de fa¸con interactif son comportement. Ces directives commencent
par #et se terminent par ;;.
I#quit;; sort de la boucle d’interaction
I#directory catalogue;; ajoute un chemin de recherche
I#cd catalogue;; change de catalogue courant
I#load "fichier objet";; charge un fichier .cmo
I#use "fichier source";; compile et charge un fichier .ml ou .mli
I#print depth profondeur;; modifie la profondeur d’achage
I#trace fonction;; trace les arguments d’une fonction
I#untrace fonction;; enl`eve cette trace
I#untrace all;; enl`eve toute les traces
On peut lancer la boucle d’interaction sous emacs par M-x run-caml.
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 12 / 131
Introduction `a la programmation fonctionnelle et `a OCaml Modes d’utilisation de OCaml
Premiers pas en OCaml
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 13 / 131
Premiers pas en OCaml Les phrases
Les phrases
Une phrase est une suite de caract`eres qui se termine par ;;.
Il y a essentiellement quatre genres de phrases :
ILes expressions.
ILes d´eclarations globales de valeurs.
ILes d´eclarations de types.
ILes d´eclarations d’exceptions.
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 14 / 131
Premiers pas en OCaml Les expressions
Expressions constantes
Une fois entr´e dans la boucle OCaml on peut ´evaluer des expressions.
shell $ ocaml --> appel de la boucle
Objective Caml version 3.11.1
# 3;; --> expression `a ´evaluer
- : int = 3 --> r´eponse
# #quit;; --> pour sortir de la boucle
shell $ --> shell de syst`eme
La r´eponse de l’´evaluation d’une expression est sa valeur et son type.
Les expressions plus simples sont les constants des types de base.
# 5.0;;
-:float=5.
# true;;
- : bool = true
# "Hello, word!";;
- : string = "Hello, word!"
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 15 / 131
Premiers pas en OCaml Les expressions
Les op´erateur arithm´etiques
Sur les entier on a les op´erateurs arithm´etiques infix´es
#3+4*2;;
-:int=11
Mais attention, les op´erateurs sont typ´es et ils ne sont pas “overloaded”
#3.0+2.5;;
Characters 0-3:
3.0 + 2.5;;
^^^
Error: This expression has type float but an expression was expected of type
int
Les op´erateurs arithm´etiques sur les r´eels ont des symboles distingu´es.
# 3.0 +. 2.0;;
-:float=5.
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 16 / 131
Premiers pas en OCaml Les expressions
Les op´erateurs bool´eens et le if-then-else
Les op´erateurs bool´eens sont
Inot : n´egation
I&& ou &: et s´equentiel
I|| ou or : ou s´equentiel
# not false && false;;
- : bool = false
# not (false && false);;
- : bool = true
# true = false;;
- : bool = false
#3=3;;
- : bool = true
#4+5>=10;;
- : bool = false
# 2.0 *. 4.0 >= 7.0;;
- : bool = true
Expressions conditionnelles
# if (3 < 4) then 1 else 0;;
-:int=1
#if(3>4)then1else0;;
-:int=0
seulement une des branches then/else est ´evalu´ee.
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 17 / 131
Premiers pas en OCaml Les expressions
Conversion de types
Pour utiliser un entier dans une expression qui contient un op´erateur r´eel il
faut utiliser une fonction de conversion explicite
#3.0+.2;;
Characters 7-8:
3.0 +. 2;;
^
Error: This expression has type int but an expression was expected of type
float
#3.0+.float2;;
-:float=5.
Les op´erateur de comparaison <><=>==sont les mˆemes pour les entiers et
les r´eels
#2.0<3.0;;
- : bool = true
#2<3;;
- : bool = true
IMais attention, il faut faire des conversions de type si n´ecessaire
#2.0<3;;
Characters 6-7:
2.0 < 3;;
^
Error: This expression has type int but an expression was expected of
type float
# 2.0 < float 3;;
- : bool = true
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 18 / 131
Premiers pas en OCaml Les chaˆınes de caract`eres
Les chaˆınes de caract`eres
Literals
# "Hello, world!";;
- : string = "Hello, world!"
Concat´enation
# "Hello, " ^ "world!";;
- : string = "Hello, world!"
La biblioth`eque String
# String.uppercase "Hello, world!";;
- : string = "HELLO, WORLD!"
# open String;;
# uppercase "Hello, world!";;
- : string = "HELLO, WORLD!"
Pour acc´eder aux fonctions dans une biblioth`eque :
IBiblio.f : pour utiliser la fonction fde la biblioth`eque Biblio (noter que un
nom de biblioth`eque commence par une majuscule)
Iopen Biblio : pour acc´eder `a toutes les fonctions de Biblio directement
avec leur nom.
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 19 / 131
Premiers pas en OCaml Les fonctions
Les fonctions
Les fonctions sont des expressions (fun est ´equivalent `a function)
#funx->x*2;;
- : int -> int = <fun>
# function x -> x *2;;
- : int -> int = <fun>
Le type d’une fonction n’est plus un type de base
Pour ´evaluer une fonction il faut lui donner les valeurs des arguments
#(funx->x*2)3;;
-:int=6
L’argument d’une fonction peut ˆetre une fonction
#(funf->f(f2));;
- : (int -> int) -> int = <fun>
Le r´esultat de l’´evaluation d’une fonction peut ˆetre une autre fonction
#(funfx->f(fx))(funx->x*x);;
- : int -> int = <fun>
En ajoutant des arguments on peut ´evaluer la fonction obtenue
#(funfx->f(fx))(funx->x*x)2;;
-:int=16
S. Guerrini (LIPN - Paris 13) Programmation Fonctionnelle evrier 2013 20 / 131
1 / 33 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 !