• Aucun résultat trouvé

INE 11

N/A
N/A
Protected

Academic year: 2022

Partager "INE 11"

Copied!
8
0
0

Texte intégral

(1)

Principes des lang. de progr.

INE 11

Michel Mauny

Inria-Paris

prénom.nom@inria.fr

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 1 / 23

Enregistrements, objets

1 Enregistrements

2 Objets

3 Les objets d’OCaml

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 2 / 23

Pourquoi des enregistrements ?

Agglomérer des données couples,n-uplets

enregistrements : n-uplets à composantes nommées Exemple

Coordonnées GPS de l’ENSTA : latitude=48,834279

longitude=2,283596 classique, mais peu pratique :

let ensta= (48.834279, 2.283596) mieux :

let ensta= {lat=48.834279;long=2.283596}

ensta.longau lieu desnd(ensta)

(2)

Enregistrements en OCaml

Recopie partielle

typeposition= {lat:float;long:float;alt:float} let monte pos=

{ lat=pos.lat;long=pos.long;alt=pos.alt+. 1.0 } OCaml permet d’abréger en

let monte pos= {poswithalt=pos.alt+. 1.0 }

Généralisation

let aller_a pos la lo= {poswithlat=la;long =lo}

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 4 / 23

Enregistrements en PCF : syntaxe

Syntaxe

e ::= n∈N|b∈bool|x |e1e2|ife1 thene2 elsee3

| e1+e2|e1=e2|funx → e

| letx=e1 ine2|let rec f(x) =e1 ine2

| {`1=e1;. . .;`n=en}

| e.`

| {ewith`=e0}

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 5 / 23

Enregistrements en PCF : sémantique opérationnelle

Valeurs

v ::= c|Valf(x,e, ρ)|Valfr(f,x,e, ρ)

| Record((`1,v1), . . . ,(`n,vn)) Règles

ρ`e1⇒v1 . . . ρ`en⇒vn

ρ` {`1=e1;. . .;`n=en} ⇒Record((`1,v1), . . . ,(`n,vn))(Rec)

ρ`e⇒Record(. . . ,(`,v), . . .) ρ`e.`⇒v (RAcc)

ρ`e⇒Record((`1,v1), . . . ,(`,v), . . .(`n,vn)) ρ`e0⇒v0 ρ` {ewith`=e0} ⇒Record((` ,v ), . . . ,(`,v0), . . .(` ,v ))

(3)

Enregistrements en PCF : sémantique opérationnelle

Généralisation On écrit

{e with`1=e1;. . .;`n=en} pour

{. . .{e with`1=e1}. . . `n=en} C’est du «sucre syntaxique»

cad une écriture simplifiée d’une combinaison de constructions existantes

la sémantique de la forme abrégée (le «sucre»)» = sémantique de la forme complète

Exemple : la conjonction booléenne (e1 &&e2) est du «sucre» pour (if e1 thene2 else false)

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 7 / 23

Variables mutables en PCF : syntaxe

Mini-ML avec références Syntaxe

e ::= . . .

| refe

| e1:=e2

| !e Valeurs

v ::= c|Valf(x,e, ρ)|Valfr(f,x,e, ρ)

| Record((`1,v1), . . . ,(`n,vn))

| Ref(v) Règles

[Exercice]

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 8 / 23

Objets

Exemple

un point (2D) est donné par : son abscissex

son ordonnéey

une méthode de déplacement, qui modifie les coordonnées

Objets représentés par des enregistrements

les variables d’instance sont des champs contenant des références (ou des champs mutables)

les méthodes sont des champs contenant des fonctions

(4)

Objets

Représentation d’un objet point : 1er essai let p= {

x=ref3 ; y=ref4 ;

move=fun dx dy→ x:= !x +dx; y:= !y +dy }

Problème

xetyne sont pas connus de move

simoveaccède directement aux champsxetydep, alors son code ne peut être partagé entre différents objets

⇒paramétrer les méthodes par l’objet courant

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 10 / 23

Objets

Représentation d’un objet point let p= {

x=ref3 ; y=ref4 ;

move=funthis dx dy→ this.x:= !(this.x) +dx; this.y:= !(this.y) +dy } Autre syntaxe

let p= { x=ref3 ; y=ref4 ;

move this dx dy=

this.x:= !(this.x) +dx; this.y:= !(this.y) +dy}

Appel de méthode p.move p1 1 Autre notation On écrite#mpour

let this=e inthis.m(this) p#move1 1

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 11 / 23

Polymorphisme

Appeler une méthode provenant d’objets différents let p1 = { x=ref4; y=ref 2; move= ... }

let p2 = { x=ref1; y=ref 3; move= ...; c= ref"rouge"} let do_move p dx dy=p#move dx dy

do_move p11 0;do_move p20 1;

Difficultés d’implémentation :dynamic dispatch Où est la méthodemove?

dans l’objet ? À quelle position ?⇒hachage et recherche dynamique dans la classe ? Accès dynamique à la classe.

Solutions

OCaml, JavaScript : les méthodes sont dans l’objet

C++ : l’objet dispose d’un pointeur vers la table des méthodes de sa classe (virtual table)

(5)

Classes

Les classes sont des générateurs d’objets let class_point() =

{ x=ref 3; y=ref 4; move=funthis → ... } let p=class_point()

Notation

On écrira newc

pour c()

Exemple

let p1 =newclass_pointin let p2 =newclass_pointin p1#move150 100

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 13 / 23

Héritage

Une sous-classe réutilise la super-classe let class2Dpoint(xinit,yinit) =

{ x=refxinit;y=refyinit;

move this dx dy= ...;

reset this= (this.x:= 0;this.y:= 0) } let class3Dpoint(xinit,yinit,zinit) =

let super=newclass2Dpoint(xinit,yinit)in { x=super.x;y=super.y;z=refzinit;

move this dx dy dz= (super.move this dx dy;

this.z:= !this.z+dz);

reset this= (super.reset this;this.z:= 0) }

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 14 / 23

Héritage et dynamic dispatch

Quelle méthode est appelée ?

let pt_reset point=point#reset reset2Doureset3D?

dépend dupointeffectif : la méthode est sélectionnée dynamiquement.

(6)

Les objets d’OCaml

classes

typage et inférence de type statiques

les objets portent (des pointeurs vers) leurs méthodes héritage multiple

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 16 / 23

OCaml : classes, objets et méthodes

class point= object

val mutablex= 0 methodget_x=x

methodmove d=x←x+d end;;

class point :

object val mutablex : int methodget_x : int methodmove :int→unitend let p=newpoint;;

val p : point = <obj>

(∗ point est une abréviation pour

<get_x : int; move : int → unit>∗)

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 17 / 23

OCaml : appels de méthodes

p#get_x;;

−: int = 0 p#move3;;

−: unit = () p#get_x;;

−: int = 3

(7)

OCaml : classes paramétrées

class point xinit= object

val mutablex=xinit methodget_x=x

methodget_offset=x− xinit methodmove d=x←x+d end;;

class point : int → object

val mutablex : int methodget_offset : int methodget_x : int methodmove : int→ unit end

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 19 / 23

OCaml : classes paramétrées

this est un paramètre explicite class printable_point xinit=

object(this) (∗ on nomme l’objet ( this , self , moi, ...) ∗) val mutablex=xinit

methodget_x=x

methodmove d=x←x+d

methodprint=print_int this#get_x end;;

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 20 / 23

OCaml : héritage

class colored_point x(c:string) = object

inherit point x val c =c

methodcolor=c end;;

Les méthodes peuvent être virtuelles, privées, etc.

(8)

OCaml : polymorphisme

let get_x o=o#get_x

val get_x : < get_x :α; .. >→ α= <fun>

let colored_point_to_point cp= (cp : colored_point:> point);;

val colored_point_to_point : colored_point→ point = <fun>

let p=newpoint3

andq=newcolored_point4"blue";;

val p : point = <obj>

val q : colored_point = <obj>

let l= [p; (colored_point_to_point q)];;

val l : point list = [<obj>; <obj>]

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 22 / 23

Conclusion

Les enregistrement peuvent servir de base à l’encodage des objets Certains aspects «dynamiques» des objets sont assez difficiles à compiler efficacement

Le typage (pas abordé ici) et la synthèse de types sont complexes On peut assez facilement réaliser un interprète pour PCF (+

enregistrements) + objets.

Michel Mauny (Inria-Paris) INE 11 prénom.nom@inria.fr 23 / 23

Références

Documents relatifs

Deux applications nouvelles sont, ensuite, développées : la première consiste en un filtrage de la composante verticale d’un Profil Sismique Verticale (PSV) ne

Nous avons présenté dans un cas simple (la formulation diélectrique) comment construire une solution approchée du potentiel scalaire dans un milieu avec fine membrane sans mailler

Les formules encadrées sont à savoir par

Si u = distance en centim` etres, la position dans la file ne change pas, mais elle est exprim´ ee en centim` etres et on a ˜ Ppuq “

As regards the estimation of posterior model parameter, we have illustrated the important role con- ditional composite likelihood approximations can play in the statistical analysis

(Le calcul numérique étant 3D, nous avons calculé les trois composantes du courant et nous avons trouvé, pour les composantes en principe nulles jx et jy, une

A l'intérieur d'un solénoïde (schéma ci-contre) parcouru par un courant électrique continu, la valeur du champ magnétique est constante en tout point. Ce champ magnétique a

(Remarque, la sonde noire n’est pas utilisée, un fil noir relie directement la borne com du multimètre à la borne négative de la cuve et du générateur. Les mesures se font