Goto (informatique)

L’instructiongoto(littéralementva à) est uneinstructionprésente dans de nombreuxlangages de programmation. Elle est utilisée pour réaliser dessauts inconditionnelsdans un programme, changeant ainsi leflot de contrôlenaturel du programme qui consiste à aller exécuter l'instruction suivante. L’exécution est alors envoyée à une autre instruction repérée par une étiquette oulabel, qui est soit un numéro de ligne, soit une étiquette déclarée, selon le langage.
L’instructiongoto, directement héritée des instructions de saut des langages machines, était nécessaire dans les langages primitifs (Fortranpré-90,BASIC) comme instruction de base permettant de réaliser des boucles et autres structures de contrôles.
Depuis la révolution de laprogrammation structuréedesannées 1970, l’instructiongoton’est plus guère appréciée des programmeurs modernes, car elle rend souvent les programmes plus difficiles à comprendre et à maintenir (on parle dans ce cas deprogrammation spaghetti). On utilise plus généralement des structures comme les conditionnelles (if .. then .. else ..) ou les boucles (for,while,etc.) qui font partie intégrante de tous les langages de programmation impératifs modernes.
Dans certains langages, d’autres instructions effectuent des sauts inconditionnels et remplacent quelques usages de l’instructiongoto. C’est le cas des instructions commecontinueoubreak, que l’on trouve dans les langages dérivés duCet qui ont l'avantage de ne pas détourner le flot naturel de contrôle vers une instruction qui se trouve plus loin dans l'ordre textuel du programme, et desexceptions. On peut obtenir un comportement similaire avec lecall/ccdeScheme, oucatch...throwenRubyetCommon Lisp(sans rapport avec les exceptions dans ces deux langages).
Edsger DijkstraetNiklaus Wirthont défendu l'idée selon laquelle l'instructiongotone peut que mener à du code illisible. D'autres, commeLinus TorvaldsouRobert Love(en), ont fait remarquer que même si elle incite à produire ducode spaghetti, l'instructiongotopeut être appréciable et rendre au contraire le code plus lisible, lorsqu'elle est employée à bon escient. D'ailleurs, dans leur livreThe Elements of Programming Style(en),KernighanetPlauger(en)indiquent comment écrire du code structuré enFortranet enPL/I, tout en faisant intensivement appel à l'instructiongoto. Par ailleurs, l'usage degotopeut être rendu plus clair avec des étiquettes suffisamment descriptives, ce qui est possible lorsque les étiquettes sont alphanumériques, comme enC, mais ce qui n'est pas le cas enBASIC(standard ANSI X3.113),Pascal(standard ISO 7185) ou en Fortran (toutes les versions du standard), qui ont des étiquettes numériques.
L’instructiongoto(ou équivalent) apparaît notamment dans les langages suivants :
EnJavagotoest un mot réservé. Or comme l'instructiongoton'existe pas,gotodevient un mot interdit et cela a pour effet, entre autres, d’empêcher l’emploi degotocomme nom de variable.
En1966, lethéorème de Böhm-Jacopini(en)a démontré que tout programme comportant desgotopouvait être transformé en programme n’utilisant que des branchements conditionnels (if,then,else) ou des boucles (whileconditiondoinstructions), éventuellement en dupliquant des portions de codes et/ou en utilisant des variables intermédiaires. Plus tard les deux auteurs ont montré que les branchements conditionnels pouvaient eux-mêmes être remplacés par des boucles.
Dans des langages ne comportant pas degoto, certains programmeurs restent convaincus (à tort ou à raison) de l’intérêt de les employer, néanmoins. Il s’est alors développé une méthode d’émulation. Concrètement, il s’agit de placer le label dans une variable que le code recherche durant son exécution:
Les libellés peuvent être des chaînes ou des nombres, y compris des expressions et il est possible d’aller plus loin et de ne pas se restreindre à un ensemble de points et représenter les libellés par des ensembles d’intervalles, deplansou d’hyperplans. L’inconvénient de cette méthode est alors qu’il faut attendre que toutes les instructions de la boucleswhilesoient exécutées pour que le saut inconditionnel soit réalisé, ce qui dégrade les performances.
Cette construction a été employée parKnuthpour démontrer qu'il était possible d'écrire du code non structuré sansgoto. Il s'agit alors d'unantipattern, c'est-à-dire d'un exemple de ce qu'il ne faut pas faire.
Les fonctionssetjmpetlongjmp, disponibles sur certains systèmes d’exploitation, permettent aussi d’émuler l’instructiongoto. Mais ces instructions de saut inconditionnel sont surtout utilisées pour implémenter un système de gestion des exceptions.
L’utilisation d’exception est par exemple un pattern courant enPythonpour sortir d’une double boucle :
Bien que lors du meeting pré-ALGOL tenue en 1959,Heinz Zemanekait explicitement exprimé des doutes sur la nécessité du GOTO, à l'époque, personne n'y prête attention, y comprisEdsger Dijkstra, qui deviendra plus tard un opposant emblématique de l'instruction GOTO. Les années 1970 et 1980 ont connu une baisse de l'utilisation des GOTO en faveur de la «programmation structurée», en effet, l'instruction GOTO amenait à un «code spaghettiinmaintenable ». Certaines normes destyle de programmationdéconseillent l'utilisation des instructions GOTO. Il a, cependant, suscité un débat important parmi les informaticiens, éducateurs, concepteurs de langage et les programmeurs d'applications qui ont vu un changement lent, mais régulier, de l'usage autrefois omniprésent du GOTO. La critique probablement la plus célèbre de l'instruction GOTO est une lettre à l'éditeur des Comm. of the ACM de 1968 dû à Edsger Dijkstra intituléeGo To Statement Considered Harmful. Dans cette lettre à l'éditeur, Dijkstra a fait valoir que les instructions GOTO devraient être supprimés dans les langages de niveau supérieurcar ils compliquent la compréhension, la maîtrise, l'analyse, la vérification et la maintenance des programmes, tout en y introduisant des erreurs difficiles à diagnostiquer. Cette diatribe a initié un débat, notamment 19 ans après à une époque où les langages déclaratifs ont déjà pris de l'ampleur, une lettreGOTO Considered Harmful. Un autre point de vue plus synchronique est présenté parDonald KnuthdansStructured Programming with go to Statements, où il analyse de nombreuses tâches de programmation, dans lesquelles il constate que, dans certaines d'entre elles, le GOTO est la construction de la langue la plus optimale à utiliser. Des codeurs dunoyau LinuxcommeLinus TorvaldsouSteve McConnell, se démarquent du point de vue de Dijkstra, indiquant que le GOTO peut amener à une l'amélioration de la performance du programme, de la taille et de la clarté du code, mais seulement lorsqu'il est utilisé de manière raisonnable. SelonJohn Regehr, en 2013, il y avait environ 100 000 instructions GOTO dans le code du noyau Linux. En effet, le GOTO est souvent le résultat de code C produit automatiquement, par exemple dans la traduction d'unautomate. En 2016, il est inexistant dans les langages de haut niveau. Le langage C est devenu plutôt un langage dans lequel d'autre logiciels produisent du code (voir l'articlelangage dédié).