Le topic qui vaudra mon ban : GOTO

Pages: [1]

Morsula

  • Membre
  • 4745 posts
25 mars 2012, 23:38
Voilà, heureux de vous avoir connu :'(

Sérieux, qu'est-ce que vous avez, vous les universitaires, contre l'utilisation du GOTO ? Quand tu penses qu'un mec l'a inventé et qu'on nous interdirait de l'utiliser sous prétexte que c'est sale. Il y a un tabou qui ne me plaît guère sur ce sujet :°)

Cliché rébarbatif

  • Membre
  • 7992 posts
25 mars 2012, 23:44
C'est quoi goto ?

likam

  • Membre
  • 2355 posts

Morsula

  • Membre
  • 4745 posts

LLdex

  • Membre
  • 147 posts
26 mars 2012, 00:01
En gros, en général on n'aime pas trop ça parce que ça « casse » le flux d'exécution du programme.
Par exemple, si tu mets un label (le truc qui sert d'étiquette pour le GOTO) dans un bloc de portée différente du GOTO qui renvoie vers lui, le programme aura un comportement indéterminé.

Petit exemple en pseudo-code de ce qu'il ne faut SURTOUT JAMAIS faire :

if (foo == bar)
  label :foobar
  print "foo vaut bar"
else
  goto :foobar
end if

Ici, le programme va retourner dans la première partie du if même si la condition est fausse, et il risque, selon l'implémentation du langage, de réexécuter le else indéfiniment.

Ou encore :

i = 0
while (i < 10) do
  label :foobar
  print "i est inférieur à 10"
  i = i + 1
done
goto :foobar

Là, l'intérieur de la boucle est exécuté alors que i vaut 10 à sa sortie, donc la condition n'est plus censée être vérifiée.

Encore pire :

for (i = 0, i < 10, i = i + 1) do
  label :foobar
  print "i est inférieur à 10"
done
goto :foobar

i n'a de portée que dans le for ; il est initialisé quand la boucle commence et il est « détruit » à sa sortie.
Or, on demande au programme d'y retourner, mais ça ne peut pas fonctionner puisque le for a besoin de i pour savoir où il en est.
Le flux d'exécution est complètement brisé ici.

Si tu veux vraiment utiliser le GOTO, je te conseille le GOTO++, un langage français très sérieux au rayonnement international (le mieux c'est de commencer par lire le manuel).  ;D

Cocktail monotone

  • Membre
  • 13874 posts
26 mars 2012, 16:49
J'ai pas lu le post de LL.
Mais je crois que goto c'est une commande en programmation objet qui permet de faire aller quelque chose quelque part.

LLdex

  • Membre
  • 147 posts
26 mars 2012, 17:14
:captainobvious.jpg:

C'est plutôt utilisé en non-objet en fait, par exemple en Batch (commandes DOS) où c'est le seul moyen de faire des boucles.

Efferalgan

  • Membre
  • 4020 posts
26 mars 2012, 18:00
LLdex : "Si vous utilisez une commande n'importe comment, ça fait n'importe quoi, attention."

Je programme pour ma part très peu (Maple et Basic Casio), et je suis plutôt tourné vers la politique du "on fait avec ce qu'on a". Un programme sur calculette ne sera jamais hyper long, et donc il est généralement assez facile de voir où les Goto mènent, et il serait stupide de s'en priver, parce que t'as pas beaucoup d'autres commandes, et que de toute façon, ton code sera pas lisible (non, la calculette ne gère pas les tabulations).

M2K

  • Membre
  • 26756 posts
26 mars 2012, 18:02
"Si vous utilisez une commande n'importe comment, ça fait n'importe quoi, attention."

lapalissade

Efferalgan

  • Membre
  • 4020 posts
26 mars 2012, 18:04
Merci, M2K, pour cette remarque constructive.

M2K

  • Membre
  • 26756 posts
26 mars 2012, 18:06
Si t'as un cerveau tu comprendras que j'ai dit "lapalissade" comme j'aurai pu dire "Oh, et en quoi cela diffère t-il des autres langages".

Efferalgan

  • Membre
  • 4020 posts
26 mars 2012, 18:10
Ça n'en diffère pas.

LLdex

  • Membre
  • 147 posts
26 mars 2012, 18:11
LLdex : "Si vous utilisez une commande n'importe comment, ça fait n'importe quoi, attention."

Je programme pour ma part très peu (Maple et Basic Casio), et je suis plutôt tourné vers la politique du "on fait avec ce qu'on a". Un programme sur calculette ne sera jamais hyper long, et donc il est généralement assez facile de voir où les Goto mènent, et il serait stupide de s'en priver, parce que t'as pas beaucoup d'autres commandes, et que de toute façon, ton code sera pas lisible (non, la calculette ne gère pas les tabulations).

C'est justement ce que j'ai dit en parlant du Batch, il y a des langages où tu ne peux pas faire autrement (j'ai fait du TI-Basic et c'est une instruction plus ou moins incontournable).

Mais dans la plupart des langages « évolués », il vaut mieux ne pas s'en servir, car la continuité du flux d'exécution est souvent très importante (surtout en multithread par exemple).

Avec les fonctions et les boucles, normalement tu dois pouvoir te passer de GOTO.

Efferalgan

  • Membre
  • 4020 posts
26 mars 2012, 18:14
On est d'accord.

Edualc

  • Membre
  • 7361 posts
26 mars 2012, 20:16
Voilà, heureux de vous avoir connu :'(

Sérieux, qu'est-ce que vous avez, vous les universitaires, contre l'utilisation du GOTO ? Quand tu penses qu'un mec l'a inventé et qu'on nous interdirait de l'utiliser sous prétexte que c'est sale. Il y a un tabou qui ne me plaît guère sur ce sujet :°)

Sérieux, qu'est-ce que vous avez, vous les bidouilleurs, pour l'utilisation du GOTO ?
Quand tu penses qu'un mec a inventé les structures de contrôles (if, while, toussa) et qu'un autre a inventé les fonctions;  et qu'on nous dirait de faire des GOTO à la place sous prétexte qu'on peut. Il y a un tabou qui ne me plaît guère sur ce sujet :°)


Plus sérieusement, un goto, c'était bien il y a 40 ans. Maintenant, il y a mieux: aussi performant (si ton compilo/interpreteur est pas en bois), plus maintenable, plus lisible, plus réutilisable, plus structuré, plus évolutif, plus propre.
Il n'y a aucun taboo: c'est juste qu'il y a largement mieux pour toutes les situations. Du coup, un type qui te sort un goto, c'est un type qui ne sait pas programmer.

Donne moi UN exemple où le GOTO a un intérêt. Sérieusement. Non mais sérieusement. Soit ça permet de gérer des conditions, mais c'est moins bien que des if while for et compagnie, soit ça permet de la factorisation de code, mais c'est moins bien que les fonctions.

Tu vois le problème sous un mauvais angle: ce n'est pas parce que ça a été inventé que c'est bien. Ca a été inventé, puis remplacé parceque ce n'était PAS bien. Il n'y a AUCUN intérêt à utiliser des goto, aucun, c'est travailler avec des outils du passé, qui  ont été remplacés pour tout un tas de raisons par d'autres instructions. Et il y a plus d'universitaires qui vont te parler de goto avec toutes leurs merdes théoriques que de pro. Parle à ton patron de goto; s'il a eu une formation en info... GOTO la_porte.



PS: l'intérêt du goto c'est en langage machine, car le reste existe pas, et quand tu compiles, tes fonctions, if et autres sont transformés en goto par le compilateur.

PPS: ça a aussi de l'intérêt dans les langages où il y a pas de fonctions et de if etc. Ahem.

PPPS: dans une autre mesure, faire un switch pour tester le type d'un objet est tout aussi sale en POO. Je troll même pas, le switch est le goto de la POO (qu'est-ce qu'on a pu me casser le crâne avec ça)

Donc t'aimes les goto? C'est cool, mais oublie, car sinon un jour, tôt ou tard, tu vas en chier, méchamment, alors que ça aurait été plus simple de s'en passer. Prend vite le bon plie, sinon tu le regretteras plus tard.
« Modifié: 26 mars 2012, 20:19 par Edualc »

Morsula

  • Membre
  • 4745 posts
26 mars 2012, 20:51
Je sais que c'est sale de programmer avec GOTO mais j'ai quand même réussi à en placer quatre dans mon programme en PureBasic (sur les 6 prévus), plus par flemme de faire un If ... ElseIf ... EndIf que par réelle conviction pour l'archaïsme.

Edualc

  • Membre
  • 7361 posts
26 mars 2012, 20:55
Mais c'est pas plus chiant de foutre des goto!? C'est un putain de brain fuck des fois en plus, alors que les if ça se remplit de manière quasi-automatique.

Morsula

  • Membre
  • 4745 posts
26 mars 2012, 22:15
Bof, non, du moins pas dans mon cas pour le petit programme en mode console de conversion décimal/hexadécimal/binaire que je fais. J'ai une structure simple donc foutre quelques GOTO c'est pas ce qui va rendre mon programme incompréhensible et plus lent.

Après ouais, ça serait plus propre de le faire avec des Si imbriqués :°)

Cliché rébarbatif

  • Membre
  • 7992 posts
26 mars 2012, 23:05
Non mais goto poubelle.

Ça n'aurait jamais du exister.

Edualc

  • Membre
  • 7361 posts
26 mars 2012, 23:20
Bof, non, du moins pas dans mon cas pour le petit programme en mode console de conversion décimal/hexadécimal/binaire que je fais. J'ai une structure simple donc foutre quelques GOTO c'est pas ce qui va rendre mon programme incompréhensible et plus lent.

Après ouais, ça serait plus propre de le faire avec des Si imbriqués :°)
Des si imbriqués? Ca existe?[/troll]
c/c moi ton code petit joueur.

Weby

  • Membre
  • 56564 posts
27 mars 2012, 16:41
Dans certains langages et/ou sur certains interpréteurs, le goto est obligatoire, de par l'inexistance des fonctions et des boucles if/for/while/switch. Je pense au code ISO qu'utilisent les machines à commande numérique (pour l'usinage de matériaux etc) ou c'est du procédural pur (si tu sautes une étape, ta pièce est foutue, ou ton outil, ou la machine, ou même les trois). Le goto permet de faire une boucle toute simple.

Morsula

  • Membre
  • 4745 posts
27 mars 2012, 20:38


Edualc va mourir d'une crise cardiaque :baffan:

LLdex

  • Membre
  • 147 posts
27 mars 2012, 22:03
C'est quoi ce langage ? PureBasic ?
Je connais pas vraiment ce genre de trucs, mais il doit bien y avoir possibilité de définir des fonctions, non ?
Utiliser des GOTO et des labels pour exécuter des routines, ça se fait en assembleur, mais si tu peux utiliser des fonctions, c'est ce qu'il faut privilégier.

En plus, t'as merdé sur ton indentation (lignes 28 à 31).  :huhu:

Et tu dois pouvoir utiliser un Select…Case au lieu de tous tes If imbriqués, en transformant Choix$, qui semble être une chaîne, en entier avec Val(Choix$) au prélable (Select…Case ne semble accepter que des entiers).
« Modifié: 27 mars 2012, 22:04 par LLdex »

Weby

  • Membre
  • 56564 posts
27 mars 2012, 23:17
Y'a aussi les scripts dans les jeux Pokémon qui fonctionnent beaucoup à base de goto, bien que ces goto soient plutôt des appels à des sous-programmes qu'autre chose.

Edualc

  • Membre
  • 7361 posts
27 mars 2012, 23:37


Edualc va mourir d'une crise cardiaque :baffan:
Beh oui, beh voilà, bah je ne vois pas l'intérêt, sauf si tu ne peux faire que des goto dans ton langage que je ne connais pas... (et à en croire tes messages sur FB, il me semble que ce n'est pas le cas.)

Que dire?
Un switch case dans un do while qui appelle des fonctions.

Plouf.

Weby

  • Membre
  • 56564 posts
27 mars 2012, 23:47
If Choix$ = "1"
  //inserer ici le code complet de DecBin
ElseIf Choix$ = "2"
  //inserer ici le code complet de BinDec

Etc.

Edualc

  • Membre
  • 7361 posts
27 mars 2012, 23:54
En sortant de DecBin et co. faut aussi retomber au bon endroit, et dès que ton programme sera un peu plus grand, ça ne sera plus jouable. Plus du tout.

LLdex

  • Membre
  • 147 posts
27 mars 2012, 23:54
Y'a aussi les scripts dans les jeux Pokémon qui fonctionnent beaucoup à base de goto, bien que ces goto soient plutôt des appels à des sous-programmes qu'autre chose.

Les scripts dans Pokémon, c'est pas une simple représentation du code binaire qui est derrière ?
Comme de l'assembleur, qui se traduit quasiment directement en code machine sans vraie compilation.

Ça explique les GOTO, qui ne seraient que des instructions de branchement (JMP, JE, JNE, etc) vers des routines.
Enfin, je ne connais pas vraiment les scripts dans Pokémon, je laisse ça aux pros de la section Rom-Hacking.
« Modifié: 27 mars 2012, 23:56 par LLdex »

Weby

  • Membre
  • 56564 posts
28 mars 2012, 00:21
C'est en effet un langage bas niveau, mais tout de même très compréhensible.

LLdex

  • Membre
  • 147 posts
28 mars 2012, 00:26
J'ai pas dit le contraire.
D'ailleurs, après vérification sur le tuto de Sainior, ça ressemble en effet beaucoup à de l'ASM.

Pages: [1]    En haut ↑