Paradigmes et Interprétation. Types

Documents pareils
Machines virtuelles fonctionnelles (suite) Compilation ML Java

Cours de Programmation 2

Programme Compte bancaire (code)

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

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

Présentation du langage et premières fonctions

Corrigé des exercices sur les références

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Chapitre VI- La validation de la composition.

TP1 : Initiation à Java et Eclipse

Chapitre 10. Les interfaces Comparable et Comparator 1

# 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>

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Projet de programmation (IK3) : TP n 1 Correction

Premiers Pas en Programmation Objet : les Classes et les Objets

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Introduction à l algorithmique et à la programmation M1102 CM n 3

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

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

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Conventions d écriture et outils de mise au point

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Java 1.5 : principales nouveautés

OCL - Object Constraint Language

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

STAGE IREM 0- Premiers pas en Python

TD3: tableaux avancées, première classe et chaînes

Objets et Programmation. origine des langages orientés-objet

Algorithmique et Programmation, IMA

Analyse de sécurité de logiciels système par typage statique

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

F. Barthélemy. 17 mai 2005

Recherche dans un tableau

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

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

Cours 1 : La compilation

Classes et Objets en Ocaml.

Algorithmique et programmation : les bases (VBA) Corrigé

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

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

Initiation à l algorithmique

TP 1. Prise en main du langage Python

Sommaire. 2 LINQ to Objects

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

L exclusion mutuelle distribuée

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

Principes des langages de programmation INF 321. Eric Goubault

Examen Médian - 1 heure 30

Vérification de programmes et de preuves Première partie. décrire des algorithmes

Module http MMS AllMySMS.com Manuel d intégration

Un ordonnanceur stupide

Compilation (INF 564)

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Environnements de développement (intégrés)

ACTIVITÉ DE PROGRAMMATION

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

Plan du cours. Historique du langage Nouveautés de Java 7

Programmer en JAVA. par Tama

Organigramme / Algorigramme Dossier élève 1 SI

Introduction à la programmation concurrente

RÉALISATION D UN SITE DE RENCONTRE

OpenPaaS Le réseau social d'entreprise

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Enseignement secondaire technique

Cours Informatique Master STEP

Vérification formelle de la plate-forme Java Card

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

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

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

(Third-Man Attack) PASCAL BONHEUR PASCAL 4/07/2001. Introduction. 1 Domain Name Server. 2 Commandes DNS. 3 Hacking des serveurs DNS

Java Licence Professionnelle CISII,

IMAGES NUMÉRIQUES MATRICIELLES EN SCILAB

Paris Airports - Web API Airports Path finding

Génération de code à partir d une spécification B : Application aux bases de données

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

La gestion du son en AS3 est logique si on se réfère au fonctionnement d'une table de mixage audio!

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

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

DG-ADAJ: Une plateforme Desktop Grid

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

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

Cours d algorithmique pour la classe de 2nde

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

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

1. Structure d'un programme FORTRAN 95

La programmation orientée objet Gestion de Connexions HTTP Manipulation de fichiers Transmission des données PHP/MySQL. Le langage PHP (2)

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

Jade. Projet Intelligence Artificielle «Devine à quoi je pense»

Routage AODV. Languignon - Mathe - Palancher - Pierdet - Robache. 20 décembre Une implémentation de la RFC3561

Plateforme PAYZEN. Définition de Web-services

4 Exemples de problèmes MapReduce incrémentaux

Package Java.util Classe générique

Utilisation d objets : String et ArrayList

Corrigé des TD 1 à 5

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

Gestion mémoire et Représentation intermédiaire

Application 1- VBA : Test de comportements d'investissements

Transcription:

Types Julien Provillard http://www.i3s.unice.fr/~provilla/paradigmes/ julien.provillard@unice.fr

TYPES 2

Validité des expressions Question : Quelle est la valeur de l expression suivante? Réponse : 3 {+ 1 2} Question : Quelle est la valeur de l expression suivante? {+ lambda 1 2} Réponse erronée : L évaluation produit une erreur. Réponse : {+ lambda 1 2} n est pas une expression. 3

<Expr> ::= true false <Num> <Sym> {+ <Expr> <Expr>} {* <Expr> <Expr>} {= <Expr> <Expr>} {lambda {<Sym>*} <Expr>} {<Expr> <Expr>*} {if <Expr> <Expr> <Expr>} Grammaire 4

Validité des expressions Question : Le code suivant est-il une expression? {{lambda {} 1} 2} Réponse erronée : Non Réponse : Oui, le code est bien conforme à la grammaire. Question : Quelle est la valeur de l expression? Réponse : 1 Meilleur réponse : L expression devrait être rejetée. 5

Validité des expressions L expression {{lambda {} 1} 2} est mal formée : la fonction {lambda {} 1} n attend pas d argument. Partons du principe que l interpréteur rejette les expressions mal formée. Question : Quelle est la valeur de l expression suivante? {{lambda {} 1} 2} Réponse : Aucune, l expression est mal formée. 6

Validité des expressions Question : L expression suivante est-elle bien formée? {+ {lambda {} 1} 2} Réponse : Oui, il n y a pas d application de fonction. Question : Quelle est la valeur de l expression? Réponse : Aucune, une erreur se produit interp : not a number Une addition ou une multiplication contenant une lambda-expression sera également considérée comme mal formée. 7

Validité des expressions Question : L expression suivante est-elle bien formée? {+ {lambda {} 1} 2} Réponse : Non Question : L expression suivante est-elle bien formée? {+ {{lambda {x} x} 1} 2} Réponse : Cela dépend de ce que l on entend par ne pas contenir de lambda-expression. Aucune sous-expression n est une lambda-expression -> Non Les arguments ne sont pas des lambda-expressions -> Oui Le résultat de l expression étant 3, c est bien entendu la deuxième interprétation qui convient. 8

Validité des expressions Question : L expression suivante est-elle bien formée? {+ {{lambda {x} x} {lambda {} 1}} 2} Réponse : Oui Mais on souhaiterait que ce ne soit pas le cas. 9

Validité des expressions Question : Est-il possible de définir un procédé algorithmique qui accepte les expressions bien formées et rejettent les autres? Réponse : Non {+ 1 {if... 2 {lambda {} 3}}} Si... est l expression true alors l expression est bien formée. Si... est l expression false alors l expression est mal formée. Dans le cas général, il faudrait connaître la valeur de l expression... et donc en particulier savoir si l évaluation de l expression termine, ce qui impliquerait de résoudre le problème de la halte! 10

Validité des expressions : types Il n est pas possible de ne rejeter que les expressions mal formées. Nous allons définir un procédé algorithmique qui rejette toutes les expressions mal formées. Il va donc nécessairement rejeter certaines expressions bien formée. {+ 1 {if... 2 {lambda {} 3}}} sera rejeté quelque soit l expression qui remplace... (y compris false). Concrètement, cela consiste à Donner un type à chaque expression sans l évaluer Calculer le type d une expression complexe à partir du type de ses sousexpressions Rejeter les expressions que l on ne peut pas typer 11

Exemples 1 : num true : bool {+ 1 2} num num num {+ 1 true} num non typable bool 12

Règles de typage On assigne des types aux expressions élémentaires et on se donne des règles de déduction pour les expressions composées. <Num> : num true : bool false : bool expr 1 : num expr 2 : num {+ expr 1 expr 2 } : num 1 : num true : bool 1 : num 2 : num {+ 1 2} : num 1 : num true : bool {+ 1 true} : non typable 13

Règles de typage On assigne des types aux expressions élémentaires et on se donne des règles de déduction pour les expressions composées. <Num> : num true : bool false : bool expr 1 : num expr 2 : num {+ expr 1 expr 2 } : num 1 : num 2 : num {+ 1 2} : num 3 : num {+ {+ 1 2} 3} : num 14

Règles de typage : branchement conditionnel La condition est booléenne. Les deux branches ont le même type. On peut assigner un type à l expression. {if true 1 2} bool num num num La condition n est pas booléenne. On ne peut pas assigner de type à l expression. {if {+ 1 2} 1 2} num num non typable num Les deux branches n ont pas le même type. On ne peut pas assigner de type à l expression. {if true 1 false} bool num bool non typable 15

Règles de typage : branchement conditionnel expr 1 : bool expr 2 : τ expr 3 : τ {if expr 1 expr 2 expr 3 } : τ true : bool 1 : num {if true 1 2} : num 2 : num {+ 1 2} : num 1 : num 2 : num {if {+ 1 2} 1 2} : non typable true : bool 1 : num false: bool {if true 1 false} : non typable 16

Règles de typage : identificateurs et fonctions Une expression élémentaire peut être un identificateur. Quel est son type? x :? On ne peut pas assigner de type à x. Il est nécessaire d avoir des informations supplémentaires sur les identificateurs. Ceux-ci sont nécessairement introduis par des lambdaexpressions, on va donc ajouter l information de type à ce moment et s en rappeler. {lambda {[x : bool]} x} (bool -> bool) bool 17

Règles de typage : identificateurs et fonctions On ajoute un environnement de typage pour se souvenir du type des identificateurs. [..., (id, τ),...] id : τ Si id est lié au type τ dans l environnement, on peut retrouver son type. Quand on cherche à assigner un type au corps d une fonction, il faut au préalable enrichir l environnement de son paramètre formel. (id, τ 1 ), Γ expr : τ 2 Γ {lambda {[id : τ 1 ]} expr} : (τ 1 -> τ 2 ) Pour les règles précédentes, l environnement est simplement transmis aux prémisses. 18

Règles de typage : identificateurs et fonctions [, (id, τ), ] id : τ (id, τ 1 ), Γ expr : τ 2 Γ {lambda {[id : τ 1 ]} expr} : (τ 1 -> τ 2 ) Exemples : [] x : non typable [(x, bool)] x : bool [] {lambda {[x : bool]} x} : (bool -> bool) [(x, bool)] x : bool [(x, bool)] 1 : num [(x, bool)] 2 : num [(x, bool)] {if x 1 2} : num [] {lambda {[x : bool]} {if x 1 2}} : (bool -> num) 19

Règles de typage : appels de fonction Il faut vérifier la cohérence entre le type de l argument et celui du paramètre. Le type de l expression est le type de retour de la fonction. {{lambda {[x : bool]} {if x 1 2}} true} (bool -> num) num bool {{lambda {[x : bool]} {if x 1 2}} 3} (bool -> num) non typable {1 2} num non typable num num 20

Règles de typage : appels de fonction Règle : Γ expr 1 : (τ 1 -> τ 2 ) Γ expr 2 : τ 1 Γ {expr 1 expr 2 } : τ 2 Exemple : [] {lambda {[x : bool]} {if x 1 2}} : (bool -> num) [] true : bool [] {{lambda {[x : bool]} {if x 1 2}} true} : num [] {lambda {[x : bool]} {if x 1 2}} : (bool -> num) [] 3 : num [] {{lambda {[x : bool]} {if x 1 2}} 3} : non typable [] 1 : num [] 2 : num [] {1 2} : non typable 21

Grammaire du langage typé <Expr> ::= <Num> <Sym> {+ <Expr> <Expr>} {* <Expr> <Expr>} {lambda {[<Sym> : <Type>]} <Expr>} {<Expr> <Expr>} <Type> ::= num (<Type> -> <Type>) Les booléens sont laissés à titre d exercice. 22

Implémentation (define-type ExprC [numc (n : number)] [idc (s : symbol)] [plusc (l : ExprC) (r : ExprC)] [multc (l : ExprC) (r : ExprC)] [lamc (par : symbol) (par-type : Type) (body : ExprC)] [appc (fun : ExprC) (arg : ExprC)]) (define-type Type [numt] [funt (par : Type) (res : Type)]) (define-type TypeBinding [tbind (name : symbol) (type : Type)]) (define-type-alias TypeEnv (listof TypeBinding)) 23

Vérification de type (define (typecheck [e : ExprC] [env : TypeEnv]) : Type (type-case ExprC e... [numc (n) (numt)]... )) Γ <Num> : num 26

Vérification de type (define (typecheck [e : ExprC] [env : TypeEnv]) : Type (type-case ExprC e... [idc (s) (type-lookup s env)]... )) [..., (id, τ),...] id : τ 28

Vérification de type (define (typecheck [e : ExprC] [env : TypeEnv]) : Type (type-case ExprC e... [plusc (l r) (type-case Type (typecheck l env) [numt () (type-case Type (typecheck r env) [numt() (numt)] [else (type-error r "num")])] [else (type-error l "num")])]... )) Γ expr 1 : num Γ expr 2 : num Γ {+ expr 1 expr 2 } : num 31

Vérification de type (define (typecheck [e : ExprC] [env : TypeEnv]) : Type (type-case ExprC e... [lamc (par par-type body) (funt par-type (typecheck body (extend-env (tbind par par-type) env)))]... )) (id, τ 1 ), Γ expr : τ 2 Γ {lambda {[id : τ 1 ]} expr} : (τ 1 -> τ 2 ) 35

Vérification de type (define (typecheck [e : ExprC] [env : TypeEnv]) : Type (type-case ExprC e... [appc (fun arg) (type-case Type (typecheck fun env) [funt (par-type res-type) (if (equal? par-type (typecheck arg env)) res-type (type-error arg (to-string par-type)))] [else (type-error fun "function")])]... )) Γ expr 1 : (τ 1 -> τ 2 ) Γ expr 2 : τ 1 Γ {expr 1 expr 2 } : τ 2 39

Cas d étude : paires vs listes En racket, qui est un langage non typé, le mot clé cons permet de créer à la fois des paires et des listes. En fait une liste est soit la liste vide empty, soit une paire dont le deuxième élément est une liste. En plai-typed, qui lui est typé, le mot clé cons sert uniquement à créer des listes. Les paires sont créées à l aide du mode clé pair. Pourquoi cette différence? 40

Cas d étude : paires vs listes Quels sont les types des expressions suivantes? (fst (pair 1 true)) :? (fst (pair 1 2)) :? (snd (pair 1 true)) :? (snd (pair 1 2)) :? (pair 1 true) :? (pair 1 2) :? 41

Cas d étude : paires vs listes Quels sont les types des expressions suivantes? (fst (pair 1 true)) : number (fst (pair 1 2)) : number (snd (pair 1 true)) : boolean (snd (pair 1 2)) : number (pair 1 true) : (number * boolean) (pair 1 2) : (number * number) Pourquoi ne pas faire cela pour les listes? 43

Cas d étude : paires vs listes En programmation fonctionnelle, les listes sont les éléments de base pour la plupart des algorithmes récursifs. En particulier, lors de l appel d une fonction f sur une liste L, il est courant d appeler (f (rest L)). Comme le type du paramètre de f est fixé, cela signifie que L et (rest L) doivent avoir le même type. Les listes ne sont donc pas des paires du point de vue du typage. Pour les mêmes raisons, tous les éléments d une liste doivent partager le même type. 44