Effet de bord

Un effet de bord est une opération qui change l'état global visible d'une application. Typiquement, il s'agit d'affectation d'une variable, qu'elle soit globale ou locale. On compte également parfois les entrées/sorties dans les effets de bord.

En programmation fonctionnelle il est considéré un avantage de programmer sans effets de bord. S'il n'y a pas d'effets de bord, on est sûr qu'une fonction renvoie toujours la même valeur, si elle est appelé avec les mêmes arguments. Ceci permet un raisonnement plus approfondie sur la correction du programme. Ce raisonnement peut être fait par le programmeur, par un outil de preuve de programmes ou par le compilateur.

Certains langages de programmation (les langages fonctionnelles) ont été conçu pour la programmation fonctionnelle. C'est le cas en particulier de Haskell, ML, mais il y en a d'autres, moins connus.

Il est impossible pour un programme sans effets de bord de faire quelque chose d'utile (car il faut au moins afficher le résultat), mais il est entièrement possible de limiter les effets de bord à une petite partie du programme.

Il est possible d'utiliser la programmation fonctionnelle avec un langage qui permet les effets de bord, mais il sera souvent difficile pour le compilateur de prouver l'absence d'effets de bord. C'est beaucoup plus facile pour le programmeur de se convaincre de l'absence d'effets de bord et cela suffit souvent pour obtenir un programme plus compréhensible.

Alors que l'absence d'effets de bord globalement dans un programme est une condition suffisante pour qu'une fonction renvoie toujours le même résultat sur les mêmes arguments, mais ce n'est pas une condition nécessaire. Une fonction qui affecte une variable sans jamais consulter sa valeur (elle sera peut-être consulté par une autre fonction) contient un effet de bord, mais cet effet de bord n'influence pas la valeur renvoyée.

De plus, dans un langage permettant des effets de bord, il n'est pas suffisant pour une fonction de ne pas avoir d'effets de bord pour qu'elle renvoie toujours le même résultat. Il est possible que le résultat renvoyé dépende de la valeur d'une variable globale affectée par une autre fonction. Dans ce cas, la valeur renvoyée peut être différente entre deux invocations de la fonction, si entre temps une autre fonction à modifié la valeur de la variable globale.