Typage M2 - Cours 1

publicité
Typage M2 - Cours 1
Pierre Letouzey
15 janvier 2015
Prérequis
I
Programmation fonctionnelle :
I
OCaml et/ou Haskell, à la rigueur Scheme ou Lisp
⇒ Si besoin suivez le cours de PF en L3 :
http://www.pps.univ-paris-diderot.fr/~treinen/teaching/pf5/
Qu’est-ce que le typage ?
I
Cf. Pierce, Types and Programming Languages :
I
”Un système de type est une méthode syntaxique
effective pour prouver l’absence de certains
comportements de programmes grâce à la classification
des phrases selon les types de valeurs qu’elles calculent”
Quelle classification ?
On retrouve généralement:
I
les types de bases (entiers, flottants, ...)
Quelle classification ?
On retrouve généralement:
I
les types de bases (entiers, flottants, ...)
I
les structures de données (paires, tableaux, ...)
Quelle classification ?
On retrouve généralement:
I
les types de bases (entiers, flottants, ...)
I
les structures de données (paires, tableaux, ...)
I
les fonctions
Quelle classification ?
On retrouve généralement:
I
les types de bases (entiers, flottants, ...)
I
les structures de données (paires, tableaux, ...)
I
les fonctions
I
...
Typage dynamique / statique
I
tests à ”runtime” ou détection à ”compile-time” ?
Typage dynamique / statique
I
tests à ”runtime” ou détection à ”compile-time” ?
I
Pour un typage statique, comment éviter d’interdire trop
de programmes pourtant évaluables tout en restant
décidable ?
Typage dynamique / statique
I
tests à ”runtime” ou détection à ”compile-time” ?
I
Pour un typage statique, comment éviter d’interdire trop
de programmes pourtant évaluables tout en restant
décidable ?
I
Cf. Evan Farrer : ”unit-testing-isnt-enough”
http://linuxfr.org/users/kakaouete/journaux/
typage-statique-versus-typage-dynamique
Typage dynamique / statique
I
tests à ”runtime” ou détection à ”compile-time” ?
I
Pour un typage statique, comment éviter d’interdire trop
de programmes pourtant évaluables tout en restant
décidable ?
I
Cf. Evan Farrer : ”unit-testing-isnt-enough”
http://linuxfr.org/users/kakaouete/journaux/
typage-statique-versus-typage-dynamique
I
Voir aussi http://hacklang.org/ : PHP typé
statiquement
Garanties de correction
I
Préservation des types (subject reduction)
I
ou bien évolution par sous-typage
I
Absence de situation aberrante (progression)
I
Parfois : terminaison
I
Très varié (p.ex. validité html5, ...)
Intérêt du typage
I
I
I
I
I
I
détection des erreurs
sûreté du langage
abstraction
documentation
maintenance
compilation efficace
Insuffisance du typage
I
Exemple parlant de typage pas assez fin :
I
le ”if (x=0) ...” de C, où on mélange booléen et entier
Insuffisance du typage
I
Exemple parlant de typage pas assez fin :
I
I
Exemple de soucis non détecté par le typage:
I
I
I
le ”if (x=0) ...” de C, où on mélange booléen et entier
let a = Array.make 10 0 in a.(10)
Erreur à l’execution.
Rq: en Java il y a un check pour cela (forcément partiel)
Typage par vérification / par inférence
I
Quelle est la ”bonne” quantité d’annotations de types ?
Typage par vérification / par inférence
I
Quelle est la ”bonne” quantité d’annotations de types ?
I
A la Pascal : tout déclarer
Typage par vérification / par inférence
I
Quelle est la ”bonne” quantité d’annotations de types ?
I
A la Pascal : tout déclarer
I
A la OCaml : inférence par le système
Typage par vérification / par inférence
I
Quelle est la ”bonne” quantité d’annotations de types ?
I
A la Pascal : tout déclarer
I
A la OCaml : inférence par le système
I
Solution intermédiaire : des interfaces ...
Typage faible / typage fort
I
faible = possibilité de ”caster” d’un type à l’autre
I
Exemple typique : a+b+c
I
Mais aussi (void *)tab
I
Correspond au coté ”safe” / ”unsafe” du langage
Typage faible / typage fort
I
faible = possibilité de ”caster” d’un type à l’autre
I
Exemple typique : a+b+c
I
Mais aussi (void *)tab
I
Correspond au coté ”safe” / ”unsafe” du langage
I
Attention, presque tous les langages à typage fort
présentes des ”backdoor” :
I
Obj.magic, unsafeCoerce, sérialisation, downcast java,
etc...
Null
I
Null References: The Billion Dollar Mistake (Tony Hoare)
I
Sinon: option (OCaml) / Maybe (Haskell)
Soucis de conception du typage Java
String[] strings = new String[1];
Object[] objects = strings;
objects[0] = new Integer(1);
Soucis de conception du typage Java
String[] strings = new String[1];
Object[] objects = strings;
objects[0] = new Integer(1);
http://c2.com/cgi/wiki?JavaArraysBreakTypeSafety
Typage monomorphe / polymorphe
I
Programmation générique :
I
type ’a list = ...
I
val length : ’a list → int
Surcharge
I
OCaml : un opérateur par type
I
Haskell : classes de types
I
Coq : une notion de Scope
Le cas particulier de printf
I
printf ”...” : quels arguments supplémentaires ?
I
I
Cela dépend des % dans la chaı̂ne
C’est un premier exemple de typage dépendant
Aspects avancés
I
Typage ”1er ordre” / typage d’ordre supérieur
I
Type dépendants, GADT
I
Lien avec la logique (Coq)
Téléchargement