Posté par uso (site web personnel) .
Évalué à 3.
Dernière modification le 04 septembre 2023 à 10:43.
Vous pouvez jeter un coup d'œil au code.
Et personnellement, j'utilise les goto, quand ça me semble simplifier le code.
Par contre, quand on lit ce code, on se dit qu'on gagnerait bien en lisibilité avec un langage structuré, et c'est probablement contre ce genre de code que Dijkstra a écrit goto-considered-harmful.
Mais ça montre aussi que l'usage de goto tel qu'on peut trouver dans un code Kernel par exemples, n'a vraiment rien à voir, avec l'usage des goto de BASIC en 79.
Posté par jseb .
Évalué à 3.
Dernière modification le 04 septembre 2023 à 11:20.
Un goto sur un label, ça passe tout de suite mieux.
Il y a des langages où le goto existe, mais est limité au bloc de définition (Lua par exemple).
Pour les cas justifiés bien sûr (pas le temps/pas possible de remonter la pile d'appel, il faut lancer une opération le plus rapidement possible).
Là, c'est du basic des années 80 avec numéro de ligne, donc le pire cas dans lequel on puisse se placer pour « goto ».
Discussions en français sur la création de jeux videos : IRC freenode / #gamedev-fr
J'ai l'impression que n'importe quel programmeur a intégré la possibilité de coder n'importe quel algorithme sans Goto dans n'importe quel langage moderne, c'est même peut-être une syntaxe que les plus jeunes ne connaissent pas du tout. Ça ne semble pas choquant de décider que c'est quelque chose à simplement oublier.
Pour remonter la pile d'appel, ça n'est pas le but des exceptions?
Tu as des cas où le traitement d'une exception c'est trop long.
Un gars dans les telecoms m'avait expliqué que si il se remontait la pile sur ses serveurs de routage de sms, il en perdait plusieurs dizaine de milliers. Donc: C + goto.
Le but est parfois de planter le plus rapidement possible.
Après tout peut se discuter, bien sûr, mais il y a la théorie, et puis ce qu'on t'alloue pour travailler en pratique (là en l'occurence, c'était dans un pays du tiers monde). Ça avait l'air de bien tourner son système.
Discussions en français sur la création de jeux videos : IRC freenode / #gamedev-fr
Le but est parfois de planter le plus rapidement possible.
Mouais… Si c'est du code qui tourne sur du matos très vieux et très lent, je veux bien… Si c'est pour planter, tu peux exit(), si tu veux récupérer quelque chose, tenter un goto sans rien savoir de l'état du programme et récupérer des trucs au pif, je ne sais pas si c'est raisonnable. Après, quand on met l'accent sur les perfs, on peut oublier tout le reste : pas besoin de tester les pointeurs null, pas besoin de pré-conditions, pas besoin de tester si les fichiers sont bien ouverts, si les malloc ont bien marché… C'est certain que quand le matériel et le contexte ne permettent pas de mettre en oeuve les bonnes pratiques, bah le code est crade :-S
Alors en C utiliser goto, est une bonne pratique, car ça te permet les goto chaîne, et justement clean les choses que tu as allouées/ouvertes.
Si tu fais du C, sans goto, ni attribute((cleanup)) ton code est crade.
Et vérifier malloc, à part si tu codes sur machine à laver/arduino ou autre machin embarqué, ça ne sert à rien, malloc ne te retourneras pas NULL s'il manque de place. (bon bien sûr, l'embarqué reste des cibles potentielles de beaucoup de lib, donc ça reste un gros use-case).
Perso, je suis un peu con, mais en général, entre deux codes, un long et sans goto, et un plus court, mais avec goto, je prends celui avec goto, et généralement, je le trouve plus simple à lire, il y a moins de code.
Reste que C/go sont assez structurés pour en avoir rarement besoins, mais dans certains rares cas, qui arrive à peu près une fois toutes les 2k lignes de code, un goto, ça simplifie le code. (sauf si on est en C, pas GNU C, dans ce cas, c'est dans une fonction sur 2 pour les erreurs).
Et si on a élevé les dev à éviter goto, c'est je pense à cause des traumatisés de BASiC, sauf que les goto en C n'ont rien à voir.
Un gars dans les telecoms m'avait expliqué que si il se remontait la pile sur ses serveurs de routage de sms, il en perdait plusieurs dizaine de milliers.
Je suis assez curieux… J'ai bossé sur un SMSC et nous devions pouvoir garder le SMS plusieurs jours au cas où le téléphone n'était pas disponible par exemple. En plus de ça à rechercher la performance brute par SMS (le temps par SMS plutôt que le nombre total de SMS qui peuvent être prix en charge), j'ai du mal à voir comment ce type de micro optimisations va s'en sortir face à toutes les bizarreries protocolaires qu'il faut prendre en compte et qui vont passer leur temps à péter des caches et autres prédictions de routage.
Il y a des langages où ça ne sert à rien.
Un GOTO en python n'aurait rigoureusement aucune utilité.
Par contre comme indiqué plus haut, en C ça reste très utile, et propre.
J'ai toujours utilisé des GOTO dans les fonctions d'allocation, ou de nettoyage, pour les gestions propres des erreurs etc.
De manière générale, le fait que tu gères toute la mémoire toi-même t'impose d'être très carré sur les allocations/libérations.
Et une fonction organisée en étapes de d'allocations suivies d'étapes de libérations inversées, avec des GOTO, c'est propre et lisible.
Par contre, utiliser GOTO pour sauter complètement ailleurs, dans une autre fonction, un autre bout de code, wahou, là c'est affolant, et à éviter !
C'est un outil, il est neutre, il faut savoir l'utiliser.
Posté par uso (site web personnel) .
Évalué à 4.
Dernière modification le 05 septembre 2023 à 11:20.
En C goto ne le permet pas, il faut passer par le couple setjmp/longjmp.
Ce qui est ultra casse-gueule, et mérite d'êtres expliqué si utilisé, mais a de rares use-case, tel que recoder des pseudo-exceptions en C. (et rendre fous qui voudrait déboguer ça).
Après les exceptions, c'est à peu près un goto, d'une fonction à une autre, mais avec des clean automatique, en plus. (et aussi forcent à sauter vers une fonction appelante, et pas le contraire).
Les generator function en js peuvent aussi s'apparenter à des goto, qui saute dans une autre function.
Bref oui, ce n'est pas ouf les goto entre des functions, mais au final la plupart des langages moderne en ont quelques utilités, si on n'a ni yield ni exeption, mais on en a l'utilité, ça reste aux dev de prendre soins de pas casser ça stack, et gérer ces ressources (et essayer de fuir le projet), mais peu encore être utils.
# Si vous voulez comprendre la haine du goto,
Posté par uso (site web personnel) . Évalué à 3. Dernière modification le 04 septembre 2023 à 10:43.
Vous pouvez jeter un coup d'œil au code.
Et personnellement, j'utilise les goto, quand ça me semble simplifier le code.
Par contre, quand on lit ce code, on se dit qu'on gagnerait bien en lisibilité avec un langage structuré, et c'est probablement contre ce genre de code que Dijkstra a écrit goto-considered-harmful.
Mais ça montre aussi que l'usage de goto tel qu'on peut trouver dans un code Kernel par exemples, n'a vraiment rien à voir, avec l'usage des goto de BASIC en 79.
[^] # Re: Si vous voulez comprendre la haine du goto,
Posté par jseb . Évalué à 3. Dernière modification le 04 septembre 2023 à 11:20.
Un goto sur un label, ça passe tout de suite mieux.
Il y a des langages où le goto existe, mais est limité au bloc de définition (Lua par exemple).
Pour les cas justifiés bien sûr (pas le temps/pas possible de remonter la pile d'appel, il faut lancer une opération le plus rapidement possible).
Là, c'est du basic des années 80 avec numéro de ligne, donc le pire cas dans lequel on puisse se placer pour « goto ».
Discussions en français sur la création de jeux videos : IRC freenode / #gamedev-fr
[^] # Re: Si vous voulez comprendre la haine du goto,
Posté par arnaudus . Évalué à 3.
J'ai l'impression que n'importe quel programmeur a intégré la possibilité de coder n'importe quel algorithme sans Goto dans n'importe quel langage moderne, c'est même peut-être une syntaxe que les plus jeunes ne connaissent pas du tout. Ça ne semble pas choquant de décider que c'est quelque chose à simplement oublier.
Pour remonter la pile d'appel, ça n'est pas le but des exceptions?
[^] # Re: Si vous voulez comprendre la haine du goto,
Posté par jseb . Évalué à 3.
Tu as des cas où le traitement d'une exception c'est trop long.
Un gars dans les telecoms m'avait expliqué que si il se remontait la pile sur ses serveurs de routage de sms, il en perdait plusieurs dizaine de milliers. Donc: C + goto.
Le but est parfois de planter le plus rapidement possible.
Après tout peut se discuter, bien sûr, mais il y a la théorie, et puis ce qu'on t'alloue pour travailler en pratique (là en l'occurence, c'était dans un pays du tiers monde). Ça avait l'air de bien tourner son système.
Discussions en français sur la création de jeux videos : IRC freenode / #gamedev-fr
[^] # Re: Si vous voulez comprendre la haine du goto,
Posté par arnaudus . Évalué à 3.
Mouais… Si c'est du code qui tourne sur du matos très vieux et très lent, je veux bien… Si c'est pour planter, tu peux exit(), si tu veux récupérer quelque chose, tenter un goto sans rien savoir de l'état du programme et récupérer des trucs au pif, je ne sais pas si c'est raisonnable. Après, quand on met l'accent sur les perfs, on peut oublier tout le reste : pas besoin de tester les pointeurs null, pas besoin de pré-conditions, pas besoin de tester si les fichiers sont bien ouverts, si les malloc ont bien marché… C'est certain que quand le matériel et le contexte ne permettent pas de mettre en oeuve les bonnes pratiques, bah le code est crade :-S
[^] # Re: Si vous voulez comprendre la haine du goto,
Posté par uso (site web personnel) . Évalué à 6.
Alors en C utiliser goto, est une bonne pratique, car ça te permet les goto chaîne, et justement clean les choses que tu as allouées/ouvertes.
Si tu fais du C, sans goto, ni attribute((cleanup)) ton code est crade.
Et vérifier malloc, à part si tu codes sur machine à laver/arduino ou autre machin embarqué, ça ne sert à rien, malloc ne te retourneras pas NULL s'il manque de place. (bon bien sûr, l'embarqué reste des cibles potentielles de beaucoup de lib, donc ça reste un gros use-case).
Perso, je suis un peu con, mais en général, entre deux codes, un long et sans goto, et un plus court, mais avec goto, je prends celui avec goto, et généralement, je le trouve plus simple à lire, il y a moins de code.
Reste que C/go sont assez structurés pour en avoir rarement besoins, mais dans certains rares cas, qui arrive à peu près une fois toutes les 2k lignes de code, un goto, ça simplifie le code. (sauf si on est en C, pas GNU C, dans ce cas, c'est dans une fonction sur 2 pour les erreurs).
Et si on a élevé les dev à éviter goto, c'est je pense à cause des traumatisés de BASiC, sauf que les goto en C n'ont rien à voir.
[^] # Re: Si vous voulez comprendre la haine du goto,
Posté par barmic 🦦 . Évalué à 4.
Je suis assez curieux… J'ai bossé sur un SMSC et nous devions pouvoir garder le SMS plusieurs jours au cas où le téléphone n'était pas disponible par exemple. En plus de ça à rechercher la performance brute par SMS (le temps par SMS plutôt que le nombre total de SMS qui peuvent être prix en charge), j'ai du mal à voir comment ce type de micro optimisations va s'en sortir face à toutes les bizarreries protocolaires qu'il faut prendre en compte et qui vont passer leur temps à péter des caches et autres prédictions de routage.
J'en suis très heureux pour lui
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: Si vous voulez comprendre la haine du goto,
Posté par jseb . Évalué à 3.
J'ai oublié de dire que le goto, c'était en cas de plantage.
Discussions en français sur la création de jeux videos : IRC freenode / #gamedev-fr
[^] # Re: Si vous voulez comprendre la haine du goto,
Posté par Yth (Mastodon) . Évalué à 3.
Il y a des langages où ça ne sert à rien.
Un GOTO en python n'aurait rigoureusement aucune utilité.
Par contre comme indiqué plus haut, en C ça reste très utile, et propre.
J'ai toujours utilisé des GOTO dans les fonctions d'allocation, ou de nettoyage, pour les gestions propres des erreurs etc.
De manière générale, le fait que tu gères toute la mémoire toi-même t'impose d'être très carré sur les allocations/libérations.
Et une fonction organisée en étapes de d'allocations suivies d'étapes de libérations inversées, avec des GOTO, c'est propre et lisible.
Par contre, utiliser GOTO pour sauter complètement ailleurs, dans une autre fonction, un autre bout de code, wahou, là c'est affolant, et à éviter !
C'est un outil, il est neutre, il faut savoir l'utiliser.
[^] # Re: Si vous voulez comprendre la haine du goto,
Posté par uso (site web personnel) . Évalué à 4. Dernière modification le 05 septembre 2023 à 11:20.
En C goto ne le permet pas, il faut passer par le couple setjmp/longjmp.
Ce qui est ultra casse-gueule, et mérite d'êtres expliqué si utilisé, mais a de rares use-case, tel que recoder des pseudo-exceptions en C. (et rendre fous qui voudrait déboguer ça).
Après les exceptions, c'est à peu près un goto, d'une fonction à une autre, mais avec des clean automatique, en plus. (et aussi forcent à sauter vers une fonction appelante, et pas le contraire).
Les generator function en js peuvent aussi s'apparenter à des goto, qui saute dans une autre function.
Bref oui, ce n'est pas ouf les goto entre des functions, mais au final la plupart des langages moderne en ont quelques utilités, si on n'a ni yield ni exeption, mais on en a l'utilité, ça reste aux dev de prendre soins de pas casser ça stack, et gérer ces ressources (et essayer de fuir le projet), mais peu encore être utils.
[^] # Re: Si vous voulez comprendre la haine du goto,
Posté par uso (site web personnel) . Évalué à 2.
Âpres lua n'a pas de
continue
(ou n'en avait pas en 5.3), donc legoto
en lua est ultra-utile juste pour remplacer lescontinue
.# On est où là ?...
Posté par AncalagonTotof . Évalué à 2.
Hebdogiciel ?…
(un lien plus visuel)
[^] # Re: On est où là ?...
Posté par jseb . Évalué à 6.
Tu vas imprimer le listing pour le taper à la main, à l'ancienne ? :þ
Discussions en français sur la création de jeux videos : IRC freenode / #gamedev-fr
[^] # Re: On est où là ?...
Posté par AncalagonTotof . Évalué à 2. Dernière modification le 04 septembre 2023 à 20:47.
Impossible, j'ai plus ma Seikosha SP1000A ni de papier à bande Caroll !
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.