Programmation 1

publicité
Programmation 1
Daniel Hirschkoff
TDs: Romain Demangeon, Jonathan Grattage
Contenu et objectifs du cours
I
ce n’est pas un cours de programmation
I
c’est plutôt un cours sur la programmation
sur les langages de programmation
sur les langages
il va être question
I
I
I
I
de langages de programmation
de modèles formels des langages de programmation
sémantique des langages de programmation
de raisonnement, de logique
Organisation
I
disparités dans les groupes
24>4: ceux qui peuvent vont en TD mardi après-midi
I
disparités de niveau
vont s’estomper
Caml
I
point de départ: Caml
I
Caml est un langage pour la programmation fonctionnelle
I
I
I
dans le paysage des langages de programmation, les langages
fonctionnels sont plutôt de haut niveau
I
I
I
origines: R. Milner, ML, meta language, pour programmer
LCF, années 80
famille: LISP, Scheme, (S,Ca)ML, Haskell, . . .
ils fournissent des abstractions
(plus ou moins) loin de l’exécution concrète des programmes,
en machine
on élimine ce qui est “périphérique”
I
I
librairies (p.ex. graphisme et interfaces, exécutions en parallèle,
portabilité avec d’autres langages ..)
interfaces, éditeurs
Le langage de programmation
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000
type t = 1111111111111111111111111111111111111111111111111
C of ..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
exception E
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
match e with
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
try e with
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
| E −> ..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000
| C x −> 1111111111111111111111111111111111111111111111111
..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
raise
E
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
fun x −> e
(e e’)
let x = e
let rec f = e
ref e
!
:=
;
print_int, ..
manquent types et modules
Caml: constituants
I
déclarations (de valeurs)
I
I
I
let a = 32
let f = fun x -> x*(g x)+52
valeurs (32, fun x -> x*(g x)+52)
fonctions: définition, application
types
de base, avec leurs valeurs
19, 27, true, false, (), "hop", 5.232
unit bool char string int float
I types somme (définis)
type toto = C of ...
filtrage:
match t with | C x -> ...
I variables de type, constructeurs de types
’a * ’b -> ’b,
(int * ’a) list
,→ un langage de types riche
I
I
programmation impérative
I
t ref x := 32; !y unit
importance de unit pour retarder les effets de bord
let decr = fun () -> x:= !x-1
read line
I
exception
print int
try with
etc.
raise
Le cœur fonctionnel de Caml
Expressions, valeurs
faire tourner un programme:
I
I
contrairement à un langage impératif, où l’on exécute une
suite d’instructions (ou de ‘commandes’). . .
. . . en Caml on évalue une expression
I
le résultat est une valeur
let double x = x+x
(* pas de "return x+x" *)
let f t = if t<0 then -t else double (t + (double 16))
let a = f 52
let
I
I
= print string "bonjour monde"
évaluation
expression −−−−−−→ valeur
toujours?
divergences (calcul qui ne termine pas): ⊥ valeur
indéfinie
la dénotation d’une expression est la valeur qui lui est associée
À propos des fonctions
I
en Caml, une fonction est une entité de première classe
on utilise la même syntaxe pour passer un entier ou une
fonction à une fonction
I
type t -> t’ valeur <fun> (-> appartient au langage des types)
I
I
I
I
égalité et fonctions Démo eq fun.ml
on n’a pas accès au code d’une fonction
une fonction est une valeur
curryfication (Haskell Curry, logique combinatoire)
I
deux versions d’une fonction à deux arguments:
I
I
fonction qui renvoie une fonction
let f x y = ...
présentation curryfiée
fonction qui prend un couple
let f (x,y) = ...
présentation décurryfiée
→ toutes les fonctions ont 1 argument
I
I
associativités:
a -> (b -> c)
fonction 6= constructeur
et
(f
x) y
Formalisons un peu tout cela
des choses au tableau
Évaluation: déclarations locales, stratégies, fonctions
I
comment évaluer
I
I
let x = e1 in e2 ?
remplacer x par e1 partout dans e2
let x = 3+4 in (x+1) * (x+2)
(3+4+1)*(3+4+2)
évaluer e1
v1, remplacer x par v1 dans e2,
et évaluer e2[v1/x]
(7+1)*(7+2), mais aussi
let u t = t+1 and v t = t+2
let f g = if (g 1)<0 then u else v
let x = f (fun h -> h-5) in x 12
u 12
13
I
en vrai, on travaille avec un environnement, qui associe v1 à x
I
le choix de la stratégie est-il influent?
I
“u 12” ci-dessus est ambigu:
que signifie évaluer une fonction?
I
I
let f x y = ... c’est let f = fun x y -> ...
fun fige le calcul let f x = (print int 12; x+2)
Modules
Agréger du code
I
dès qu’on programme un peu plus que factorielle, on a intérêt
à constituer des conglomérats
I
les enregistrements peuvent servir à regrouper des valeurs
(structures en C)
type prof = {
nom : string;
cours : string;
semestre : int;
annonce : unit -> string
type lib list = {
I
I
}
map : ’a list -> (’a->’b) -> ’b list
flatten : ’a list list -> ’a list
show : ’a list -> unit }
des données et du code
tout est côte à côte
pas de lien entre les champs de l’enregistrement
I
aller au-delà: les modules
Modules
I
les modules servent à
I
I
I
agréger du code
structurer un développement
alternatives aux modules:
I
I
I
I
moins sophistiqué: tuples, enregistrements
plus (?) sophistiqué: objets
module M = struct
typage
I
mettre ensemble
ce qui va ensemble
let x = 3
let f t = t+x
une manière de spécifier/commenter le code
type pos = string * int
let c : pos = "E",4
let f = fun x -> x
let f : int -> int = fun x -> x
I
I
type d’un module: signature
module type S = sig val f :
module M : S = struct ...end
int -> int
end
la possibilité de cacher est un thème central s’agissant de
modularité
I
l’abstraction favorise la modularité
end
Types dans les modules et types de modules
I
modules: valeurs et types
I
modules et types de modules (appelés signatures)
module M = struct
type t = int * string
let f c = (fst x)+1
end
:
module
module type S = sig
type t = int * string
val f : t -> int
end
signature
I
noter que “t fait le lien” dans S
I
majuscules des deux côtés (modules et signatures)
I
généralement, on définit S, puis on fait
module M : S = struct...end
on accède à f dans M en notant M.f
I
M.N.f modules à l’intérieur de modules
(espaces de nommage)
Cacher: types abstraits
de
module M = struct
type t = int * string
let f c = (fst x)+1
end
:
module type S = sig
type t = int * string
val f : t -> int
end
module M = struct
type t = int * string
let f c = (fst x)+1
end
:
module type S = sig
type t
val f : t -> int
end
à
I
t est un type abstrait
I
le module ne donne pas accès à l’implémentation de t
I
on peut aussi cacher une valeur en l’omettant dans la
signature
Des modules à partir d’autres modules
I
modules paramétrés
(* "espace ordonné" *)
module type EspaceOrd =
sig
type t
val ord : t->t->bool
end
I
I
module ABR (M:EspaceOrd) =
struct
type arbre = ...
let insere v a = .. M.ord ..
let supprime v a = ...
let parcourt f a = ...
...
end
,→ encore l’abstraction (cf. aussi fonct.ml)
petits exemples sur les modules Démo exs-modules.ml
un foncteur est un module paramétré (par un module)
module F (M: S) = struct
let f x = x+1
let g y z = (M.h y) + (M.g z)
end
I
I
I
I
F
M
S
–
est le foncteur qu’on est en train de définir
est le paramètre du foncteur
est une signature (définie plus haut
on pourrait mettre sig val g : bli val h : bla end)
il faut donner explicitement le type du module en paramètre
Projeter suivant des vues
module M =
( struct
type t = int ref
let create() = ref 0
let add x = x:=!x+1
let get x = if !x>0
then (x:=!x-1; 1)
else failwith "Empty"
end
sig
type t
val create : unit -> t
val add : t -> unit
val get : t -> int
end )
(* propriétaire *)
module type S1 =
sig
type t
val create : unit -> t
val add : t -> unit
end
(* utilisateur *)
module type S2 =
sig
type t
val get : t -> int
end
module Mprop = (M:S1)
module Mutil = (M:S2)
Modules et interfaces, donc
I
quand on définit un module, il a une interface par défaut
module M = struct...end
I
définir un module en indiquant explicitement une signature,
c’est “sceller” la signature sur le module
I
I
module type S = type t val f : int -> t end
module M1 : S = struct ...end
ou bien module M2 = (M:S)
un utilisateur de M1 ou M2 n’a pas le droit de savoir comment
t est implémenté
on peut utiliser with pour modifier une signature au vol, et
“ouvrir des fenêtres” dans le sceau qu’on a collé au module
module M : (S with type t = string) = struct
...end
I
exercice: lire et comprendre le fichier set.ml (librairie pour
les ensembles de Caml)
I
I
sur les machines élèves, ouvrir
/usr/lib/ocaml/3.09.2/set.ml
un foncteur pour faire les ensembles à partir d’un type ordonné
On est à l’étage
I
les modules et les signatures sont des constructions du
langage struct...end,
sig...end
I
I
cependant, les modules ne “vivent” pas avec les valeurs
I
I
I
I
pas de M;;
on ne peut passer de module à une fonction (mais à un
foncteur, oui)
pas de fun t -> (struct...end)
les modules habitent “ailleurs”
I
I
cela est loin d’être toujours le cas (“rien” en C, classes/objets
en Java, . . . )
notamment parce qu’ils contiennent des types
les modules et les modules paramétrés constituent un petit
calcul de fonctions ‘au-dessus’ de Caml
Modules et compilation séparée
I
modules et signatures peuvent être plaqués sur le découpage
en fichiers
I
I
I
machin.ml : module
machin.mli : signature
Machin : nom du module
NB: comme si on ajoutait struct/sig..end en début et fin de fichier
I
compilation des modules
I
I
I
I
ocamlc -c machin.mli
machin.cmi
ocamlc -c machin.ml
machin.cmo
ocamlc machin.cmo truc.ml -o hop
exécutable (truc utilise machin)
dans le toplevel de Caml
I
I
#use "machin.ml"
#load "machin.cmo"
hop, fichier
Modules: on n’a pas tout dit
I
des aspects du typage des modules
I
modules récursifs
I
génie logiciel: modules, objets, composants, . . .
I
modules et programmation répartie: comment implémenter les
types abstraits?
Retour au cours
I
I
évaluation
expression −−−−−−→ valeur
évaluation d’expressions arithmétiques simples
I
I
I
expressions e ::= N(k) | Pl(e1 , e2 ) | V (x) | Let(x, e1 , e2 )
évaluation e ⇓ v
on avance sur deux pistes
I
l’objet du discours
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
type t = 1111111111111111111111111111111111111111111111111
C of ..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
exception E
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
match e with
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
try e with
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
| E −> ..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
| C x −> 1111111111111111111111111111111111111111111111111
..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
raise E
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
fun x −> e
(e e’)
let x = e
let rec f = e
ref e
!
:=
;
print_int, ..
I
le discours
définitions par induction
sémantique opérationnelle (évaluation)
Le langage de programmation
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000
type t = 1111111111111111111111111111111111111111111111111
C of ..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
exception E
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
match e with
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
try e with
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
| E −> ..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000
| C x −> 1111111111111111111111111111111111111111111111111
..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
raise
E
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
fun x −> e
(e e’)
let x = e
let rec f = e
ref e
!
:=
;
print_int, ..
Aspects impératifs
I
on s’intéresse au “cœur” de Caml plus les références
ref
!
:= ;
I
approche par substitution:
let r = ref 1 in (r:=2; !r)
let x = ref 0
let f = function () -> (x := !x+1; !x)
I
autre chose
let g () = (x := 3* !x; !x)
let
I
= ( f (); g(); f() + g() )
quelle est la valeur de ref e ?
une localité / une adresse
Un peu de multimedia
I
extradiégétique
adjectif
1. Qui est extérieur à la narration.
Le narrateur omniscient est extradiégétique
2. Qui est extérieur à la diégèse, c’est-à-dire qui ne fait pas partie
de l’action ou qui n’est pas lié aux événements dans une œuvre
de fiction.
Dans cette scène du film, la musique est un son
extradiégétique car elle peut être entendue par les
personnages; c’est une musique d’ambiance pour le spectateur.
I
pour décrire l’exécution des programmes, il faut expliciter la
mémoire
I
on fait des effets de bord
modification de quelque chose “à côté” (une case mémoire,
l’écran, le clavier. . . )
Éliminer les constructions impératives
let f x =
let a = x + !y in
( z := !z+1; a + !z )
de
I
à
s : le store, la mémoire
I
I
let f x s =
let vy = read s y
let a = x + vy in
let vz = read s z
let s’ = modify s
let vz’ = read s’
(a + vz’, s’)
in
in
(z,vz+1) in
z in
un paramètre en plus
read : store -> addr -> value
modify: store -> (addr*value) -> store
addr : type des adresses (références)
ref e s’évalue en un addr
value : type des valeurs (p.ex., seulement int)
I
I
alloc:
store -> value -> addr*store
le store est l’“état du monde”
fonction d’une partie finie des adresses dans les valeurs
[r1 = 3; r2 = "toto"; r3 = 12]
I
l’évaluation d’une expression peut faire des effets de bord
un programme décrit un calcul qui est susceptible de modifier
l’état de la mémoire
Définition de la traduction
I
systématiser la chose: on définit une traduction
I
I
I
source: cœur de Caml + références
cible: cœur
plus précisément la traduction de e, notée [[e]], est de la forme
[[e]] = fun s -> ...(v,s’)
( [[e]] est un modificateur d’état)
définitions
[[52]] = ?
[[e1 + e2]] = ?
[[e1 e2]] = ?
[[e1 := e2]] =?
I
[[fun x -> e]] = ?
[[let x = e1 in e2]] = ?
[[!e]] = ?
[[x]] = ?
[[ref e]] = ?
exercice: traduire (et exécuter le cas échéant)
!t + 3
fun x -> (c := !c+1; !c*x)
let r = ref 32 in (r := !r *52; !r)
I
comment formaliser le fait que la traduction ne fait pas
n’importe quoi?
[[e1;e2]] = ?
Le point
ce qu’on a fait
I
modulo une implémentation du store
(dont il n’est pas difficile de se
convaincre qu’elle peut être écrite de manière purement fonctionnelle),
I
on a
montré que les constructions pour la partie impérative de
Caml redondent (en un certain sens)
manquent l’affichage, la saisie, l’écriture/lecture sur disque
I
sur le principe, on les traite similairement
I
I
I
I
I
une composante du store peut être une liste de caractères
envoyés à l’écran
print string "bonjour monde"
devient fun s -> ( (), s⊕"bonjour monde" )
let a = read int ()
devient let a = fun s -> ( k, sk )
tableaux: ' listes de références
détour par Haskell
I
I
I
langage pour la programmation fonctionnelle pure
évaluation paresseuse: on ne peut prévoir dans quel ordre les
expressions seront évaluées
il y a des entrées-sorties (IO) en Haskell
IO en Haskell
I
un programme qui fait des entrées sorties en Haskell a le type
IO truc
truc
cela s’interprète comme un calcul, qui,
lorsqu’il sera exécuté, fera des entrées
sorties, et produira du truc
I
I
I
IO truc
monde
monde
ainsi read string : IO string
et print string : string -> IO unit
le bout de code en question peut être vu comme un script (qui
attend d’être lancé – du truc latent)
en Haskell, on met ces scripts bout à bout en se servant d’une
notation qui rappelle le C
let echo = do { l <- read string ; print string l }
readFile : string -> IO string
do { cts <- readFile filename ;
getTests : string -> string list
let tests = getTests cts in ...}
NB: getTests (readFile filename) n’est pas autorisé
IO en Haskell, suite
I
quand est-ce qu’on arrête de faire ordinateur=radiateur?
I
I
une fonction qui fait de l’I/O n’est pas une fonction au sens
des maths
fun s -> .. est sous le tapis, mais pas visible
impossible de dupliquer ou de jeter à la poubelle le monde, s
(rôle du système de types de Haskell)
I
le compilateur de Haskell malaxe le programme source dans
tous les sens
mais il est contraint par le câblage
I
I
I
I
I
le monde est juste un témoin que se transmettent les fonctions
(celles qui font de l’IO)
impossible d’intervertir un read et un modify, par exemple
dépendance de données
quand il en a fini, on peut se débarasser du monde
autres utilisations de ce type de transformation: raisonner sur
les programmes impératifs dans un monde purement
fonctionnel
Bilan: ce qui vient d’être fait
I
la question du partage
I
pour traiter let r = ref 1 in (r:=2; !r), on a introduit
le store, ce qui a ajouté une indirection (qui permet que les
deux usages de r pointent à la même adresse)
r pointe vers une case mémoire (mutable), mais l’adresse
pointée par r, que l’on ne voit pas, est immutable
I
I
cf. aussi avec les tableaux de tableaux en Caml (trop de
partage)
le statut de la transformation qui a été définie
I
I
un “style de programmation” pour faire de l’impératif sans
constructions impératives
description formelle / technique de compilation
Les preuves par induction
I
rappel: règles d’inférence
I
I
I
prémisse 1 . . . prémisse k
conclusion
zéro prémisse = axiome
on définit une relation R(e, v , t) par des règles d’inférence:
toutes les règles se terminent par quelque chose de la forme
R(e, v , t)
b ⇓ true
c, σ ⇓ σ 0
while b do c, σ 0 ⇓ σ 00
while b do c, σ ⇓ σ 00
I
I
étonnant, non?
ça ‘boucle’ dans la règle d’inférence, mais une dérivation est
un objet fini
Une prise de contact avec le système Coq
I
I
Coq: assistant à la preuve
permet de développer des preuves de manière interactive
outils
I
I
I
http://coq.inria.fr
coqide pour éditer des preuves Coq
démonstration
I
I
ind-types.v
petit.v
I
deux mondes
I
Set
les objets ‘informatiques’
Coq, c’est beaucoup plus
I
I
I
calculer arbres.v
extraire racine.v
...
suffixe .v pour les fichiers Coq
Prop
les propriétés
prochain TP: sur machine, du Coq
Coq et les preuves par induction
I
j’espère que les idées commencent à rentrer
I
Coq préfère les choses curryfiées
trans-curry.v
Le langage de programmation
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000
type t = 1111111111111111111111111111111111111111111111111
C of ..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
exception E
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
match e with
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
try e with
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
| E −> ..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000
| C x −> 1111111111111111111111111111111111111111111111111
..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
raise
E
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
fun x −> e
(e e’)
let x = e
let rec f = e
ref e
!
:=
;
print_int, ..
La pile
I
un programme Caml qui s’exécute, c’est “le plus souvent” une
fonction qu’on applique à un argument
I
les appels aux sous-fonctions (et en particulier les appels
récursifs) s’empilent
(ceci n’est pas propre à Caml)
I
cas particulier: récursivité terminale: le premier appel récursif
est la dernière chose que fait la fonction
I
I
I
let rec f = .. (g (f t)) non
let rec f = .. i * (f t) non
Démo rec term.ml
Rôle des exceptions, exemple
let prod = List.fold left (fun k y -> k*y) 1
(* prod [] = 1 *)
let rec prod = function
| [] -> failwith "prod: liste vide"
| [x] -> x
| x::xs -> if x=0 then 0 else x*(prod xs)
exception Zero
let prod l =
let rec prod aux = function
| [] -> failwith "prod: liste vide"
| [x] -> x
| x::xs -> if x=0 then raise Zero else x*(prod aux xs)
in try prod l with Zero -> 0
on court-circuite le “return”
while (p++){
..
en C
}
if (x==0) break;
..
Mimer les exceptions
Démo
test-exc.ml
source: Caml avec une exception (Exc of int)
destination: Caml avec un type somme
type ’a res = E of int | V of ’a
[[32]] = ?
[[e1+e2]] = ?
[[x]] = ?
[[fun x -> e]] = ?
[[let x = e1 in e2]] = ?
[[e1 e2]] = ?
[[raise (Exc e)]] = ?
[[try e1 with | Exc x -> e2]] = ?
Après les effets de bord, le contrôle
I
transformateurs d’état
I
I
pour éliminer les aspects impératifs, on passe aux fonctions
l’état courant de la mémoire: le “présent”
flot du calcul
I
dans un langage purement fonctionnel, le contrôle est la
plupart du temps implicite, le programmeur n’y a pas
directement accès
. . . ou presque: les exceptions servent à dévier le flot
I
le contrôle est ‘beaucoup plus explicite’ dans un langage
impératif
I
I
I
structure des programmes (;)
instructions de contrôle (return break while goto. . . )
idée des continuations: expliciter le contrôle en manipulant
le futur du calcul
Continuations – premiers exemples
I
soit la fonction let f x y = x*y
sa version avec continuation est
let f x y k = k (x*y)
,→ on passe le résultat à k
I
I
ainsi,
ou encore
let g a b k =
let t = 2*a in
k (t*t+b)
let rec search a l k =
if is empty l then k false
else if (a = head l)
then k true
else search a (tail l) k
Continuations – du côté de l’appelant
let toto x y =
(titi x (x+1))*y
let toto x y k =
let k’ = fun v -> k (v*y) in
titi x (x+1) k’
ou encore
let toto x y k =
titi x (x+1) (fun v -> k (v*y))
on passe la main à titi, dont le résultat sera multiplié par y
exemple d’appel:
toto 3 5 (fun i -> (print int i;print newline()))
Continuations: chercher dans les arbres
let rec search a t =
if is empty t then false
else if (val node t) = a
then true
else if (search a (left t))
then true
else (search a (right t))
devient
let rec search a t k =
if is empty t then (k false)
else if (val node t) = a then (k true)
else
search a (left t) (fun res ->
if res then (k true)
else (search a (right t) k))
Un peu de recul
I
à chaque fois que l’on fait let f a b k = ...(k r) ...
à la place de let f a b = ...r...
I
I
I
les continuations sont une affaire de style
I
I
I
I
on remplace une valeur par un appel de fonction
le k r ‘remplace’ return r (cf. en C)
ce style consiste à ‘réifier’ le futur du calcul
on choisit parmi des destins
“banalisation de l’héroı̈sme”
on ne fait que des appels de fonctions (pas de jump, goto)
une vision uniformisée des opérateurs de contrôle (exceptions,
itérateurs, . . . )
I
on peut manipuler plusieurs futurs possibles, et ainsi parler
d’exceptions
Continuations et exceptions
exception Found
let rec search a t =
if is empty t then false
else if (val node t) = a
then true
else if (search a (left t))
then true
else (search a (right t))
I
let rec search a t =
if is empty t then false
else if (val node t)=a
then raise Found
else if search a (left t)
then false
else search a (right t)
deux continuations: futur normal, futur exceptionnel
let search a t k =
let rec aux a t break k0 =
if (is empty t) then (k0 false)
else if (val node t) = a then (break true)
else aux a (left t) break (fun res -> aux a (right t) break k0)
in aux a t k k
I
ou, plus concis:
let search a t break =
let rec aux t k =
if (is empty t) then (k false)
else if (val node t) = a then (break true)
else aux (left t) (fun -> aux (right t) k)
in aux t break
Exceptions à l’aide de continuations
source: Caml avec une exception
destination: Caml ‘tout court’
[[32]]
[[fun
[[let
[[try
exception Exc of int
= fun (k,kE) -> ?
[[e1+e2]] = ?
x -> e]] = ?
[[x]] = ?
[[e1 e2]] = ?
x = e1 in e2]] = ?
[[raise (Exc e)]] = ?
e1 with | (Exc x) -> e2]] = ?
Contrôle et continuations: itérateurs
I
les exceptions sont une forme de contrôle, les itérateurs
(constructions impératives pour l’itération) en sont une autre
while test do body done
let rec do while test body k =
if test()
then body (fun () -> do while test body k)
else k()
Démo
I
do while cont.ml
typage:
val do while :
(unit->bool) -> ((unit -> ’a) -> ’a) -> (unit -> ’a) -> ’a = <fun>
|
{z
}
|
{z
}
|
{z
}
test
body
k
Des break dans les while
I
en C, l’instruction break permet de sortir directement d’une
boucle while (indépendamment de la condition booléenne
dudit while)
I
légère modification:
let rec do while test body k =
if test()
then body (fun () -> do while test body k)then body k (fun () ->
do while test body k)
else k()
I
on passe k à body
I
I
ici, un k() dans body joue le rôle du break en C
noter que le type de body change
I
I
un argument de plus
futur “normal”, futur en cas de sortie brutale
même idée que pour les exceptions
Continuations et compilation
Démo prodprimes.ml
un style proche du langage machine
let rec prodprimes cps (n,c) =
if n=1 then c 1 else
let k b =
if b then
let j p =
let a = n*p in c a
and m=n-1 in
prodprimes cps (m,j)
else
let h q = c qlet h q = c
qlet h q = c q
and i=n-1 in
prodprimes cps (i,h)
in
isprime (n,k)
b p a m q i
noms temporaires
(registres)
c k j h: continuations
adresses où “sauter”
h q = c q
optimisation: raccourci
else
let i = n-1 in
prodprimes cps (i,c)
in ...
Compilation par continuations – principes
I
les arguments “de travail” d’une fonction sont atomiques
→ registres, les arguments sont prêts
I
autres arguments: une ou plusieurs continuations
I
,→ des “bouts de code”
I
I
I
élémentaires
purement fonctionnels
tous les appels sont terminaux: une fonction “passe toujours
la main”: pas besoin de pile
CPS
I
auto-compilation: mise sous forme continuation passing style
I
source: Caml
destination: Caml
définition: la traduction vue précédemment, kE en moins
I
on change juste le style du programme
I
[[1927]] = fun k -> k 1927
I
I
I
I
...
aucune fonction ne renvoie directement son résultat
récursivité terminale
moins lisible / plus simple à exécuter
on peut compiler un langage fonctionnel en travaillant sur la
forme CPS (continuation passing style) des termes
I
A. Appel, “Compiling with continuations”, CUP, 1992
I
la forme CPS est aux langages fonctionnels ce que SSA (single
static assignment) est aux langages impératifs
ce fut le cas de SML
I
I
I
formalisme intermédiaire vers lequel sont traduits les
programmes source
équivalence entre les deux formalismes [Kelsey95]
utilisation des continuations pour représenter une unité de flot
— implémentation de librairies pour le parallélisme (threads)
Continuations et typage
I
I
typage:
# let f x y k = k (x+y);;
val f : int -> int -> (int -> ’a) -> ’a = <fun>
I
tout dépend d’un ’a : type retourné par le futur
I
cf. le type de raise : exn -> ’a
(le contexte où l’exception va être rattrapée est inconnu)
si on développe un programme qui doit boucler (interprète,
serveur sur le web, système d’exploitation), on peut donner le
type void au résultat, en ayant posé
type void
(* type abstrait *)
Organisation
I
la semaine prochaine
TD (et pas TP)
salles à confirmer (A2, B2)
I
le vendredi 6 novembre, 8h00-10h00
partiel
documents autorises: version imprimée des transparents
(pdfnup), notes de cours, sujets et notes de TP/TD
Le langage de programmation
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000
type t = 1111111111111111111111111111111111111111111111111
C of ..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
exception E
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
match e with
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
try e with
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
| E −> ..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000
| C x −> 1111111111111111111111111111111111111111111111111
..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
raise
E
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
fun x −> e
(e e’)
let x = e
let rec f = e
ref e
!
:=
;
print_int, ..
Types somme et filtrage
Types somme et filtrage
I
structures de données habituelles en informatique
Démo binarb.ml
comment est-ce que ça se programme?
I
I
I
version cambouis
version cosmique
correspondance entre une définition de type somme et les
grammaires
type ar = Const of int | Plus of ar*ar
| Mult of ar*ar | IfEqZero of ar*ar*ar
I
I
définir un langage de programmation, les types, les formules en
logique, . . .
programmer avec
I
I
structures de données, p.ex., pour un compilateur
raisonner dessus (faire des preuves)
Formes du filtrage
I
le filtrage, c’est revenir à la définition du type somme: un cas
par constructeur
| x::y::l -> ... c’est
“| x::xs -> (match xs with | y::l -> ...)”
| Div(a,b) when b>0 ->
c’est
“| Div(a,b) -> if b>0 then...”
Agnostos Theos
| -> ...
le sucre syntaxique n’est pas ce qui nous passionne le plus
I
le “vrai truc”, c’est
| [] -> ...
| x::xs -> ...
I
I
comment coder les éléments d’un type somme?
comment coder le filtrage sur un élément appartenant à un
type somme?
En supplément des douze dieux principaux et
d’innombrables divinités mineures, les grecs anciens
adoraient une divinité nommée Agnostos Theos, ce qui
signifie le dieu inconnu. A Athènes, il y avait un temple
dédié spécialement à ce dieu et de nombreux athéniens
juraient ”par le nom du dieu inconnu”. Apollodore,
Philostrate et Pausanias écrivirent à propos de ce
Agnostos Theos. Ce dieu inconnu n’était pas une divinité
spécifique, mais une marque substitutive, pour n’importe
quel dieu ou divinité qui existait à l’époque mais dont le
nom et la nature n’avaient pas été révélés aux athéniens
et aux monde grec en général.
Types somme et filtrage, version cambouis
sans types sommes et sans match...with
Démo binarb record.ml
I
les enregistrements peuvent en principe être remplacés par des
produits (n-uples)
I
on a le droit aussi de rendre les champs mutables
I
presque ce que l’on ferait en C, presque ce qui tourne
vraiment “en dessous”
struct arb = {int valeur; struct arb *gauche;
struct arb *droite};
en C:
- noeud singleton alloue de la mémoire (malloc)
- une feuille est représentée par un pointeur nul
Types somme: tout n’a pas été dit
I
il existe une version ‘cosmique’ de la programmation des types
de données et de leur manipulation dans le cœur fonctionnel
de Caml ,→ plus tard dans le cours
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
type t = 1111111111111111111111111111111111111111111111111
C of ..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
exception E
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
match e with
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
try e with
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
| E −> ..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
| C x −> 1111111111111111111111111111111111111111111111111
..
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
raise E
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000
fun x −> e
(e e’)
let x = e
let rec f = e
ref e
!
:=
;
print_int, ..
I
décrire et étudier le cœur fonctionnel:
le λ-calcul
Téléchargement