Surcharge d’opérateurs en Java
-
Upload
adam-england -
Category
Documents
-
view
69 -
download
6
description
Transcript of Surcharge d’opérateurs en Java
![Page 1: Surcharge d’opérateurs en Java](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/1.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/2.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/3.jpg)
Le plan
Travail de recherche
Spécification
Implémentation
![Page 4: Surcharge d’opérateurs en Java](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/4.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/5.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/6.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/7.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/8.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/9.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/10.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/11.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/12.jpg)
Les opérateurs non surchargeables
Opérateur =
Opérateurs ==, !=
Opérateurs ||, &&
Opérateur []
La spécification
![Page 13: Surcharge d’opérateurs en Java](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/13.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/14.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/15.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/16.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/17.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/18.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/19.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/20.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/21.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/22.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/23.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/24.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/25.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/26.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/27.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013122/568135fa550346895d9d6c28/html5/thumbnails/28.jpg)
Conclusion
VIVE LES VACANCES