GOTO : Fortran, C, C++, Java, C# et PHP

Lors des formations sur les langages de développement que je réalise, il y a toujours un moment fort lorsque les stagiaires sont des développeurs : la discussion sur le GOTO !

Discussion dont la longueur est très variable suivant le langage. En Fortran 77, il est impossible de quitter une boucle DO sans utiliser le GOTO. Ce n’est que dans des versions plus récentes de la norme que sont apparus CYCLE et EXIT.

Mais pourquoi des langages plus modernes, comme CC++ ou C#, continuent-ils à disposer d’une instruction GOTO ? Et pourquoi la dernière version de PHP (5.3) a-t-elle introduit cette instruction qui n’existait pas dans les versions précédentes ?

Les critiques sur le GOTO datent d’un article de 1968 Go To Statement Considered Harmful, écrit par Dijkstra. Vous trouverez dans l’article Goto Perl l’histoire détaillée de cet article et la polémique qui en a résulté. Polémique qui a dégénéré en réponses dogmatiques : « GOTO c’est mal » et « il ne faut pas utiliser GOTO ».

Certes, mais comment résoudre un problème d’algorithmique courant : la sortie de deux boucles imbriquées ? Pour y répondre, j’ai parfois vu des constructions alambiquées, utilisant des variables logiques, transformant des boucles à nombres d’itération connus (par exemple un parcours de matrice suivant les lignes et les colonnes) en boucles WHILE incompréhensibles demandant trois lectures pour commencer à entrevoir le traitement effectué.

Or, que reproche-t-on à GOTO ? De conduire à du code incompréhensible à un humain …

Le principal cas où il faut utiliser le GOTO dans des langages comme C, C++, C# ou PHP est la rupture de boucle. Ces quatre langages proposent les instructions break et continue pour quitter une boucle. Mais ils ne proposent pas la syntaxe break n du Java qui permet de quitter plusieurs boucles imbriquées. D’où la nécessité de disposer de l’instruction GOTO.

Suivant les cas, il peut également être légitime d’utiliser GOTO lorsqu’une erreur ou un évènement externe à l’algorithme se produit, lorsqu’on ne peut pas ou on ne veut pas utiliser d’exception.