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

  1. #1
    Membre du Club
    [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é
    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
    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
    Membre confirmé
    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é
    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
    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é
    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
    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é
    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
    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é
    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
    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 confirmé
    Remarque : si le langage implémente les exceptions, plus besoin de on error goto

  14. #14
    Membre régulier
    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
    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
    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
    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
    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 exécutif du Scala Center à l'EPFL.
    Découvrez Mes tutoriels, ou mon logiciel phare FunLabyrinthe : un jeu de labyrinthe gratuit et personnalisable à l'infini avec des scripts Delphi-like.

  19. #19
    Membre expérimenté
    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
    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 !