Goto
314779
28809162
2008-04-20T07:47:45Z
VolkovBot
198153
robot Ajoute: [[tr:GOTO]]
L'instruction '''<code>goto</code>''' (de l'anglais ''go to'', en français ''aller à'') est une [[instruction (informatique)|instruction]] présente dans de nombreux [[Langage de programmation|langages de programmation]]. Elle est utilisée pour réaliser des sauts inconditionnels dans un programme. L'exécution est renvoyée vers une étiquette ou ''label'', qui est soit un numéro de ligne donné, soit une étiquette déclarée, selon le langage.
L'instruction <code>goto</code>, directement héritée des instructions de saut des langages machines, était nécessaire dans les langages primitifs (Fortran II/IV, BASIC) comme instruction de base permettant de réaliser des boucles et autres structures de contrôles.
Depuis la révolution de la [[programmation structurée]] des [[années 1970]], l'instruction <code>goto</code> n'est guère appréciée des programmeurs modernes, car elle rend souvent les programmes plus difficiles à comprendre et à maintenir (on parle dans ce cas de ''[[programmation spaghetti]]''). On utilise plus généralement des structures comme les sauts conditionnels ('''si .. alors .. sinon ..''') ou les boucles ('''pour''', '''tant que''', etc.) qui font partie intégrante de tous les langages de programmation modernes.
Dans certains langages, d'autres instructions effectuent des sauts inconditionnels et remplacent quelques usages de l'instruction <code>goto</code>. C'est le cas des instructions comme <code>continue</code> ou <code>break</code>, que l'on trouve dans les langages dérivés du [[C (langage)|C]], et des [[Système de gestion d'exceptions|exceptions]].
== Langages ==
L'instruction <code>goto</code> (ou équivalent) apparaît notamment dans les langages suivants :
* [[Assembleur]]
* [[BASIC]]
* [[C (langage)|C]]
* [[C++]]
* [[C sharp|C#]]
* [[Cobol]]
* [[Fortran]]
* [[Pascal (langage)|Pascal]]
* [[Perl (langage)|Perl]]
L'instruction <code>goto</code> est un mot réservé en [[Java (langage)|Java]] mais il est interdit de l'utiliser (cela a pour effet, par exemple, d'empêcher l'emploi de <code>goto</code> comme nom de variable)
== Émulation ==
En [[1966]], le [[théorème de Böhm et Jacopini]] a démontré que tout programme comportant des <code>goto</code> pouvait être transformé en programme n'utilisant que des branchements conditionnels (<code>if</code>, <code>then</code>, <code>else</code>) ou des boucles (<code>while</code> ''condition'' <code>do</code> ''instructions''), é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.
=== Méthode de Jacopini ===
Bien que des langages ne comportent pas de <code>goto</code>, certains programmeurs sont convaincus (à tort ou à raison) de l'intérêt de les employer. Il s'est alors développé une méthode d'émulation. Concrètement, il s'agit de placer le label dans une variable et de la chercher durant tout le code. Ainsi, on a :
''% Début de programme''
goto = -1 ''% pas de saut''
while (goto < 0) {
''% zone sans libellé''
}
if (goto == 0) {
''% Toute la partie de libellé 0
}
else if (goto == 1) {
''% Toute la partie de libellé 1''
}
''% ...''
else if (goto == ''n'') {
''% Toute la partie de libellé ''n
}
On voit d'abord que les libellés peuvent être des chaînes ou des nombres, y compris des expressions. Il est possible d'aller plus loin et de ne pas se restreindre à un ensemble de points pour représenter les libellés. On peut ainsi les représenter par des ensembles d'[[Intervalle (mathématiques)|intervalles]], de [[Plan (mathématiques)|plans]] et d'[[Hyperplan|hyperplans]]. L'inconvénient de cette méthode est qu'il faut attendre que toutes les instructions de la boucles <code>while</code> soient terminées pour que le saut inconditionnel soit réalisé.
=== Exceptions ===
Les fonctions <code>setjmp</code> et <code>longjmp</code>, disponibles sur certains systèmes d'exploitation, permettent aussi d'émuler l'instruction <code>goto</code>. Mais ces instructions de saut inconditionnel sont surtout utilisées pour implanter un système de gestion des exceptions.
L'utilisation d'exception est par exemple un pattern courant en [[Python (langage)|Python]] pour sortir d'une double boucle :
<source lang="python">
try:
for i in range(10):
for j in range(10):
if TABLE[i][j] == 1:
raise StopIteration
except StopIteration:
pass
</source>
== Anecdotes ==
Les premières versions d'Algol 60 réalisées en France avaient traduit tous les mots clés du langage et tout naturellement l'instruction '''goto''' s'appelait '''allera'''.
Goto est un authentique patronyme japonais et [[Donald Knuth]] plaisantait sur ce pauvre Monsieur Goto que tout le monde rejetait.
== Voir aussi ==
* [http://articles.mongueurs.net/magazines/linuxmag72.html Goto Perl] Article publié dans Linux Magazine 72, mai 2005.
* {{en}} [http://www.acm.org/classics/oct95 Go To Statement Considered Harmful] [[Edsger Dijkstra]] ([[1968]])
* {{en}} [http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf structured programming with goto statements] (pdf) [[Donald Knuth]] ([[1974]])
{{Portail informatique}}
[[Catégorie:Structure de contrôle]]
[[ca:GOTO]]
[[de:Sprunganweisung]]
[[en:Goto]]
[[es:GOTO]]
[[he:פקודת goto]]
[[it:GOTO]]
[[ja:Goto文]]
[[ko:GOTO문]]
[[nl:GOTO]]
[[pl:Goto]]
[[pt:Goto (programação)]]
[[ru:GOTO]]
[[sv:Goto]]
[[tr:GOTO]]
[[uk:Безумовний перехід]]