En informática , se dice que una función es un efecto secundario (traducción palabra por palabra del inglés efecto secundario , cuyo significado está más cerca de un efecto secundario ) si modifica un estado fuera de su entorno local, es decir, tiene un efecto observable. interacción con el mundo exterior que no sea devolver un valor. Por ejemplo, funciones que modifican una variable local estática, una variable no local o un argumento mutable pasado por referencia, funciones que realizan operaciones de E / S o funciones que llaman a otras funciones de efectos secundarios. A menudo, estos efectos complican la legibilidad del comportamiento del programa y / o interfieren con la reutilización de funciones y procedimientos. Un lenguaje como Haskell los restringe deliberadamente en componentes llamados mónadas .
Más comúnmente, un efecto secundario aparece la mayor parte del tiempo cuando una modificación de un programa coherente (valores y estados tomados de acuerdo con las especificaciones) da como resultado valores o comportamientos no anticipados, debido a la no consideración del alcance, conjunto de definición de variable o contrato de función.
La programación imperativa permite el uso de efectos de borde en la operación de sus programas, o incluso utiliza deliberadamente (por ejemplo, la declaración COMMONen FORTRAN ) al permitir que el compilador considere (palabra clave volatileen C ).
La especificación del lenguaje Fortran prohibía que una función modificara sus parámetros de llamada, y la mayoría de los compiladores se encargaron de esto.
La programación funcional busca en cambio minimizar y a menudo aísla para ello en las estructuras provistas por una razón: las mónadas .
En el diseño de procesadores, las instrucciones pueden modificar el estado interno del procesador sin declararlo explícitamente. Así, una instrucción de suma puede modificar o no las variables de condición (acarreo, cero, desbordamiento, etc.). Esto plantea un problema de diseño si el procesador tiene una canalización de instrucciones. Así, el 360/91 de IBM, equipado con cuatro unidades lógicas y aritméticas que funcionan simultáneamente, a veces reporta una INTERRUPCIÓN IMPRECISA (desvío mal localizado) "en las proximidades" de una determinada dirección, sin poder especificar más cuál.
Estos peligros pueden evitarse limitando el conjunto de instrucciones a instrucciones sin efectos secundarios. En el peor de los casos, los circuitos adicionales detectan efectos de borde e invalidan la canalización si la siguiente instrucción depende de los valores asignados. Por lo tanto, el cálculo se retrasa un poco.
Por extensión, decimos de un operador que tiene un efecto secundario cuando modifica el valor de uno de sus operandos.
El valor resultante de la operación se puede usar (almacenado en una variable o pasado como parámetro de una función, por ejemplo), pero estos operadores a menudo se usan solo para su efecto secundario. La expresión, que comprende una operación cuyo resultado se ignora, se convierte en una instrucción.
Ejemplos en C ++:
++x; // ++ incrémente x c = b += a; // le résultat de += est stocké dans c mais celui de = est ignoréEl operador de asignación a =menudo se usa por error en lugar del operador de igualdad ==. Su efecto secundario es modificar su 1 st operando de asignándole el valor de su 2 ª operando. Su resultado es el valor que se le asignó.
if (x = 0) { // x est modifiée et devient 0 std::cout << "nul"; // "nul" n'est jamais affichée car x = 0 renvoie toujours 0 }No tener efectos secundarios es una condición necesaria pero no suficiente para la transparencia referencial . La transparencia referencial significa que una expresión (como una llamada a una función) puede ser reemplazada por su valor sin afectar el comportamiento del programa. Por tanto, la expresión debe ser pura , es decir, tener el mismo valor para las mismas entradas y su evaluación no debe tener efectos secundarios. Una función sin efectos secundarios puede devolver diferentes valores según su historial o su entorno externo, por ejemplo, si su salida depende del valor de una variable local estática o una variable no local, respectivamente.
Este programa imprime en salida estándar:
0 1El efecto secundario de la función fes modificar el valor de la variable global x.