IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Méthodes virtuelles et efficacité ?


Sujet :

Langage Java

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Méthodes virtuelles et efficacité ?
    Bonjour à tous,

    Venant de C++ je commence le Java et j'ai d'ores et déjà quelques interrogations sur le fonctionnement interne du langage.

    En C++, les fonctions sont par défaut non virtuelles, "normales". Il y a moyen de les rendre virtuelles par programmation, ainsi le method lookup se fera à l'exécution. Cela permet le polymorphisme mais cela force le processeur à devoir vérifier à chaque réception de message le type réel de l'objet qui reçoit ce message et de voir s'il n'y a pas une autre méthode de même nom. Bien.

    Bien sûr en pratique OO, on a besoin du polymorphisme, et on comprend donc bien qu'en Java les méthodes soient virtuelles par défaut. Mais le problème est que si on veut déclarer une méthode dans une classe qui a des sous-classes mais qu'on sait très bien que cette méthode n'est pas overridée, ce serait bête de devoir faire cette vérification inutile et coûteuse en ressource.

    Evidemment vous me direz on peut mettre la méthode en final pour l'empêcher d'être overridée. Mais je n'ai pas forcément envie de l'empêcher, j'aimerais simplement ne pas m'en soucier. Mieux, j'aimerais en fait pouvoir écrire ma fonction sans me soucier de si elle va être overridée ou pas, et j'aimerais qu'elle soit virtuelle dans le cas où elle est overridée, et non virtuelle dans le cas inverse. Les compilateurs devraient faire cela, non ?

    Vous me direz que ce que je décris est exactement le method lookup fait à la compilation. En fait non. Le compilateur peut très bien après avoir assemblé toutes les classes, examiner les relations d'héritage et générer des appels normaux pour les méthodes dont il repère qu'elles sont uniques, et des appels avec du code de method lookup pour celles dont il voit qu'elles sont overridées.

    Alors je me dis, est-ce que c'est cela que fait le compilateur Java, ou pas ?

    C'est pointu mais je me pose vraiment la question, donc merci si vous en savez quelque chose ou si vous voulez ouvrir le débat des méthodes virtuelles...

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Citation Envoyé par Webanix Voir le message
    Le compilateur peut très bien après avoir assemblé toutes les classes, examiner les relations d'héritage et générer des appels normaux pour les méthodes dont il repère qu'elles sont uniques, et des appels avec du code de method lookup pour celles dont il voit qu'elles sont overridées.

    Alors je me dis, est-ce que c'est cela que fait le compilateur Java, ou pas ?
    Sur ce point précis, le compilateur n'assemble pas toutes les classes, le chargement des classes est fait à l'exécution de manière dynamique par la jvm, qui recherche les classes dans les .jar par rapport au contenu du classpath. Il n'y a pas de notion d'exécutable en Java, donc pas de phase d'édition de liens.
    Par contre, à l'exécution, il est possible que la jvm détecte que telle méthode n'est jamais overridée et réalise les optimisations adéquates, allant même jusqu'à générer du code natif si nécessaire : la jvm intègre un compilateur Java en code natif, appelé jit (just-in-time) compiler, ou java hotspot compiler.

  3. #3
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonsoir,

    [EDIT]je vire une partie de la réponse car Hervé m'a devancé [/EDIT]

    Je te conseil cet article qui te permettra de voir comment sont "invoquée" les méthodes dans un programme Java; comme je viens de le faire.

    http://www.ibm.com/developerworks/ib...ggar_bytecode/

    Amuse toi à désassembler du bytecode sur des exemples que tu écris; je pense que les "invokevirtual", "invokespecial" te donneront une idée de comment ça se passe. Tu verras (et ce même en éditant en bloc note du byte code) que les classes, méthodes et attributs sont chargées, appelés et manipulés via leurs noms.


    Ensuite, il faut bien avoir conscience que Java repose sur une machine virtuelle (comme le dit Hervé avec plus de précision du coup)

    Si tu veux approfondir, je pense que jeter un oeil à ce qui suit te donnera une idée de ce qu'utilise la machine virtuelle :
    java.lang.Class / java.lang.Object / java.reflect.Method / java.lang.ClassLoader

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html
    La partie réflexion te montrera la grosse différence avec C++ et surtout la partie magique de java... Le ClassLoader t'en dira plus sur comment fonctionne le chargement des classes.

    Tu peux aussi jeter un oeil aux JNI, ce qui te rapprocheras des entrailles de la machine virtuelle :

    http://www.iut-orsay.fr/dptinfo/Peda...a/javaJni.html


    Alors je me dis, est-ce que c'est cela que fait le compilateur Java, ou pas ?
    Tu devrais avoir vu le rôle limité du compilateur (javac) en terme d'optimisation des appels de méthode, face à celui de l'interpréteur (java)

    bye

Discussions similaires

  1. Appel d'une méthode virtuelles
    Par BIPBIP59 dans le forum C++Builder
    Réponses: 4
    Dernier message: 24/03/2006, 14h00
  2. Méthodes virtuelle et implémentation
    Par slate dans le forum C++
    Réponses: 2
    Dernier message: 16/02/2006, 17h16
  3. méthodes virtuelles
    Par ep31 dans le forum C++
    Réponses: 2
    Dernier message: 09/11/2005, 17h21
  4. Comment l'appel à une méthode virtuelle....
    Par Blobette dans le forum C++
    Réponses: 7
    Dernier message: 07/12/2004, 13h55
  5. [C#] Méthode virtuelle
    Par jacma dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/11/2004, 08h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo