« Boucle infinie » : différence entre les versions

Un article de Wikipédia, l'encyclopédie libre.
Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Mathious Ier (discuter | contributions)
Aucun résumé des modifications
Balises : Modification par mobile Modification par le web mobile
 
(31 versions intermédiaires par 26 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
{{Ébauche|informatique}}
{{Ébauche|informatique}}
{{Voir homonyme|Infinite Loop}}
{{Voir homonyme|Infinite Loop}}
[[Image:Infinite loop BSOD.jpg|thumb|[[Écran bleu de la mort]] à cause d'une boucle infinie.]]


En [[programmation informatique]], une '''boucle infinie''' désigne une [[Structure de contrôle#Boucles|boucle]] dont la condition de sortie n'a pas été définie ou ne peut pas être satisfaite. En conséquence, la boucle ne peut se terminer qu'à l'interruption du [[Programme informatique|programme]] qui l'utilise. Les boucles infinies peuvent engendrer des [[Bug informatique|bugs]].
Une <dfn>boucle infinie</dfn> est, en [[programmation informatique]], une [[Structure de contrôle#Boucles|boucle]] dont la condition de sortie n'a pas été définie ou ne peut pas être satisfaite. En conséquence, la boucle ne peut se terminer qu'à l'interruption du [[Programme (informatique)|programme]] qui l'utilise.

Les boucles infinies, dans le cas de la programmation php ou C/C++ entraînent une utilisation importante des ressources du serveur ou de l'ordinateur (hôte), pouvant conduire à l'arrêt des services et à une utilisation à 100% du processeur, et par conséquent à un bug du système.
== Pourquoi est-ce un problème ? ==

Il y a rarement un intérêt à programmer une boucle infinie. Une telle boucle ne permet pas de faire sortir un résultat, et accapare les ressources de l'ordinateur.

Sur un système monotâche, une boucle infinie peut interdire à l'utilisateur toute autre action. Il faut alors interrompre de force l'exécution (on peut être obligé de couper l'alimentation de l'ordinateur).

Les systèmes modernes sont généralement suffisamment [[multitâche]]s pour laisser le contrôle à l'utilisateur, qui peut commander l'interruption du programme. Mais tant que ce n'est pas fait, l'ordinateur se retrouve beaucoup moins performant pour tout autre travail.

Une boucle infinie est donc presque toujours considérée comme un [[Bug (informatique)|bug]].

Une exception possible est celle d'un programmeur qui souhaiterait absolument maintenir son ordinateur en activité en son absence. Il peut donc programmer une boucle infinie en s'assurant qu'il pourra l'interrompre quand il le souhaitera.


== Exemples de boucles infinies ==
== Exemples de boucles infinies ==

Dans de nombreux [[Langage de programmation|langages de programmation]], la boucle infinie la plus simple est, en [[pseudo-code]] :
tant que VRAI
ou en anglais
while TRUE

C'est-à-dire que les instructions doivent être exécutées tant que l'évaluation de l'expression logique « VRAI » a comme résultat « VRAI ».


En [[Python (langage)|Python]] par exemple, une boucle infinie peut être définie comme ceci :
En [[Python (langage)|Python]] par exemple, une boucle infinie peut être définie comme ceci :
<source lang="python">
<syntaxhighlight lang="python" line="1" start="1">
while True:
while True:
print "Boucle infinie"
print("Boucle infinie")
</syntaxhighlight>
</source>

L'instruction contenue dans la boucle s'exécute tant que la condition définie après <code>while</code>, or ici cette condition est toujours vraie (<code>True</code>).
L'instruction contenue dans la boucle s'exécute tant que la condition définie après <code>while</code>, or ici cette condition est toujours vraie (<code>True</code>).


La situation suivante crée également une boucle infinie :
La situation suivante crée également une boucle infinie :
<source lang="python">
<syntaxhighlight lang="python">
i = 0
i = 0
while i < 10:
while i < 10:
i = 1
i = 1
</syntaxhighlight>
</source>
En effet, la boucle se termine lorsque <code>i</code> n'est plus inférieur à 10, or l'instruction présente dans la boucle donne toujours à <code>i</code> la valeur <code>1</code> ; la condition de sortie de la boucle est donc toujours vraie.


En effet, la boucle se termine lorsque <code>i</code> n'est plus inférieur à 10, or l'instruction présente dans la boucle donne toujours à <code>i</code> la valeur <code>1</code> ; la condition d'entrée de la boucle est donc toujours vraie.
En C/C++ comme en PHP, on peut trouver :


En [[C (langage)|C]], en [[C++]] ou en [[PHP]], on peut trouver :
PHP :
<source lang="php">
$i = 0;
while($i <1)
{
// VOTRE FONCTION
}
</source>


C :
PHP :
<source lang="C">
<syntaxhighlight lang="php">
<?php
while(true)
{
//Code à insérer
}
?>
</syntaxhighlight>

C :
<syntaxhighlight lang="C">
int i = 0;
int i = 0;
while(i <1)
while (i < 1) {
// Instructions
{
// VOTRE FONCTION
}
}
</syntaxhighlight>
</source>
La variable $i/i n'est pas incrémentée (on n'ajoute pas un +1) et par conséquent la condition sera toujours vérifiée car $i/i = 0 < 1


La variable <code>$i</code> ou <code>i</code> n'est pas incrémentée (on ne lui ajoute pas <code>1</code>) et par conséquent la condition sera toujours vérifiée car <code>$i</code> ou <code>i = 0 < 1</code>.
{{Palette programmation informatique}}

== Boucles à condition d'arrêt ==

La structure décrite précédemment, <code>while true</code>, n'est pas forcément absurde. On peut, dans un langage comme le C, créer une boucle pseudo-infinie, dont la condition après le <code>while</code> est toujours respectée, tout en utilisant à l'intérieur de la boucle l'instruction <code>break</code> qui fait sortir de la boucle. Simplement, il faut s'assurer que la condition du <code>break</code> sera forcément atteinte, de préférence après un délai raisonnable.

On appelle boucle d'Alderson le cas particulier de boucle infinie pour lequel la boucle est infinie quant à sa condition d'entrée, a une condition d'arrêt, mais qu'une erreur de conception rend cette condition inaccessible. Dans ce cas, c'est bien sûr un bug. Alderson est un programmeur qui avait codé une fonction qui exécutait des instructions suivant que l'utilisateur clique sur « OK » ou « annuler », sans avoir affiché les boutons en question<ref name="one">[http://www.catb.org/~esr/jargon/html/A/Alderson-loop.html Entrée « Alderson Loop »], dans le [[Jargon File]], version 4.4.7.</ref>.

== Récursion infinie ==
L'exemple suivant en VBA renvoie une erreur de [[dépassement de pile]] :
<syntaxhighlight lang="vb">
Sub Test1()
Call Test1
End Sub
</syntaxhighlight>

== Dans la culture informatique ==

Une vieille blague d'informaticien disait qu'{{citation|un [[Cray_(entreprise)#Cray-3|Cray-3]] est si rapide qu'il peut exécuter une boucle infinie en moins de 2 secondes}}<ref>[http://www.catb.org/jargon/html/I/infinite-loop.html Entrée « infinite loop »], dans le [[Jargon File]], version 4.4.7.</ref>.

L'allée des bâtiments d'[[Apple]] à [[Cupertino (Santa Clara)|Cupertino]] s'appelle ''[[Infinite Loop]]'', « boucle infinie » en anglais.

== Notes et références ==
{{Références}}

== Voir aussi ==

=== Articles connexes ===
* [[Problème de l'arrêt]]

{{Palette Programmation informatique}}
{{Portail|programmation informatique}}
{{Portail|programmation informatique}}


[[Catégorie:Programmation informatique]]
[[Catégorie:Programmation informatique]]

[[cs:Nekonečný cyklus]]
[[da:Uendelig løkke]]
[[de:Endlosschleife]]
[[en:Infinite loop]]
[[es:Bucle infinito]]
[[fi:Ikuinen silmukka]]
[[ja:無限ループ]]
[[nl:Oneindige lus]]
[[pl:Pętla nieskończona]]
[[pt:Laço infinito]]
[[ru:Бесконечный цикл]]
[[sv:Oändlig loop]]

Dernière version du 15 janvier 2024 à 21:56

Écran bleu de la mort à cause d'une boucle infinie.

Une boucle infinie est, en programmation informatique, une boucle dont la condition de sortie n'a pas été définie ou ne peut pas être satisfaite. En conséquence, la boucle ne peut se terminer qu'à l'interruption du programme qui l'utilise.

Pourquoi est-ce un problème ?[modifier | modifier le code]

Il y a rarement un intérêt à programmer une boucle infinie. Une telle boucle ne permet pas de faire sortir un résultat, et accapare les ressources de l'ordinateur.

Sur un système monotâche, une boucle infinie peut interdire à l'utilisateur toute autre action. Il faut alors interrompre de force l'exécution (on peut être obligé de couper l'alimentation de l'ordinateur).

Les systèmes modernes sont généralement suffisamment multitâches pour laisser le contrôle à l'utilisateur, qui peut commander l'interruption du programme. Mais tant que ce n'est pas fait, l'ordinateur se retrouve beaucoup moins performant pour tout autre travail.

Une boucle infinie est donc presque toujours considérée comme un bug.

Une exception possible est celle d'un programmeur qui souhaiterait absolument maintenir son ordinateur en activité en son absence. Il peut donc programmer une boucle infinie en s'assurant qu'il pourra l'interrompre quand il le souhaitera.

Exemples de boucles infinies[modifier | modifier le code]

Dans de nombreux langages de programmation, la boucle infinie la plus simple est, en pseudo-code :

tant que VRAI

ou en anglais

while TRUE

C'est-à-dire que les instructions doivent être exécutées tant que l'évaluation de l'expression logique « VRAI » a comme résultat « VRAI ».

En Python par exemple, une boucle infinie peut être définie comme ceci :

while True:
    print("Boucle infinie")

L'instruction contenue dans la boucle s'exécute tant que la condition définie après while, or ici cette condition est toujours vraie (True).

La situation suivante crée également une boucle infinie :

i = 0
while i < 10:
    i = 1

En effet, la boucle se termine lorsque i n'est plus inférieur à 10, or l'instruction présente dans la boucle donne toujours à i la valeur 1 ; la condition d'entrée de la boucle est donc toujours vraie.

En C, en C++ ou en PHP, on peut trouver :

PHP :

<?php
    while(true)
        {
            //Code à insérer
        }
?>

C :

int i = 0;
while (i < 1) {
    // Instructions
}

La variable $i ou i n'est pas incrémentée (on ne lui ajoute pas 1) et par conséquent la condition sera toujours vérifiée car $i ou i = 0 < 1.

Boucles à condition d'arrêt[modifier | modifier le code]

La structure décrite précédemment, while true, n'est pas forcément absurde. On peut, dans un langage comme le C, créer une boucle pseudo-infinie, dont la condition après le while est toujours respectée, tout en utilisant à l'intérieur de la boucle l'instruction break qui fait sortir de la boucle. Simplement, il faut s'assurer que la condition du break sera forcément atteinte, de préférence après un délai raisonnable.

On appelle boucle d'Alderson le cas particulier de boucle infinie pour lequel la boucle est infinie quant à sa condition d'entrée, a une condition d'arrêt, mais qu'une erreur de conception rend cette condition inaccessible. Dans ce cas, c'est bien sûr un bug. Alderson est un programmeur qui avait codé une fonction qui exécutait des instructions suivant que l'utilisateur clique sur « OK » ou « annuler », sans avoir affiché les boutons en question[1].

Récursion infinie[modifier | modifier le code]

L'exemple suivant en VBA renvoie une erreur de dépassement de pile :

Sub Test1()
  Call Test1
End Sub

Dans la culture informatique[modifier | modifier le code]

Une vieille blague d'informaticien disait qu'« un Cray-3 est si rapide qu'il peut exécuter une boucle infinie en moins de 2 secondes »[2].

L'allée des bâtiments d'Apple à Cupertino s'appelle Infinite Loop, « boucle infinie » en anglais.

Notes et références[modifier | modifier le code]

Voir aussi[modifier | modifier le code]

Articles connexes[modifier | modifier le code]