Sémantique opérationnelle

Documents pareils
length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

Classes et Objets en Ocaml.

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Recherche dans un tableau

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

Cours 1 : La compilation

Fonctions de deux variables. Mai 2011

Présentation du langage et premières fonctions

Une dérivation du paradigme de réécriture de multiensembles pour l'architecture de processeur graphique GPU

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Génie Logiciel avec Ada. 4 février 2013

IRL : Simulation distribuée pour les systèmes embarqués

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Machines virtuelles fonctionnelles (suite) Compilation ML Java

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Correction Code nécessaire à la compilation : let bs ="\\" let nl = "\n" ;; let appliquer = List.map ;; (* affichage d'un noeud *)

Application 1- VBA : Test de comportements d'investissements

ALGORITHMIQUE ET PROGRAMMATION En C

Traduction des Langages : Le Compilateur Micro Java

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Programmation. fonctionnelle, impérative, logique et orientée objet

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

Principes des langages de programmation INF 321. Eric Goubault

Merise. Introduction

Premiers Pas en Programmation Objet : les Classes et les Objets

Programmation avec des objets : Cours 7. Menu du jour

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.


Lambda-calcul et langages fonctionnels

Examen d informatique première session 2004

Gestion mémoire et Représentation intermédiaire

TRIGONOMETRIE Algorithme : mesure principale

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Master IMA - UMPC Paris 6 RDMM - Année Fiche de TP

modules & compilation

Initiation à la programmation en Python

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test


EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

1.6- Génération de nombres aléatoires

Corrigé des TD 1 à 5

Java Licence Professionnelle CISII,

TP3 : Manipulation et implantation de systèmes de fichiers 1

Notes du cours MTH1101 Calcul I Partie II: fonctions de plusieurs variables

Examen Médian - 1 heure 30

Algorithmique et Programmation, IMA

Les processus légers : threads. Système L3, /31

Logiciel de base. Première année ENSIMAG

Programmation en Caml pour Débutants

Plan du cours : Zippers. Des fonctions sur les listes avec position. Des fonctions sur les listes avec position

Java 1.5 : principales nouveautés

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Reconstruction de bâtiments en 3D à partir de nuages de points LIDAR

I. Introduction aux fonctions : les fonctions standards

Les chaînes de caractères

Les processus 2/54. Qu est-ce qu un processus? 3(6)/54. Se souvenir 1(1)/54. Le système de fichiers (exemple du disque dur)

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Cours de Programmation 2

Rappels Entrées -Sorties

Package Java.util Classe générique

Organigramme / Algorigramme Dossier élève 1 SI

Algorithmique, Structures de données et langage C

Chapitre 5 : Flot maximal dans un graphe

TP, première séquence d exercices.

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Conventions d écriture et outils de mise au point

Initiation à l algorithmique

Les algorithmes de base du graphisme

Rappel sur les bases de données

Quatrième partie IV. Test. Test 15 février / 71

(Exemple ici de calcul pour une Ducati 748 biposto, et également pour un S2R1000, équipé d un disque acier en fond de cloche, et ressorts d origine)

Qualité du logiciel: Méthodes de test

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Programmation en Java IUT GEII (MC-II1) 1

Direction de la sécurité sociale. Personne chargée du dossier : Huguette Hatil. La ministre des solidarités et de la cohésion sociale

Thèmes et situations : Personnel et législation sociale dans l entreprise. Fiche pédagogique

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Séquence 3. Expressions algébriques Équations et inéquations. Sommaire

Arrêtons. «Article 11

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

DUT Techniques de commercialisation Mathématiques et statistiques appliquées

Table des matières. Introduction

Historisation des données

Introduction à R. Florence Yerly. Dept. de mathématiques, Université de Fribourg (CH) SP 2011

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Solutions du chapitre 4

Introduction au langage C

Algorithmique & programmation

Claude Delannoy. 3 e édition C++

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Transcription:

Evaluation d'une expression Sans variable libre Vu dans le châpitre 2 Avec variables libres #pi *. r *. r ;; #let f = fun x -> if v > 3*2 then x+3 else x*x*3 + v;; Les variables qui apparaissent libres dans l'expression (pi et r dans la première et v dans la seconde) doivent avoir été définies au préalable. L'interpréteur doit trouver dans l'environnement les valeurs auxquelles elles sont liées.

Les notions de base Liaison C'est un couple (i, v) ou i est un identificateur et v une valeur. On dit que i est liee a v. Environnement C'est une liste de liaisons Environnement initial: E 0 C'est l'environnement chargé quand on lance Ocaml. Définition globale Rajoute une liaison à l'environnement courant

Exemple Environnement: E 0 #let pi = 3.14 ;; (pi, 3.14) :: E 0 # let r = 2.1 ;; (r, 2.1) :: (pi, 3.14) :: E 0 #let s = pi*.r*.r ;; (s, 13.8474) :: (r, 2.1) :: (pi, 3.14) :: E 0 #let pi = 3.1416 ;; (pi, 3.1416) :: (s, 13.8474) :: (r, 2.1) :: (pi, 3.14) :: E 0 L'ancienne valeur de pi n'est plus accessible # pi;; - : float = 3.1416

Définitions en parallèle Toutes leurs évaluations se font dans l'environnement courant Celui-ci est ensuite modifié # let x = 0;; #let x = 3 and y= x+1;; x : int = 3 y : int = 1 Environnement courant E (x, 0) :: E (x,3) :: (y,1) :: (x, 0) :: E

Définitions locales Modifient momentanément l'environnement C'est dans cet environnement modifié que se fait l'évaluation de l'expression sur laquelle elles portent In fine, l'environnement est inchangé

Environnement courant: #let x = 10 in x+1;; Définitions locales: exemples (x,3) :: (y,1) :: (x, 0) :: E x+1 évaluée dans (x, 10) :: (x,3) :: (y,1) :: (x, 0) :: E - : int = 11 Environnement courant: (x,3) :: (y,1) :: (x, 0) :: E #let x=x+1 and y=x+2 in x+y;; x+1 et y évalués dans l'environnement courant x+y évalué dans (x,4) ::(y,5):: (x,3) :: (y,1) :: (x, 0) :: E - : int = 9 Environnement courant: (x,3) :: (y,1) :: (x, 0) :: E

Définitions locales: exemples Environnement courant: (x,3) :: (y,1) :: (x, 0) :: E #let x = x+1 in let y = x+2 in x+y;; x+1 évaluée dans l'environnement courant y est évalué dans (x, 4) :: (x,3) :: (y,1) :: (x, 0) :: E x+y évaluée dans (y,6) :: (x, 4) :: (x,3) :: (y,1) :: (x, 0) :: E - : int = 10 Environnement courant: (x,3) :: (y,1) :: (x, 0) :: E

Evaluation des fonctions Fermetures Soit une fonction non récursive définie par: let f = fun x -> corps Châpitre 2 : fun x -> corps est sous forme réduite et peut donc être considéré comme la valeur de f. Ceci est (presque) vrai en l'absence de VL (variables libres) (dans les implantations corps est simpifié) Cette définition pourrait ainsi rajouter à l'environnement courant la liaison : (f, fun x -> corps) Quid des définitions de fonctions avec variables libres? Quid des définitions récursives?

Evaluation des fonctions Fermetures Exemple #let v = 2;; #let f = fun x -> if v > 3*2 then x+3 else x*x*3 + v;; VL(corps) : v, valeur à chercher dans l'environnement E La valeur de f est un couple Let f = fun x -> corps < fun x -> simpl(corps), E > simpl(corps): simplification de corps E: environnement au moment de la définition de f

Evaluation des fonctions Nouvel environnement: Fermetures let f = fun x -> corps (f, <fun x -> simpl(corps), E> ) :: E Fermeture Car toute VL de simpl(corps) autre que x est liée dans E. Ce couple ne contient aucune VL dont la valeur n'est pas définie. En ce sens, il est fermé. On n'évalue pas mais on enregistre dans la fermeture tous les renseignements pour évaluer ultérieurement, au moment de l'application à un argument.

Evaluation des fonctions Liaisons statiques (ou lexicales) des VL Environnement courant : E 0 #let v = 2;; (v,2) :: E 0 #let f x = if v > 3*2 then x+3 else x*x*3 + v;; (f, < fun x -> x*x*3+v, (v,2)::e 0 >) :: (v,2)::e 0 #let v = 100;; (v,100) :: (f, < fun x -> x*x*3+v, (v,2)::e 0 >) :: (v,2)::e 0 Le v de corps f sera toujours évalué dans l'env. tel qu'il était au moment de la définition de f (enregistré dans la fermeture). La rédéfiniton ultérieure de v n'affecte en rien la valeur de f : liaison statique

Evaluation des applications Evaluation par valeur Evaluation de (e 1 e 2 ) dans l'environnement E Evaluation de e 1 dans E : v 1 = < fun x ->corps, E' > Evaluation de e 2 dans E : v 2 Evaluation de corps dans (x, v 2 ) :: E' Dans corps, x est remplacé par v 2 et les autres variables par leur valeur dans E' E est inchangé

Evaluation des applications Evaluation par valeur E = (v,100) :: (f, < fun x -> x*x*3+v, (v,2)::e 0 >) :: (v,2):: E 0 #f (2*v);; - : int = 120002 2*v évalué dans E : 200 f évaluée dans E : < fun x -> x*x*3+v, (v,2)::e 0 > x*x*3+v dans (x,200) :: (v,2)::e 0 : 200*200*3+2 = 12002

Evaluation des applications Evaluation par valeur E = (v,100) :: (f, < fun x -> x*x*3+v, (v,2)::e 0 >) :: (v,2):: E 0 #f (2*v);; - : int = 120002 2*v évalué dans E : 200 f évaluée dans E : < fun x -> x*x*3+v, (v,2)::e 0 > x*x*3+v dans (x,200) :: (v,2)::e 0 : 200*200*3+2 = 12002

Evaluation des applications Evaluation par nom de (e 1 e 2 ) dans l'environnement E Evaluation de e1 dans E : v 1 = < fun x ->corps, E'> Evaluation de corps dans (x, <e2, E>) :: E' Ce qui ne change pas: Les VL de corps autres que x sont évaluées dans E' Ce qui change: Les valeurs des variables sont des fermetures car elles ne sont pas évaluées immédiatement. On évalue corps avant e2 la valeur de e 2 dans l'environnement courant est calculée à chaque occurrence de x dans corps

Evaluation des fonctions récursives Etude d'un exemple Dans l'environnement E' on définit: #let rec fact = fun n -> if n = 0 then 1 else n * fact(n-1);; Par analogie avec les fonctions non récursives, la valeur de fact serait la fermeture définie par: @_fact = < fun n -> if n=0 then 1 else n * fact(n-1), E' > Mais le corps contient une variable libre: fact, qui n'est pas dans E'. Le couple n'est pas fermé et on ne saura où trouver la valeur de fact quand on évaluera le corps lors d'une application.

Evaluation des fonctions récursives Etude d'un exemple Dans l'environnement E' on définit: #let rec fact = fun n -> if n = 0 then 1 else n * fact(n-1);; @_fact = < fun n -> if n=0 then 1 else n * fact(n-1), E' > Exemple (fun n -> if n=0 then 1 else n * fact(n-1)) 2 Dans le corps, n est remplacé par 2. Mais par quoi est remplacé fact? E' ne rien là-dessus!

Evaluation des fonctions récursives Etude d'un exemple Dans l'environnement E' on définit: #let rec fact = fun n -> if n = 0 then 1 else n * fact(n-1);; @_fact = < fun n -> if n=0 then 1 else n * fact(n-1), E' > Il est nécessaire de rajouter dans l'environnement de la fermeture... la liaison de la variable fact qui est : (fact,?)

Evaluation des fonctions récursives Etude d'un exemple Dans l'environnement E' on définit: #let rec fact = fun n -> if n = 0 then 1 else n * fact(n-1);; @_fact = < fun n -> if n=0 then 1 else n * fact(n-1), E' > Il est nécessaire de rajouter dans l'environnement de la fermeture... la liaison de la variable fact qui est : (fact, @_fact)

Evaluation des fonctions récursives Etude d'un exemple Dans l'environnement E' on définit: #let rec fact = fun n -> if n = 0 then 1 else n * fact(n-1);; @_fact = < fun n -> if n=0 then 1 else n * fact(n-1), E' > Il est nécessaire de rajouter dans l'environnement de la fermeture... la liaison de la variable fact qui est : (fact, @_fact) On obtient: @_fact = < fun n -> if n=0 then 1 else n * fact(n-1), (fact, @_fact)::e' >

Evaluation des fonctions récursives Etude d'un exemple Dans l'environnement E' on définit: #let rec fact = fun n -> if n = 0 then 1 else n * fact(n-1);; @_fact = < fun n -> if n=0 then 1 else n * fact(n-1), E' > Il est nécessaire de rajouter dans l'environnement de la fermeture... la liaison de la variable fact qui est : (fact, @_fact) On obtient: @_fact = < fun n -> if n=0 then 1 else n * fact(n-1), (fact, @_fact)::e' > Définition circulaire!

Evaluation des fonctions récursives Etude d'un exemple Dans l'environnement E' on définit: #let rec fact = fun n -> if n = 0 then 1 else n * fact(n-1);; On obtient donc un nouvel environnement Avec E = (fact, @_fact) :: E' @_fact = < fun n -> corps, (fact, @_fact) :: E' > I.E. @_fact = < fun n -> corps, E > en posant corps = if n = 0 then 1 else n * fact(n-1)

Evaluation des fonctions récursives Etude d'un exemple @_fact = < fun n -> corps, (fact, @_fact):: E' > Il s'agit d'un terme infini: On peut remplacer @_fact dans la fermeture par sa valeur (on déplie) et on obtient: @_fact = < fun n -> corps, (fact, < fun n -> corps, (fact, @_fact):: E' >):: E' >

Evaluation des fonctions récursives Etude d'un exemple @_fact = < fun n -> corps, (fact, @_fact):: E' > @_fact = < fun n -> corps, (fact, < fun n -> corps, (fact, @_fact):: E' >):: E' > En redépliant, on obtient:

Evaluation des fonctions récursives Etude d'un exemple @_fact = < fun n -> corps, (fact, @_fact):: E' > @_fact = < fun n -> corps, (fact, < fun n -> corps, (fact, @_fact):: E' >):: E' > En redépliant, on obtient: @_fact = < fun n -> corps, (fact, < fun n -> corps, (fact, < fun n -> corps, (fact, @_fact):: E' >) :: E' >) :: E' >

Evaluation des fonctions récursives Etude d'un exemple L'idée est que ces termes circulaires sont dépliés autant de fois que nécessaire à l'évaluation d'un application, pas plus, pas moins.

Evaluation des fonctions récursives Evaluation de (fact 2) dans E. -> Evaluation de fact dans E: -> @_fact = <fun n-> if n=0 then 1 else n*fact(n-1), E> -> Evaluation de n*fact(n-1) dans E2 = (n,2)::e -> Evaluation de fact (n-1) dans E2 -> Evaluation de n-1 dans E2 -> 1 -> Evaluation de fact dans E2 - > @_fact -> Evaluation de n*fact(n-1) dans E1 = (n,1)::e E1 est empile sur E2

Evaluation des fonctions récursives -> Evaluation de fact (n-1) dans E1 = (n,1)::e -> Evaluation de (n-1) dans E1 -> 0 -> Evaluation de fact dans E1 -> @_fact -> Evaluation de if n=0 then 1 else n*fact(n-1) dans E0 = (n,0)::e E0 est empile sur E1 -> 1 E0 est dépilé. On se retrouve dans E1 -> Evaluation de n -> 1 -> Evaluation de 1*1 ->1 E1 est depilé. On se retrouve dans E2 -> Evaluation de n ->2 -> Evaluation de 2*1 = 2