Publication

Chaque semaine, le lundi, retrouvez une petite actualité ou une petite astuce sur la programmation, Nuked-Klan et l'informatique en général.

lundi 12 septembre 2011

Les boucles infinie insoluble ?

Aujourd'hui je fais une réaction un peu tardive sur un article de Korben à propos d'un étudiant qui aurait réussi à concevoir un programme permettant de sortir d'une boucle infinie.

Malheureusement pour lui, un tel programme ne peux pas exister.


Je m'explique. La théorie de l'étudiant est que si le programme revient toujours au même état mémoire dans une boucle, alors il considère que cette boucle est infinie, ce qui est tout à fait faux.

Il y a le cas où les variables du programme continue d'évoluer dans la boucle infinie. Le programme ne repasse alors jamais deux fois dans l'état mémoire alors que la boucle ne se termine jamais.

Voici un petit exemple de boucle en C très simple qui ne repasse jamais pas le même état mémoire :
int i;
for (i = 0; i > -1; i++)
{ }
La boucle ne revient jamais au même état mémoire (une variable évolue constamment) et donc ne serait jamais qualifié de boucle infinie par un programme analysant la mémoire. Pourtant le programme ne sortira théoriquement jamais de sa boucle.

NB : En réalité cette dernière boucle a bien une fin. Quelqu'un serait-il capable de dire pourquoi ? :p

Il existe le cas aussi tout à fait contraire. Une boucle qui attends l'appui d'une touche (donc un événement externe) est une boucle dont l'état mémoire n'évolue pas alors qu'elle a bien une fin !

Il y a aussi bien évidemment le fameux paradox de la boucle infinie :

Etiquette Debut
Si c'est une boucle infinie alors fin
Sinon, retourner à Debut

Si ce n'est pas une boucle infinie, alors on retourne au début et on rentre alors dans une boucle infinie (paradoxe !), et si c'est une boucle infinie, on quitte le programme (et donc ce n'est pas une boucle infinie, paradoxe !).

3 commentaires:

  1. Ca dépends du langage, mais lorsque i va dépasser le max, alors soit une exception va etre relevée soit i va repartir a moins la valeur max.

    Le meilleur moyen pour détecter une boucle infinie reste une analyse Heuristique.

    RépondreSupprimer
  2. au "hasard" je dirais que lorsque i va atteindre la valeurs de 2147483647(taille max d'un int) va planté ? Après je peux me tromper et j'ai pas vraiment le temps d'y penser plus longtemps ^^'

    RépondreSupprimer
  3. Effectivement la réaction au dépassement de capacité dépend du langage de programmation. C'est la raison pour laquelle j'ai précisé dans quelle langage cette boucle a été réalisé.

    En C une fois arrivé au chiffre maximum, on repart au minimum. Là cette boucle s'arrêtera = int_max + 1.

    RépondreSupprimer