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)