Effet de bord (informatique)

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher
Page d'aide sur l'homonymie Pour les articles homonymes, voir Effet de bord.

En informatique, une fonction est dite à effet de bord (traduction littérale de l'anglais side effect, une traduction littéraire étant effet secondaire) si elle modifie un état autre que sa valeur de retour. Par exemple, une fonction peut modifier une variable statique ou globale, modifier un ou plusieurs de ses arguments, écrire des données vers un écran ou un fichier ou lire des données provenant d'autres fonctions à effet de bord. Souvent, ces effets compliquent la lisibilité du comportement des programmes et/ou nuisent à la réutilisabilité des fonctions et procédures.

Note : un "semi" effet de bord consiste simplement pour une fonction à utiliser pour ses calculs, outre ses arguments qu'elle ne modifie pas (comme elle le peut toujours lorsqu'ils sont passés par référence), des variables globales, mais utilisées cependant qu'en lecture. Ce n'est pas à proprement parler un effet de bord [réf. nécessaire], et l'utilisation de variables globales non passées en argument permet la réduction lors de l'appel de fonctions des arguments aux seules variables changeantes entre les divers appels, donc souvent[réf. nécessaire] à une réduction importante du nombre des arguments. Cependant, par l'usage de bonnes sous-structures de structures de données globales complexes passées en arguments par référence, ou en faisant de ces fonctions des méthodes de classes, les variables globales non passées en argument devenant les attributs de classe, ce type de "semi" effet de bord peut être évité, restaurant par là l'idéal du comportement purement fonctionnel, qui maximise la réutilisabilité des fonctions.

Langages[modifier | modifier le code]

La programmation impérative permet l'emploi des effets de bord dans le fonctionnement de ses programmes, voire l'utilise délibérément (par exemple la déclaration COMMON en FORTRAN) en permettant au compilateur d'en tenir compte (instruction volatile en C).

La programmation fonctionnelle cherche au contraire à les minimiser et les isole souvent pour cela dans des structures prévues entre autres pour cela : les monades.

Matériel[modifier | modifier le code]

Dans la conception des processeurs, des instructions peuvent modifier l'état interne du processeur sans le déclarer explicitement. Ainsi une instruction d'addition peut ou non modifier des variables de conditions (retenue, zéro, débordement...). Cela pose un problème de conception si le processeur comporte un pipeline d'instructions. Ainsi, le 360/91 d'IBM, muni de quatre unités arithmétiques et logiques travaillant simultanément, rapportait parfois une IMPRECISE INTERRUPT (déroutement mal localisé) "dans les parages" d'une certaine adresse, sans pouvoir préciser davantage laquelle.

On peut éviter ces aléas en limitant le jeu d'instructions à des instructions sans effet de bord. Dans le pire des cas, des circuits additionnels détectent les effets de bord et invalident le pipeline si l'instruction suivante dans celui-ci dépend des valeurs affectées. Le calcul est donc simplement un peu retardé.

Transparence référentielle[modifier | modifier le code]

Ne pas avoir d'effet de bord est nécessaire mais non suffisant pour la transparence référentielle. Celle-ci signifie qu'une expression (telle qu'un appel de fonction) peut être remplacée par sa valeur sans affecter le comportement du programme. L'expression doit donc ne pas avoir d'effet de bord et être une fonction pure, c’est-à-dire retourner toujours la même valeur quand on l'appelle avec les mêmes argument (read(), random() ou time() ne sont évidemment pas dans ce cas).

Exemple d'un programme utilisant un effet de bord en C++[modifier | modifier le code]

 #include <iostream>
 using namespace std;
 int a;
 void f()
 {
   a = 2;
 }
 
 int main ()
 {
   a = 1;
   cout << a << endl;
   f();
   cout << a << endl;
   return 0;
 }

Ce programme imprime sur la sortie standard :

1
2

L'effet de bord de la fonction f est de modifier la valeur de la variable globale a.