surcharge d’opérateurs en java

28
Surcharge d’opérateurs en Java Philippe Baqué Charles-Félix Chabert Christian Delbé Yannis Juan Encadré par Thomas Graf OOinJ & ZKJC

Upload: adam-england

Post on 03-Jan-2016

58 views

Category:

Documents


6 download

DESCRIPTION

Surcharge d’opérateurs en Java. OO in J & ZKJC. Philippe Baqué Charles-Félix Chabert Christian Delbé Yannis Juan Encadré par Thomas Graf. Présentation du sujet. But : Permettre à l’utilisateur d’utiliser des opérateurs entre des types non-primitifs Sujet libre - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Surcharge d’opérateurs en Java

Surcharge d’opérateurs en Java

Philippe Baqué Charles-Félix ChabertChristian Delbé Yannis Juan

Encadré par Thomas Graf

OOinJ & ZKJC

Page 2: Surcharge d’opérateurs en Java

Présentation du sujet

But : Permettre à l’utilisateur d’utiliser des opérateurs entre des types non-primitifs

Sujet libre Pourquoi une spécification ? Pourquoi une implémentation ?

Page 3: Surcharge d’opérateurs en Java

Le plan

Travail de recherche

Spécification

Implémentation

Page 4: Surcharge d’opérateurs en Java

Le travail de recherche

La surcharge dans les autres langages

Voir l’existant

En cerner les limites

Pouvoir s’en inspirer

Page 5: Surcharge d’opérateurs en Java

Le travail de recherche

Explorer plusieurs routes avant de trouver son chemin …

Préprocesseur Introduction d’un nouveau type

Page 6: Surcharge d’opérateurs en Java

Préprocesseur

Approche simple et naturelle a+b est remplacé par a.operator_plus(b)

Nécessité d’une table de symbole d’une résolution approriée …

Le préprocesseur devient un compilateur

Le travail de recherche

Page 7: Surcharge d’opérateurs en Java

Nouveau type

Nombreuses propositions (Gosling, Joy, Darcy,…)

Propositions très complètes …

… mais modifications importantes ! Par exemple, modification de la Machine

Virtuelle Java

Le travail de recherche

Page 8: Surcharge d’opérateurs en Java

La spécification

Points principaux

Proposer une extension de Java

Proposer une surcharge complète, mais simple

L’efficacité n’est pas le but !

Page 9: Surcharge d’opérateurs en Java

Généralités

L’utilisateur déclare des méthodes standards utilise les opérateurs dans son code

L’extension résout les occurrences d’opérateurs

concernés « passe la main » à Java

La spécification

Page 10: Surcharge d’opérateurs en Java

Les possibilités

Avec OOinJ, on peut écrire :

OurInt o1 = (OurInt)1;

OurInt o2 = (OurInt)2;

OurInt [] oTab1 = {(OurInt)1, (OurInt)2};

int [] Tab2 = {3,4};

OurInt o3 = o1 + o2 * 2;

OurInt [] oTab3 = oTab1 + Tab2;

La spécification

Page 11: Surcharge d’opérateurs en Java

Les opérateurs surchargeables

opérateurs unaires :

+, -, ++, -- opérateurs binaires :

+, -, *, /, %, >, <, >=, <= opérateurs d’affectation composés :

+=, -=, *=, /=, %= opérateur de conversion :

(type)

La spécification

Page 12: Surcharge d’opérateurs en Java

Les opérateurs non surchargeables

Opérateur =

Opérateurs ==, !=

Opérateurs ||, &&

Opérateur []

La spécification

Page 13: Surcharge d’opérateurs en Java

Définir les opérateurs

Opérateurs unaires :

operator:op(Type arg) Opérateurs binaires :

operator:op(Type1 arg1, Type2 arg2)

Opérateur de conversion :

operator:(Type1)(Type2 arg)

Exemple :static OutInt operator:+(OurInt a, int b){

…}

La spécification

Page 14: Surcharge d’opérateurs en Java

Opérateurs : méthodes de classe

permettre l’écriture de a+1 et de 1+a a+1 a.operator:+(1) 1+a 1.operator:+(a) ???

A.operator:+(1,a) !!!

simplicité de la résolution Méthode d ’instance : résolution sur le type

dynamique Méthode de classe : résolution sur le type statique

La spécification

Page 15: Surcharge d’opérateurs en Java

Localisation des opérateurs

Au moins un des paramètres doit être :

du type de la classe qui déclare la méthode

ou un tableau dont le type terminal est le type de la classe qui déclare la méthode

Maximum deux classes possible pour la résolution

La spécification

Page 16: Surcharge d’opérateurs en Java

Les opérateurs particuliers

Affectation composée : a op=b Dérivé automatiquement de op

a op=b a = a op b Automatique : pourquoi ?

La surcharge de l’affectation n’est pas possible par l’utilisateur

Automatique : comment ? Utilisation de l’opérateur simple correspondant, avec

une restriction sur le type de retour. Mécanisme d’évaluation particulier

La spécification

Page 17: Surcharge d’opérateurs en Java

Les opérateurs particuliers

Incrément (++) et décrément (--) : Une seule méthode pour postfixe et préfixe

Exemple :

Méthode d’évaluation : Résultat de l’expression a++

La référence de l’objet référencé par a Résultat de l’expression ++a

A.operator:++(a) Dans les deux cas il y a affectation du résultat de A.operator:++(a) à la variable a

La spécification

public static OurInt operator:++(OurInt i){

return new OurInt(i.getValue());

}

Page 18: Surcharge d’opérateurs en Java

Les opérateurs particuliers

Conversion : (Type)a

Beaucoup de restrictionsToutes les conversions autorisées en Java ne peuvent être

redéfinies

Conversions explicites uniquement Il est nécessaire de différencier les opérateurs de conversion

explicite et les opérateurs de conversion implicite La surcharge d’opérateurs de conversion implicite à un très grand

impact sur Java Possibilités de convertir des tableaux

Les restrictions pour les conversions de tableau sont faites sur leur type terminal.Ces restrictions sont les même que pour des types non tableau

La spécification

Page 19: Surcharge d’opérateurs en Java

L’implémentation

Ne pas modifier KJC Rester compatible avec les versions ultérieures

Etendre et non pas modifier Java Compilation de tout programme Java standard Interprétation par toute machine virtuelle

Respecter OOinJ

Page 20: Surcharge d’opérateurs en Java

Phases de compilation

Phase 1

Phase 2

Phase 3

Phase 4

Analyse syntaxiqueAnalyse

syntaxique

Créer la représentation intermédiaire

Créer la représentation intermédiaire

Vérification du corps

Vérification du corps

Génération de code

Génération de code

L’implémentation

Page 21: Surcharge d’opérateurs en Java

Analyse syntaxique

Accepter de nouvelles définitions :

public static OurInt operator:+(OurInt a, OurInt b){

...

}

étendre la grammaire de KJC

L’implémentation

Page 22: Surcharge d’opérateurs en Java

Représentation intermédiaire

Appeler notre vérification : Soit on a une déclaration standard

Traitement effectué par KJC : checkInterface(…)

Soit on a une déclaration étendue Traitement effectué par ZKJC :

On redéfinit checkInterface(…)

L’implémentation

Page 23: Surcharge d’opérateurs en Java

Vérification du corps

Si on rencontre l’expression a + b On rajoute une ZAddExpression dans l’arbre d’analyse

ZAddExpressionanalyse

JAddExpressionanalyse

ZAddExpressiontentative de résolution exception

OK

L’implémentation

exception

Page 24: Surcharge d’opérateurs en Java

Génération de code

Opérateurs d’affectation composés extension des opérateurs binaires

arithmétiques Éviter la double évaluation

OurInt T[]={(OurInt)1, (OurInt)2};

int i = 0;

T[i++] += 1;

L’implémentation

Méthode + entre OurInt et int

Vérification du type retour

Affectation manuelle dans la pile

Page 25: Surcharge d’opérateurs en Java

Génération de code

Opérateurs d’affectation composés extension des opérateurs binaires

arithmétiques Éviter la double évaluation

OurInt T[]={(OurInt)1, (OurInt)2};

int i = 0;

T[i++] += 1;

L’implémentation

T[0] = T[0] + 1 i = 1

Méthode + entre OurInt et int

Vérification du type retour

Affectation manuelle dans la pile

Page 26: Surcharge d’opérateurs en Java

Génération de code

Incrément (++) et décrément (--) une seule méthode déclarée Impact sur la performance génération de bytecode (duplication en pile)

OurInt i = (OurInt) 1;

i++;

Méthode ++ appliquée à OurIntPostfixe ou préfixe ?

Duplication de i en pileAppel de méthode

L’implémentation

Page 27: Surcharge d’opérateurs en Java

Génération de code

Incrément (++) et décrément (--) une seule méthode déclarée Impact sur la performance génération de bytecode (duplication en pile)

OurInt i = (OurInt) 1;

i++;

Méthode ++ appliquée à OurIntPostfixe ou préfixe ?

Duplication de i en pileAppel de méthode

1 est renvoyé

i = 2

L’implémentation

Page 28: Surcharge d’opérateurs en Java

Conclusion

VIVE LES VACANCES