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

Discussion :

Pourquoi "goto" est déconseillé ?

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 52
    Points : 52
    Points
    52
    Par défaut [Résolu]Pourquoi "goto" est déconseillé ?
    Messieurs, Dames Bonjour !
    Il y a 4 ans un de mes profs me disait en TD de ne jamais utiliser l'instruction goto dans mes codes quelque soit le langage de prog que j'utiliserai.
    Seulement, voilà, comme je n'écoutais jamais ce gars, je ne me souviens plus pourquoi il donnait ce conseil.

    Dernièrement, en l'espace de 6 mois j'ai lu dans trois boucains de programmation différents cette même interdiction.

    Alors quelqu'un pourrait-il me dire pourquoi goto est interdit par certains informaticiens alors qu'il existe bien dans pas mal de langages de programmation.
    Merci d'avance.
    ----------------------------------
    Let the feast, start !
    Vitamines pour l'esprit : http://www.batisseurs-de-succes.com/

  2. #2
    Membre éclairé
    Avatar de Kangourou
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    579
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 579
    Points : 859
    Points
    859
    Par défaut
    Un peu de prog en utilisant goto, et on comprend vite ...

    L'ideal en programmation est d'avoir un code clair, bien structure, bien delimite entre les differnetes perties, boucles, fonctions ... Histoire que quand on se trouve a une ligne donnee, on sache exactement comment on est arrive la.
    Or avec goto, on se balade un peu partout dans le programme, et on a vite fait de ne plus s'y retrouver. Tandis qu'avec des for des while et des fonctions/methodes, on garde toujours l'enchainement.
    Si on le trouve encore dans la plupart des langages, c'est parce que c'est une des premieres instructions qui aient existe, et c'est par souci de compatibilite.

    Cela dit, on peut trouver des cas (rares, il est vrai) ou un petit goto bien place permet de se sortir d'une construction un peu alambiquee.

    A+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 52
    Points : 52
    Points
    52
    Par défaut
    Merci pour ta réponse Kangourou,
    Je commençais à désespérer vu que personne ne répondait.
    Cela dit, si certains ont des compléments de réponse, allez-y déchainez-vous !!
    @+
    ----------------------------------
    Let the feast, start !
    Vitamines pour l'esprit : http://www.batisseurs-de-succes.com/

  4. #4
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    en informatique le terme "déconseiller" est préférable à celui "interdire"

    une petite anectode, pour montrer les conséquences des interdictions
    prises au pied de la lettre

    Un médecin a interdit à son patient cardiaque de monter chez lui par
    les escaliers.

    Un mois plus tard, le médecin est rappelé au chevet de son malade agonisant.
    l'explication est que comme l'ascenseur était en panne et que le
    médecin avait interdit les escalier, le patient montait chez lui par la
    gouttière.
    --------------------------------
    on remarquera que c# langage récent, censé concurrencer java a remis "goto" en selle

  5. #5
    Membre habitué Avatar de Kimael
    Inscrit en
    Avril 2002
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 151
    Points : 159
    Points
    159
    Par défaut
    Ahhh, bah je vais arrêter de faire c**er mon syndic qui ne voulait ni faire installer un ascenseur ni renforcer les goutières !

    Ce n'est pas la taverne ici
    Je sais... mais je n'ai pas pu m'en empêcher :hihi:

    A propos des "goto/label", ce qu'il faut ne pas oublier c'est que derrière ça marche toujours avec des "goto/label" ! Un langage n'est qu'une surcouche à l'assembleur qui les utilise...

    Le pauvre, il doit en avoir mal à la tête
    Ok, je
    Membre du comité "Mort aux cons ! ARG..."
    Plus on essaye, et plus on a de chances de réussir... proverbe Shadok.
    Pensez au tag [Résolu], merci.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    en effet, l'instruction goto on l'utilise souvent (peut-être sans le savoir), seulement, les langages évolués implémentent des goto "propres".
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    While&#40;condition=0; condition<10; condition++&#41;
    &#123;
        instructions;
    &#125;
    équivaut à peu près à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    condition=0;
    While
    if&#40;condition<10&#41;
    &#123;
        instructions;
        condition++;
        goto&#58; While;
    &#125;
    la première version est plus claire et intuitive, quoique dans ce cas ci la seconde demeure lisible, imagine lorsque tu as plusieurs boucles imbriquées...
    Arrêtez de détruire notre langue pour sauver quelques micro-secondes de votre si précieux temps.
    Moi je parle FRANÇAIS pas fransè

  7. #7
    Membre habitué Avatar de Kimael
    Inscrit en
    Avril 2002
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 151
    Points : 159
    Points
    159
    Par défaut
    Je dirai même plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    instructions0;
    for&#40;condition=0; condition<10; ++condition&#41; &#123;
      instructions1;
    &#125;
    instructions2;
    équivaut exactement à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          instructions0
          condition=0
    label&#58;While
          if !&#40;condition<10&#41;
          goto endWhile
          instructions1
          condition=condition+1
          goto While
    label&#58;endWhile
          instructions2
    Membre du comité "Mort aux cons ! ARG..."
    Plus on essaye, et plus on a de chances de réussir... proverbe Shadok.
    Pensez au tag [Résolu], merci.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Kimael
    Je dirai même plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    instructions0;
    for&#40;condition=0; condition<10; ++condition&#41; &#123;
      instructions1;
    &#125;
    instructions2;
    équivaut exactement à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          instructions0
          condition=0
    label&#58;While
          if !&#40;condition<10&#41;
          goto endWhile
          instructions1
          condition=condition+1
          goto While
    label&#58;endWhile
          instructions2
    attention, si tu fais ++condition, il doit être incrémenté avant, donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          instructions0
          condition=0
    label&#58;While
          condition=condition+1
          if !&#40;condition<10&#41;
          goto endWhile
          instructions1
          goto While
    label&#58;endWhile
          instructions2
    Arrêtez de détruire notre langue pour sauver quelques micro-secondes de votre si précieux temps.
    Moi je parle FRANÇAIS pas fransè

  9. #9
    Membre habitué Avatar de Kimael
    Inscrit en
    Avril 2002
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 151
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par sarasvati
    attention, si tu fais ++condition, il doit être incrémenté avant, donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
          instructions0
          condition=0
    label&#58;While
          condition=condition+1
          if !&#40;condition<10&#41;
          goto endWhile
          instructions1
          goto While
    label&#58;endWhile
          instructions2
    Eh non !
    Bien tenté, mais c'est faux.
    Mon "exactement" n'est pas absolu, mais quand même...
    Membre du comité "Mort aux cons ! ARG..."
    Plus on essaye, et plus on a de chances de réussir... proverbe Shadok.
    Pensez au tag [Résolu], merci.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    argg, désolé
    petite confusion de ma part...
    je fais joujou avec les effets de bords ces temps-ci alors...
    Arrêtez de détruire notre langue pour sauver quelques micro-secondes de votre si précieux temps.
    Moi je parle FRANÇAIS pas fransè

  11. #11
    Membre habitué Avatar de Kimael
    Inscrit en
    Avril 2002
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 151
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par sarasvati
    argg, désolé
    petite confusion de ma part...
    je fais joujou avec les effets de bords ces temps-ci alors...
    Hihi, moi je dis : VIVEMENT qu'on puisse faire joujou avec les effets de bords... de mer ! ARf
    Bon, allez, je , de toutes façon c'est mon heure de fin de boulot !
    A+
    Membre du comité "Mort aux cons ! ARG..."
    Plus on essaye, et plus on a de chances de réussir... proverbe Shadok.
    Pensez au tag [Résolu], merci.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Le Goto est utile, il ne faut pas le stigmatiser.
    Si c'est pour coder comme une merde, économiser une fonction ou une bouccle trop conditionnée et complexe à écrire, la évidemment, ce n'est pas justifié.
    Mais par exemple pour la détection d'un lecteur, un on error goto c'est drolement pratique.
    D'autre part, il m'est arrivé d'utilidser le goto car aucun autre moyen de créer des entités de tris sur des répertoires.
    Voilou, voilou

  13. #13
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    Remarque : si le langage implémente les exceptions, plus besoin de on error goto

  14. #14
    Membre régulier
    Avatar de epeios
    Homme Profil pro
    Ingénieur logiciel
    Inscrit en
    Août 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur logiciel

    Informations forums :
    Inscription : Août 2003
    Messages : 38
    Points : 82
    Points
    82
    Billets dans le blog
    2
    Par défaut
    Je crois que l'utilisation GOTO simplifie aussi l'écriture des générateurs de code. Un tel code n'est généralement pas destiné à être lu, et encore moins à être modifié, donc ce n'est pas grave qu'il soit totalement incompréhensible. Le code génèré par LEX ou YACC (me souvient plus lequel sert à quoi) en contient à outrance ...

  15. #15
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tout à fait epeios. Et sinon lex s'occupe du lexique et yacc de la grammaire des languages.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 417
    Points : 372
    Points
    372
    Par défaut
    Le goto c'est comme un couteau de cuisine: il faut savoir s'en servir pour ne pas se couper les doigts. Etant donné le genre de langages que je développe je devrais être farouchement anti-goto. Eh bien ce n'est pas le cas. Mon dernier compilateur en est truffé. Mais bien entendu, chaque utilisation repose sur une sémantique claire et mathématiquement sûre. En fait tout cela relève d'un débat plus général me semble-t-il, à savoir la répartition des responsabilités entre le programmeur et son compîlateur. Et ça ne concerne pas que le goto.

  17. #17
    Membre extrêmement actif Avatar de cortex024
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 301
    Points : 1 119
    Points
    1 119
    Par défaut
    je suis dans le même cas que toi Melchisedec.
    professeur qui déconseille fortement (juste pour ne pas dire qu'il l'interdit).

    j'essaie d'éviter quand je peux, mais parfois, il vaut mieux un goto bien placé qu'une boucle imbriquée avec condition qui ne ressemble plus à rien.

    il est présent dans les languages, pourquoi ne pas s'en servir si on sait le faire correctement

  18. #18
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Moi je dis, on utilise bien exit, Break et Continue sans s'inquiéter. Or c'est la même chose qu'un goto, sauf que le label est implicite.

    Et puis comment vous faites pour sortir proprement de deux boucles imbriquées ou plus, hein ?

    Vous l'aurez compris, je suis tout à fait pour le goto. Mais il faut savoir quand l'utiliser.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  19. #19
    Membre expérimenté
    Avatar de Juju_41
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2003
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2003
    Messages : 974
    Points : 1 557
    Points
    1 557
    Par défaut
    Bonjour

    Goto n'est pas méchant en soi .. mais il est vrai que dans certains langages il peut générer un code pas propre du tout à la compilation. Un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
    pour i allant de 0 à 50 faire &#123;
       octetslus = lireunoctet&#40;&#41;;
       si &#40;octetslus == 0&#41; goto erreur;
    &#125;
    ...
    // fin du programme
    
    erreur&#58;
    // traitement de l'erreur
    ...
    Si le compilateur gère les boucles "pour" en utilisant la pile, et bien le goto va laisser des données dessus inutilement, ce qui est très moche
    Avant de poster, merci de consulter les règles du forum

  20. #20
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Bonjour,

    Citation Envoyé par Juju_41
    Goto n'est pas méchant en soi .. mais il est vrai que dans certains langages il peut générer un code pas propre du tout à la compilation. Un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
    pour i allant de 0 à 50 faire &#123;
       octetslus = lireunoctet&#40;&#41;;
       si &#40;octetslus == 0&#41; goto erreur;
    &#125;
    ...
    // fin du programme
    
    erreur&#58;
    // traitement de l'erreur
    ...
    Si le compilateur gère les boucles "pour" en utilisant la pile, et bien le goto va laisser des données dessus inutilement, ce qui est très moche
    Un compilateur raisonnablement intelligent sait qu'il est dans une (voir plusieurs) boucle(s) et qu'il la(les) gère par la pile quand il compile ce type de code.

    Il sait donc qu'il faut compiler le goto sous la forme d'une série de POP de la pile (nombre variable selon le nombre de boucles séparant le goto de son label) avant de faire le JMP.

    Un langage supportant les goto doit :
    - soit les gérer correctement (ce que font la plupart)
    - soit les interdire explicitement hors de la portée de la boucle ou de la fonction en cours, parce que sinon, le programme a toutes les chances de finir par planter, vu l'incohérence de la pile au bout de quelques appels/boucles/sauts.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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