Efecto secundario (ciencias de la computación) - Side effect (computer science)

En informática , se dice que una operación, función o expresión tiene un efecto secundario si modifica algún valor de variable de estado fuera de su entorno local, es decir, tiene un efecto observable además de devolver un valor (el efecto pretendido) a el invocador de la operación. Los datos de estado actualizados "fuera" de la operación pueden mantenerse "dentro" de un objeto con estado o de un sistema con estado más amplio dentro del cual se realiza la operación. Los efectos secundarios de ejemplo incluyen modificar una variable no local , modificar una variable local estática , modificar un argumento mutable pasado por referencia , realizar E / S o llamar a otras funciones de efectos secundarios. En presencia de efectos secundarios, el comportamiento de un programa puede depender de la historia; es decir, el orden de evaluación es importante. Comprender y depurar una función con efectos secundarios requiere conocimiento sobre el contexto y sus posibles historias.

El grado en que se utilizan los efectos secundarios depende del paradigma de programación. La programación imperativa se usa comúnmente para producir efectos secundarios, para actualizar el estado de un sistema. Por el contrario, la programación declarativa se usa comúnmente para informar sobre el estado del sistema, sin efectos secundarios.

En la programación funcional , los efectos secundarios rara vez se utilizan. La falta de efectos secundarios facilita la realización de verificaciones formales de un programa. Los lenguajes funcionales como Standard ML , Scheme y Scala no restringen los efectos secundarios, pero es habitual que los programadores los eviten. El lenguaje funcional Haskell expresa efectos secundarios como E / S y otros cálculos con estado utilizando acciones monádicas .

Los programadores en lenguaje ensamblador deben ser conscientes de los efectos secundarios ocultos : instrucciones que modifican partes del estado del procesador que no se mencionan en el mnemónico de la instrucción. Un ejemplo clásico de un efecto secundario oculto es una instrucción aritmética que modifica implícitamente los códigos de condición (un efecto secundario oculto) mientras que modifica explícitamente un registro (el efecto pretendido). Un posible inconveniente de un conjunto de instrucciones con efectos secundarios ocultos es que, si muchas instrucciones tienen efectos secundarios en un solo estado, como los códigos de condición, entonces la lógica necesaria para actualizar ese estado secuencialmente puede convertirse en un cuello de botella en el rendimiento. El problema es particularmente agudo en algunos procesadores diseñados con canalización (desde 1990) o con ejecución fuera de orden . Tal procesador puede requerir circuitos de control adicionales para detectar efectos secundarios ocultos y detener la tubería si la siguiente instrucción depende de los resultados de esos efectos.

Transparencia referencial

La ausencia de 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) se puede reemplazar por su valor. Esto requiere que la expresión sea pura , es decir, la expresión debe ser determinista (siempre dé el mismo valor para la misma entrada) y libre de efectos secundarios.

Efectos secundarios temporales

Los efectos secundarios causados ​​por el tiempo que tarda una operación en ejecutarse generalmente se ignoran cuando se discuten los efectos secundarios y la transparencia referencial. Hay algunos casos, como con la sincronización o las pruebas de hardware, en los que las operaciones se insertan específicamente para sus efectos secundarios temporales, por ejemplo, sleep(5000)o for (int i = 0; i < 10000; ++i) {}. Estas instrucciones no cambian de estado más que tomar una cantidad de tiempo para completarse.

Idempotencia

Una subrutina con efectos secundarios es idempotente si múltiples aplicaciones de la subrutina tienen el mismo efecto en el estado del sistema que una sola aplicación, es decir, si la función del espacio de estado del sistema a sí misma asociada con la subrutina es idempotente en el sentido matemático . Por ejemplo, considere el siguiente programa de Python :

x = 0

def setx(n):
    global x
    x = n

setx(3)
assert x == 3
setx(3)
assert x == 3

setxes idempotente porque la segunda aplicación de setxa 3 tiene el mismo efecto en el estado del sistema que la primera aplicación: xya se estableció en 3 después de la primera aplicación, y todavía se establece en 3 después de la segunda aplicación.

Una función pura es idempotente si es idempotente en el sentido matemático . Por ejemplo, considere el siguiente programa de Python:

def abs(n):
    return -n if n < 0 else n

assert abs(abs(-3)) == abs(-3)

abses idempotente porque la segunda aplicación de absal valor de retorno de la primera aplicación a -3 devuelve el mismo valor que la primera aplicación a -3.

Ejemplo

Una manifestación común de comportamiento efecto secundario es que del operador de asignación en C . La asignación a = bes una expresión que se evalúa con el mismo valor que la expresión b, con el efecto secundario de almacenar el valor R de ben el valor L de a. Esto permite múltiples asignaciones:

a = (b = 3);  // b = 3 evaluates to 3, which then gets assigned to a

Debido a que el operador se asocia a la derecha , esto es equivalente a

a = b = 3;

Esto presenta un problema potencial para los programadores novatos que pueden confundir

while (b == 3) {}  // tests if b evaluates to 3

con

while (b = 3) {}  // b = 3 evaluates to 3, which then casts to true so the loop is infinite

Ver también

Referencias

  1. ^ Spuler, David A .; Sajeev, ASM (enero de 1994). "Detección del compilador de efectos secundarios de llamadas a funciones". Universidad James Cook. CiteSeerX  10.1.1.70.2096 . El término efecto secundario se refiere a la modificación del entorno no local. Generalmente esto sucede cuando una función (o un procedimiento) modifica una variable global o argumentos pasados ​​por parámetros de referencia. Pero aquí hay otras formas en las que se puede modificar el entorno no local. Consideramos las siguientes causas de efectos secundarios a través de una llamada de función: 1. Realización de E / S. 2. Modificación de variables globales. 3. Modificar variables permanentes locales (como variables estáticas en C). 4. Modificar un argumento pasado por referencia. 5. Modificar una variable local, ya sea automática o estática, de una función más arriba en la secuencia de llamada de función (generalmente a través de un puntero). Cite journal requiere |journal=( ayuda )
  2. ^ "Temas de investigación en programación funcional" ed. D. Turner, Addison-Wesley, 1990, págs. 17–42. Obtenido de: Hughes, John, Why Functional Programming Matters (PDF)
  3. ^ Collberg, CSc 520 Principios de lenguajes de programación , Departamento de Ciencias de la Computación, Universidad de Arizona
  4. ^ Matthias Felleisen et al., Cómo diseñar programas , MIT Press
  5. ^ Informe Haskell 98, http://www.haskell.org .
  6. ^ Programación funcional imperativa , Simon Peyton Jones y Phil Wadler, Registro de la conferencia del 20º Simposio anual de ACM sobre principios de lenguajes de programación , páginas 71–84, 1993