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 :

Compilation sans assertions


Sujet :

Langage Java

  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut Compilation sans assertions
    Salut,

    Dans mon code, généralement j'utilise des assertions, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assert index >= 0 && index < model.getSize() : "L'index doit être cohérent."
    L'avantage par rapport aux exceptions, c'est qu'on peut l'activer ou le désactiver à l'exécution (et c'est pluc concis)...

    Par contre, est-ce que c'est possible de le désactiver directement à la compilation (pour que les assertions -transformées en exceptions- ne soient pas contenues dans le byte code)?
    Car quand on décompile, on obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!$assertionsDisabled && index >= 0 && index < model.getSize())
    C'est plus par curiosité que par réelle nécessité, le test d'un booléen étant très rapide

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par ®om
    L'avantage par rapport aux exceptions, c'est qu'on peut l'activer ou le désactiver à l'exécution (et c'est pluc concis)...
    L'objectif n'est pas le même : les exceptions permettent de traiter des erreurs qui pourraient se produire, alors que les assert vérifient que certaines conditions soit bien vérifié...


    Citation Envoyé par ®om
    Par contre, est-ce que c'est possible de le désactiver directement à la compilation (pour que les assertions -transformées en exceptions- ne soient pas contenues dans le byte code)?
    Ce n'est pas possible, tout simplement parce qu'il est prévu la possibilité de modifier l'activation des assertions au cas par cas avant le chargement des classes via le ClassLoader. Si tu supprimes les assertions du bytecode ce ne sera plus possible...

    Citation Envoyé par ®om
    C'est plus par curiosité que par réelle nécessité, le test d'un booléen étant très rapide
    Je pense même que la JVM doit completement supprimé le bout de code lorsqu'elle le compile en natif...


    D'ailleurs tu peux même le faire au niveau du compilateur si tu veux vraiment supprimer les assert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static final boolean ENABLE_ASSERT = true;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (ENABLE_ASSERT) assert index >= 0 && index < model.getSize() : "L'index doit être cohérent."
    En passant ENABLE_ASSERT à false et en recompilant le tout, tu n'auras plus d'asser dans le bytecode

    a++

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par adiGuba
    L'objectif n'est pas le même : les exceptions permettent de traiter des erreurs qui pourraient se produire, alors que les assert vérifient que certaines conditions soit bien vérifiées...
    Cela me sert à vérifier des conditions (par exemple, que l'index soit cohérent, si le soft est bien programmé, il est toujours cohérent, donc pas besoin de tester au runtime).


    Citation Envoyé par adiGuba
    Ce n'est pas possible, tout simplement parce qu'il est prévu la possibilité de modifier l'activation des assertions au cas par cas avant le chargement des classes via le ClassLoader. Si tu supprimes les assertions du bytecode ce ne sera plus possible...
    Oui, c'est justement ce que je cherche à faire, que ça ne soit plus possible...
    Compiler en ignorant totalement les assert du code source (comme si on les avait supprimés).

    Citation Envoyé par adiGuba
    D'ailleurs tu peux même le faire au niveau du compilateur si tu veux vraiment supprimer les assert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static final boolean ENABLE_ASSERT = true;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (ENABLE_ASSERT) assert index >= 0 && index < model.getSize() : "L'index doit être cohérent."
    En passant ENABLE_ASSERT à false et en recompilant le tout, tu n'auras plus d'asser dans le bytecode
    Ce n'est pas forcément le "assert" que je veux supprimer, mais le test inutile... Si tu utilises une variable que tu testes, ça revient au même

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ®om
    Ce n'est pas forcément le "assert" que je veux supprimer, mais le test inutile... Si tu utilises une variable que tu testes, ça revient au même
    Non car comme ENABLE_ASSERT est une constante, lorsqu'elle vaut false le compilateur ne générera pas le bytecode associé au if() car le bloc est "unreachable".

    Cela permet de faire de la compilation pseudo-conditionnelle (si tu as le courage, tu peux lire : Unreachable Statements)


    Toutefois, je ne pense pas que ce soit vraiment utile car HotSpot doit faire la même chose lorsqu'il compile le bytecode en natif avec les assertions si elles sont désactivés...


    a++

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Sur cet article, une phrase me semble bizarre:
    A while statement can complete normally iff at least one of the following is true:
    - The while statement is reachable and the condition expression is not a constant expression with value true.
    ...
    Une déclaration while peut se terminer normalement ssi au moins une des affirmations suivantes est vraie :
    - La déclaration while est accessible et la condition n'est pas une expression constante vraie.
    ...
    C'est pas plutôt "n'est pas une expression constante fausse"?

Discussions similaires

  1. Compiler sans le .net 2
    Par mouteb dans le forum C++/CLI
    Réponses: 13
    Dernier message: 06/10/2006, 18h13
  2. [VB6]Compilation sans dépendance
    Par belfaigore dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/08/2006, 03h22
  3. Débutant Eclipse compilation sans main
    Par Bba_M dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 15/06/2006, 18h28
  4. Débutant Eclipse compilation sans "main"
    Par Bba_M dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 08/06/2006, 21h52
  5. MICO - Windows - compiler sans VC++
    Par QUOVADIS dans le forum CORBA
    Réponses: 1
    Dernier message: 03/02/2006, 19h15

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