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