• # Si vous voulez comprendre la haine du goto,

    Posté par  (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  . É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  . É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  . É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  . Évalué à 3.

            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

            • [^] # Re: Si vous voulez comprendre la haine du goto,

              Posté par  (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  . Évalué à 4.

            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.

            Ça avait l'air de bien tourner son système.

            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  (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.

          • Yth.
          • [^] # Re: Si vous voulez comprendre la haine du goto,

            Posté par  (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  (site web personnel) . Évalué à 2.

        Il y a des langages où le goto existe, mais est limité au bloc de définition (Lua par exemple).

        Âpres lua n'a pas de continue (ou n'en avait pas en 5.3), donc le goto en lua est ultra-utile juste pour remplacer les continue.

  • # On est où là ?...

    Posté par  . Évalué à 2.

    • [^] # Re: On est où là ?...

      Posté par  . É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  . É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.