noyau fonctionnel

publicité
MdP
Modèles de Programmation
Emmanuel Chailloux
Master LMFI - Modèles de Programmation - année 2013/2014 - 1 / 45
Informations sur le cours MdP
Site
http://www-apr.lip6.fr/~chaillou/Public/enseignement/
2013-2014/MdP/
Email
[email protected]
Master LMFI - Modèles de Programmation - année 2013/2014 - 2 / 45
Description de l’UE
Comprendre les différents modèles de programmation
séquentielle (impératif, fonctionnel, modulaire, objet)
◮ Maîtriser leur mise en pratique dans le cadre du langage
OCaml,
◮ Apprécier la sûreté et la réutilisation apportéee par le typage
statique
◮ Savoir utiliser un environnement de développement pour Caml
◮ Comprendre les différents modèles de programmation
concurrente en fonction des modèles mémoire utilisés
(mémoire partagée, mémoire répartie).
mots clés :
Panorama des langages de programmation, Types et
déclarations, Mécanismes d’abstraction, Programmation
par objets, Programmation fonctionnelle, Programmation
modulaire, Systèmes de types, Programmation
concurrente
◮
Master LMFI - Modèles de Programmation - année 2013/2014 - 3 / 45
Plan du cours (1)
1. présentation de l’UE
généralités sur les langages et les modèles de programmation,
le noyau fonctionnel Caml : définitions et appels de fonction,
valeurs fonctionnelles
2. le noyau fonctionnel : déclarations de types, filtrage de motifs,
polymorphisme
Exceptions : déclenchement, récupération et style de
programmation
3. Traits impératifs : valeurs physiquement modifiables et
structures de contrôle, variables de type faibles
4. Modules simples et paramétrés : séparation interface et
implantation, compilation séparée, types abstraits de données
5. Objet I : classes, instances, héritage, liaison tardive
Objet II : sous-typage et polymorphisme objet
6. Concurrence et répartition
Master LMFI - Modèles de Programmation - année 2013/2014 - 4 / 45
Logiciels du cours
indépendants des systèmes (Windows, Linux, Macosx, ...) :
◮
langage Objective Caml 4.01
◮
◮
pré-installé sur les machines de l’école doctorale (à véririfer)
à installer à la maison à partir du site de l’Inria :
http://caml.inria.fr/
◮
Environnements de développement
◮
Emacs et mode Tuareg
http://www.gnu.org/software/emacs/
http://tuareg.forge.ocamlcore.org/
◮
Eclipse et plug-in Ocaide
http///www.eclipse.org et
et
http://www.algo-prog.info/ocaide/
Master LMFI - Modèles de Programmation - année 2013/2014 - 5 / 45
Bibliographie
◮
◮
◮
◮
◮
◮
Pascal Manourry. Programmation de droite à gauche et
vice-versa, paracamplus, 2012.
Xavier Leroy et al. The Objective Caml system :
documentation and user’s manual Inria, 2010.
Emmanuel Chailloux, Pascal Manoury et Bruno Pagano.
Développement d’Applications avec Objective Caml. O’Reilly,
2000.
Guy Cousineau et Michel Mauny. Approche fonctionnelle de la
programmation. Dunod, 1995.
Philippe Nardel. Programmation fonctionnelle, générique et
objet : Une introduction avec le langage OCaml. Vuibert, 2005
Yaron Minsky, ANul Madhavapeddy, Jason Hickey. Real World
OCaml, O’Reilly 2013
autres références sur : http://caml.inria.fr/about/books.en.html et
scriptsizehttp://ocaml.org/
Master LMFI - Modèles de Programmation - année 2013/2014 - 6 / 45
Objective Caml
◮
langage fonctionnel,
◮
typé statiquement,
◮
polymorphe paramétrique,
◮
avec inférence de types,
◮
muni d’un mécanisme d’exceptions,
◮
et de traits impératifs
◮
possèdant un système de modules paramétrés
◮
et un modèle objet
◮
exécutant des processus légers
◮
et communiquant sur le réseau Internet,
◮
indépendant de l’architecture machine.
Master LMFI - Modèles de Programmation - année 2013/2014 - 7 / 45
Historique
◮
◮
l’ancêtre : ML (meta-langage) de LCF (80)
machines abstraites (84)
◮
◮
◮
◮
la FAM : Cardelli
la CAM : Curien, Cousineau
spécifications : Standard ML (84 - Milner)
premières implantations
◮
◮
CAML - Suarez - Weis - Mauny (87)
SML/NJ - Mc Queen - Appel (ATT - 88)
◮
nouvelles implantations : Caml-light (90) Leroy - Doligez
◮
modules paramétrés : Caml Special Light (95)
◮
extension objet (96)
◮
labels, options, variants polymorphes, . . .
Master LMFI - Modèles de Programmation - année 2013/2014 - 8 / 45
Mise en œuvre (1)
◮
compilateur natif (commande ocamlopt)
◮
◮
pour Intel, Sparc, HP-pa, PowerPC, . . .
pour Linux, Macosx, Windows, . . .
$ c a t t . ml
let f x = x + 1 ;;
p r i n t _ i n t ( f 18) ; ;
print_newline () ; ;
$ o c a m l o p t −o t n . e x e t . ml
$ . / tn . exe
19
Master LMFI - Modèles de Programmation - année 2013/2014 - 9 / 45
Mise en œuvre (2)
◮
compilateur byte-code (commande ocamlc)
◮
ligne de commande
$ cat t.ml
let f x = x + 1 ;;
print_int (f 18) ;;
print_newline () ;;
$ ocamlc -i -custom -o tb.exe t.ml
val f : int -> int
$ ./tb.exe
19
Master LMFI - Modèles de Programmation - année 2013/2014 - 10 / 45
Mise en œuvre (3)
◮
compilateur byte-code (commande ocaml)
◮
1
2
3
4
5
6
7
8
9
boucle d’interaction
$ ocaml
Objective Caml version 3 . 1 0 . 2
# let f x = x + 1 ;;
v a l f : int −> int = <f un>
# f 18 ; ;
− : int = 19
# #q u i t ; ;
$
◮
◮
◮
$ : invite Unix
# : invite O’Caml
#quit : directive O’Caml
Master LMFI - Modèles de Programmation - année 2013/2014 - 11 / 45
Machine virtuelle
BC
la Zinc
C
C
.o
BC
BC
.o
µ
µ
bibliothèque
d’exécution
C
ocamlrun
C
.o
.o
µ
compilateur
O’CAML
v1 -> v2
OC-v2
OC-v2
BC
BC
OC-v1 OC-v1
BC
BC
BC
ocamlc
BC
µ
bibliothèques
de modules
OC-v2
OC-v2
BC
BC
BC
.cmo
BC
µ
Master LMFI - Modèles de Programmation - année 2013/2014 - 12 / 45
Phrases du langage
Se terminent par ;;
◮
◮
expressions
déclarations
◮
◮
◮
de valeurs
de types
d’exceptions
◮
déclarations de modules
◮
déclarations de classes
Notation qualifiée Module.nom pour accéder à un champs d’un
module.
Master LMFI - Modèles de Programmation - année 2013/2014 - 13 / 45
Noyau fonctionnel
Master LMFI - Modèles de Programmation - année 2013/2014 - 14 / 45
Programmes en Objective Caml
Seuls les programmes correctement typés peuvent être exécutés.
◮
calcul d’une expression
◮
application d’une fonction à ses arguments
◮
évaluation immédiate des arguments
◮
rupture d’évaluation si calcul impossible
Master LMFI - Modèles de Programmation - année 2013/2014 - 15 / 45
Types de base, valeurs et fonctions
◮
nombres
◮
◮
int ([−230 , 230 − 1] (m32)
float (IEEE 754) mantisse 53bits, exposant ∈ [−1022, 1023]
◮
caractères : char
◮
chaînes de caractères : string
◮
booléens : bool
Master LMFI - Modèles de Programmation - année 2013/2014 - 16 / 45
Opérations sur les nombres
entiers
+
*
/
mod
addition
soustraction
multiplication
division entière
modulo
flottants
+. addition
-. soustraction
*. multiplication
/. division
** exponentiation
opérateurs infixes!!!
1
2
3
4
#
−
#
−
1 + 3;;
: int = 4
1.8 ∗. 9 . 1 ; ;
: float = 1 6 . 3 8
Master LMFI - Modèles de Programmation - année 2013/2014 - 17 / 45
Fonctions sur les nombres
entiers
ceil
floor
sqrt
exp
log
log10
racine carrée
exponentielle
log népérien
log en base 10
flottants
cos
cosinus
sin
sinus
tan
tangente
acos arccosinus
asin arcsinus
atan arctangente
angles en radiant!!!
Master LMFI - Modèles de Programmation - année 2013/2014 - 18 / 45
Calculs sur les nombres (1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1 + 2;;
− : int = 3
# 9/2;;
− : int = 4
# 2147483650;;
− : int = 2
# 9.1 /. 2 . 2 ; ;
− : float = 4 . 1 3 6 3 6 3 6 3 6 3 6
# 1. /. 0 . ; ;
− : float =
Inf
Master LMFI - Modèles de Programmation - année 2013/2014 - 19 / 45
Calculs sur les nombres (2)
1
2
3
# 2 + 2.1;;
This expression has t y p e float but
is here used w i t h t y p e int
Un int ne peut pas remplacer un float!!!
1
2
3
4
5
# sin ; ;
− : float −> float = <f un>
# asin 1 . ; ;
− : float = 1 . 5 7 0 7 9 6 3 2 6 7 9
Master LMFI - Modèles de Programmation - année 2013/2014 - 20 / 45
Calculs sur les chaînes
1
2
3
4
5
6
7
8
9
10
11
# ’B ’ ; ;
− : char = ’ B ’
# i n t _ o f _ c h a r ’B ’ ; ;
− : int = 66
# " est une chaine " ; ;
− : string = " est une chaine "
# ( s t r i n g _ o f _ i n t 1 9 8 7 ) ^" est l ’ annee de CAML " ; ;
− : string = " 1987 est l ’ annee de CAML "
Master LMFI - Modèles de Programmation - année 2013/2014 - 21 / 45
Opérations sur les booléns et relations
not
&&
||
=
==
<>
!=
négation
et séquentiel
ou séquentiel
égalité structurelle
égalité physique
négation de =
négation de ==
&
or
<
>
<=
>=
synonyme pour et
synonyme pour ou
inférieur
supérieur
inférieur ou égal
supérieur ou égal
égalités et inégalités polymorphes!!!
= : ’a -> ’a -> bool
== : ’a -> ’a -> bool
Master LMFI - Modèles de Programmation - année 2013/2014 - 22 / 45
Produits cartésiens, n-uplets
1
2
3
4
5
6
7
8
◮
constructeur de valeurs : ,
◮
constructeur de types : *
◮
accesseurs (couples) : fst et snd
# ( 1 8 , " mars " ) ; ;
− : int ∗ string
# ( 1 8 , " mars " , 1 9 9 9 ) ; ;
− : int ∗ string ∗ int
# f s t ( 1 8 , " mars " ) ; ;
− : int = 18
# s nd ( 1 8 , " mars " , 1 9 9 9 )
erreur de typage
Master LMFI - Modèles de Programmation - année 2013/2014 - 23 / 45
Listes homogènes
1
2
3
4
5
6
7
8
9
10
11
12
◮
liste vide : []
◮
constructeur ::
◮
type list
◮
accesseurs List.hd et List.tl
# [];;
− : ’ a list
# 1::2::3::[];;
− : int list
# [1 ; 2; 3 ; ] ; ;
− : int list
# [ 1 ; " hello " ; 3 ] ; ;
erreur de typage
# L i s t . hd [ 1 . 1 ; 1 . 2 ; 1 . 3 ] ; ;
− : float = 1 . 1
# L i s t . hd [ ] ; ;
e x c e p t i o n non récupérée
Master LMFI - Modèles de Programmation - année 2013/2014 - 24 / 45
Expression conditionnelle
Syntaxe:
if expr1 then expr2 else expr3
1
2
3
4
5
6
7
8
#
−
#
−
#
−
#
−
◮
expr1 de type bool
◮
expr2 et expr3 de même type
i f 3 = 4 then 0 e l s e 4 ; ;
: int = 4
i f 5 = 6 t h e n 1 e l s e " Non " ; ;
: erreur de typage
( i f 3 = 5 then 8 e l s e 10) + 5 ; ;
: int = 15
5 = 6 || 7 = 9;;
: bool = false
Master LMFI - Modèles de Programmation - année 2013/2014 - 25 / 45
Déclarations de valeurs (1)
Déclarations globales:
Syntaxe:
let p = e
1
2
3
4
5
# l e t pi = 3.14159;;
v a l pi : float = 3 . 1 4 1 5 9
# sin ( pi /. 2.0) ; ;
− : float = 0 . 9 9 9 9 9 9 9 9 9 9 9 9
Master LMFI - Modèles de Programmation - année 2013/2014 - 26 / 45
Déclarations de valeurs (2)
Déclatations locales:
Syntaxe:
let p = e1 in e2
1
2
3
4
5
6
7
# le t x = 3 in
l e t b = x < 10 i n
i f b then 0 e l s e
− : int = 0
10;;
# b;;
Unbound v a l u e b
Master LMFI - Modèles de Programmation - année 2013/2014 - 27 / 45
Déclarations combinées
Syntaxe:
let p1 = e1 and p2 = e2 ... and pn = en ;;
1
2
3
4
5
# let x
val x :
val y :
# x+y ; ;
− : int
= 1 and y = 2 ; ;
int = 1
int = 2
= 3
Syntaxe:
let p1 = e1 and p2 = e2 ... and pn = en in expr ;;
1
2
# l e t a = 3 . 0 and b = 4 . 0 i n s q r t ( a ∗ . a +.b ∗ . b ) ; ;
− : float = 5
Master LMFI - Modèles de Programmation - année 2013/2014 - 28 / 45
Valeurs fonctionnelles, fonctions
Syntaxe:
function p -> e
1
2
3
4
5
6
7
8
◮
fonction anonyme : function p -> e
◮
de type : typede(p) -> typede(e)
# f u n c t i o n x −> x + 1 ; ;
− : int −> int
# ( f u n c t i o n x −> x +1) 1 9 9 9 ; ;
− : int = 2000
# f u n c t i o n x −> i f x < 0 t h e n −x e l s e x ; ;
− : int −> int
# f u n c t i o n x −> ( f u n c t i o n y −> 2∗ x+3∗y ) ; ;
− : int −> int −> int
Master LMFI - Modèles de Programmation - année 2013/2014 - 29 / 45
Déclaration de valeurs fonctionnelles
1
2
3
4
# l e t s u c c = f u n c t i o n x −> x + 1 ; ;
succ : int −> int
# succ 420 ;;
− : int = 421
Syntaxe:
let f = function p -> e
ou
let f (p) = e
1
2
3
4
5
6
7
8
9
10
ou
let f p = e
# l e t pred ( x ) = x −1;;
pred : int −> int = <f un>
# l e t f c = 2 ∗ ( f s t c ) + 3 ∗ ( s nd c ) ; ;
f : int ∗ int −> int = <f un>
# f (1 ,2) ; ;
− : int = 8
# l e t g = f u n c t i o n x −> ( f u n c t i o n y −> 2∗ x + 3∗ y ) ; ;
g : int −> int −> int = <f un>
# g 1 2;;
− : int = 8
Master LMFI - Modèles de Programmation - année 2013/2014 - 30 / 45
Portée des déclarations
◮
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
portée lexicale (liaison statique)
# let p = q + 1;;
e r r e u r q inconnue
# let p = p + 1;;
e r r e u r p inconnue
# let p = 10;;
p : i n t = 10
# l e t addp x = x + p ; ; addp : i n t −> i n t = <f un>
# addp 8 ; ;
− : i n t = 18
# let p = 40;;
p : i n t = 40
# addp 8 ; ;
− : i n t = 18
# p;;
− : i n t = 40
Master LMFI - Modèles de Programmation - année 2013/2014 - 31 / 45
Récursivité
Syntaxe:
let rec p = expr
1
2
3
4
5
6
# l e t r e c sigma x = i f x = 0 then 0
e l s e x + sigma ( x −1) ; ;
sigma : int −> int = <f un>
# sigma 1 0 ; ;
− : int = 55
récursion mutuelle:
1
2
3
4
5
6
7
# l e t r e c odd x = i f x = 0 t h e n f a l s e e l s e e v e n ( x −1)
# and e v e n x = i f x = 0 t h e n t r u e e l s e odd ( x −1) ; ;
v a l odd : int −> bool = <f un>
v a l even : int −> bool = <f un>
# odd 2 7 ; ;
− : bool = true
Master LMFI - Modèles de Programmation - année 2013/2014 - 32 / 45
Polymorphisme paramétrique (1)
1
2
3
4
5
6
7
8
9
10
11
◮
même code pour des arguments de types différents
◮
la fonction n’utilise pas la structure de l’argument
# l e t mp a b = a , b ; ;
v a l mp : ’ a −> ’ b −> ’ a ∗ ’ b = <f un>
# l e t x = mp 3 6 . 8 ; ;
v a l x : int ∗ float = 3 , 6 . 8
# l e t y = mp t r u e [ 1 ] ; ;
v a l y : bool ∗ int list = true , [ 1 ]
# fst x ;;
− : int = 3
Master LMFI - Modèles de Programmation - année 2013/2014 - 33 / 45
Polymorphisme paramétrique (2)
1
2
3
4
5
6
7
8
◮
même code pour des arguments de types différents
◮
la fonction n’utilise pas la structure de l’argument
# le t id x = x ; ;
v a l id : ’ a −> ’ a = <f un>
# l e t app x y = x y ; ;
v a l app : ( ’ a −> ’ b ) −> ’ a −> ’ b = <f un>
# app i d 1 ; ;
− : int = 1
Master LMFI - Modèles de Programmation - année 2013/2014 - 34 / 45
Résumé des expressions rencontrées
expr ::=
|
|
|
|
|
|
|
|
|
|
constante
( expr )
ident
Mod.ident
op expr
expr infix-op expr
if expr then expr else expr
function ident -> expr
expr expr
expr , expr | epxr :: epxr
let [rec] ident = expr
{and ident = expr} in expr
Master LMFI - Modèles de Programmation - année 2013/2014 - 35 / 45
Exemples (1)
Comptage des éléments d’une liste:
1
2
3
4
5
6
7
8
9
10
11
12
13
# l e t rec long l =
i f l = [ ] then 0
e l s e 1 + long ( List . tl l ) ; ;
v a l long : ’ a list −> int = <f un>
# long [ 2 ; 4 ; 7 ] ; ;
− : int = 3
# long [ ] ; ;
− : int = 0
# long [ ’A ’ ;
− : int = 2
’G ’ ] ; ;
Master LMFI - Modèles de Programmation - année 2013/2014 - 36 / 45
Exemples (2)
Composition de fonctions:
1
2
3
4
5
6
7
8
9
10
# l e t compose f g x = f ( g x ) ; ;
v a l compose : ( ’ a −> ’ b ) −> ( ’ c −> ’ a ) −>
’ c −> ’ b = <f un>
# l e t add2 x = x + 2 and m ul t5 x = x ∗ 5 ; ;
v a l add2 : int −> int = <f un>
v a l mult5 : int −> int = <f un>
# compose m ul t5 add2 9 ; ;
− : int = 55
Master LMFI - Modèles de Programmation - année 2013/2014 - 37 / 45
Exemples (3)
Application d’une fonction sur les éléments d’une liste:
1
2
3
4
5
6
7
8
9
10
11
12
13
# l e t r e c map f l =
i f l = [ ] then [ ]
else
l e t t = List . hd l
and q = List . tl l i n
( f t ) : : ( map f q ) ; ;
v a l map : ( ’ a −> ’ b ) −> ’ a list −> ’ b list = <f un>
# l e t l 1 = map add2 [ 7 ; 2 ; 9 ] ; ;
v a l l1 : int list = [ 9 ; 4 ; 1 1 ]
# l e t l 2 = map l o n g [ [ ’ z ’ ; ’ a ’ ; ’ m ’ ] ;
v a l l2 : int list = [ 3 ; 4 ]
[ ’. ’; ’n ’; ’e ’; ’ t ’ ] ] ; ;
Master LMFI - Modèles de Programmation - année 2013/2014 - 38 / 45
Filtrage de motif
permet l’accès aux structures de données
◮
en testant une valeur
◮
en nommant une partie de la structure
motif:
◮ assemblage correct (syntaxe et type) d’objets
◮
◮
◮
◮
◮
de types de base (int, bool,. . . )
de paires, listes et constructeurs
d’identificateurs
du motif “sauvage” (_)
ce n’est pas une expression (pas de calcul)
Master LMFI - Modèles de Programmation - année 2013/2014 - 39 / 45
Syntaxe du filtage de motif
Syntaxe:
match e with p1 -> e1 | p2 -> e2 ...| pn -> en
◮
filtrage séquentiel de e par les différents pi .
◮
Si un des motifs correspond à la valeur de e, alors sa branche
ei est évaluée.
◮
tous les ei du même type, idem pout les pi
◮
motif linéaire ( (x,x) interdit)
◮
détection d’un filtrage exhaustif
Master LMFI - Modèles de Programmation - année 2013/2014 - 40 / 45
Exemple : fonction imply
1
2
3
4
5
6
# l e t i m p l y v = match v w i t h
( true , true ) −> true
|
( true , false )−> false
|
( false , true )−> true
|
( false , false )−>true ; ;
v a l imply : bool ∗ bool −> bool = <f un>
Autre version:
1
2
3
4
# l e t i m p l y v = match v w i t h
( true , x ) −> x
|
( false , _ ) −> true ; ;
v a l imply : bool ∗ bool −> bool = <f un>
Master LMFI - Modèles de Programmation - année 2013/2014 - 41 / 45
Warnings
◮
1
2
3
4
5
6
7
◮
1
2
3
4
5
filtrage non exhaustif :
# l e t f x = match x w i t h
( true , x ) −> true
| ( false , false ) −> true ; ;
Warning : this pattern −matching is no t exhaustive .
Here is an example o f a v a l u e that is no t matched :
( false , true )
v a l f : bool ∗ bool −> bool = <f un>
cas inutile :
# l e t f x = match x
( a , b ) −> true
| ( true , false ) −>
Warning : this match
v a l f : bool ∗ bool
with
false ; ;
case is unused .
−> bool = <f un>
Master LMFI - Modèles de Programmation - année 2013/2014 - 42 / 45
Style Caml : définition par cas
en utilisant le filtrage de motifs sur les différents constructeurs
d’uns structure de données :
1
2
3
4
let
r e c long l = match l w i t h
[ ] −> 0
| _ : : q −> 1 + long q ; ;
v a l long : ’ a list −> int = <f un>
1
2
3
4
l e t r e c map f l = match l w i t h
[ ] −> [ ]
| t : : q −> ( f t ) : : map f q ; ;
v a l map : ( ’ a −> ’ b ) −> ’ a list −> ’ b list = <f un>
Master LMFI - Modèles de Programmation - année 2013/2014 - 43 / 45
Filtrage avec gardes
◮
expression conditionnelle après le motif
◮
reprise du filtrage si false
Syntaxe:
match e with p1 when c1 -> e1 | p2 -> e2 ...| pn -> en
1
2
3
4
5
6
# l e t r e c mem_assoc3 x l = match l w i t h
[ ] −> false
| ( y1 , y2 , y3 ) : : t when y1 = x −> true
| _ : : t −> mem_assoc3 x t ; ;
v a l mem_assoc3 :
’ a −> ( ’ a ∗ ’ b ∗ ’ c ) list −> bool = <f un>
Master LMFI - Modèles de Programmation - année 2013/2014 - 44 / 45
Motif dans les déclarations
◮
Formes équivalentes:
Syntaxe:
match e with filtrage
◮
≡
(function filtrage) e
Déclarations déstructurantes:
Syntaxe:
let p = e
1
2
3
p est un motif
# l e t (x , y ) = (3 , true ) ; ;
v a l x : int = 3
v a l y : bool = true
Master LMFI - Modèles de Programmation - année 2013/2014 - 45 / 45
Téléchargement