¿Por qué escribir en un disco se considera un efecto secundario mientras que escribir en la RAM no se considera un efecto secundario?

Los efectos secundarios están en el ojo del espectador. Digamos que llamo a tu método.

Si asigna a una variable local y la actualiza una o mil veces, no me importa, no puedo verla. No hay ningún efecto que deba tener en cuenta.

Si asigna a una variable a la que tengo acceso, ya sea global, en una estructura de datos que le pasé o en algún bloque de memoria al que ambos tengamos acceso, eso es un efecto secundario. Yo, la persona que llama, tengo que saber que podrías cambiar el mundo por debajo de mí. No puedo almacenar en caché el resultado de llamar a su método porque no solo obtuve un valor de retorno, el estado del mundo que puedo ver es diferente.

No piense en los efectos secundarios en términos de su implementación concreta en el hardware, piense en ellos desde la perspectiva de la persona que llama. Si alguna persona que llama puede mirar cualquier parte de la memoria o el disco o la red y ver una diferencia antes y después de llamar a algún código, ese código tiene un efecto secundario. (Y digo “cualquier posible” llamante porque no quiere pensar que los permisos pueden ocultar un efecto secundario: si su API REST escribe en un archivo local en un servidor en el que los clientes públicos nunca podrían iniciar sesión, sigue siendo un efecto secundario .)

Escribir en algo que no está en su ámbito local es un efecto secundario. Es decir, cambiar algo que es observable desde “fuera” de esa función.

Esta función no tiene ningún efecto secundario:

int sumUpTo (int n)
{
int suma = 0;
para (int i = 0; i suma + = i;
suma de retorno;
}

Puede probar a través del análisis estático que esta función no modifica ninguna variable que existía antes de que se llamara. Si escribiera la respuesta en una variable estática, o en un puntero / referencia proporcionado a la función, o en una variable de clase (al llamar a un método de clase), se consideraría que tiene efectos secundarios. (¡Tenga en cuenta que todo esto requiere algún tipo de referencia a la memoria que se asignó fuera de la función!)

Escribir en el disco siempre es un efecto secundario: conceptualmente se podría pensar en “el disco” como una matriz estática gigante a la que pueden acceder todos los programas que se ejecutan en la computadora.

Editar:

A nivel de programa, puede decir que un programa que no escribe en el disco (o realiza otras llamadas al sistema que podrían modificar el estado del sistema operativo) “no tiene efectos secundarios”. Pero eso no es normalmente lo que las personas quieren decir, por lo general están hablando de si las funciones individuales están libres de efectos secundarios, ya que esto permite otras propiedades interesantes. Por ejemplo, las funciones sin efectos secundarios son seguras para subprocesos (bueno, al menos las que no leen cosas en las que otros subprocesos podrían estar escribiendo). La programación funcional pura requiere que todas las funciones no tengan efectos secundarios.

Hay algunas otras gradaciones, por ejemplo, una clase puede garantizar que no modifica nada fuera de su propia instancia (tal vez hace un registro o almacenamiento en caché de resultados intermedios, o necesita modificar primitivas de sincronización interna). A veces esto se llama no tener efectos secundarios “observables”.

Considero que los “efectos secundarios” en la programación son cambios de información de estado no referenciados por parámetros a un procedimiento o reflejados en su valor de retorno.

“Escribir en la RAM” puede o no ser un efecto secundario, dependiendo de si la RAM representa una estática (o variable global), en cuyo caso lo es, o una variable referenciada a través de los parámetros del procedimiento (o la pila).

La E / S del sistema de archivos siempre es indirecta a través de identificadores de archivos, que no dan acceso directo ni a las estructuras de datos del sistema de archivos ni a los medios del sistema de archivos. La E / S del sistema de archivos es siempre un efecto secundario (basado en esa definición).

Pero sobre todo, esta noción está llevando el concepto de “efecto secundario” demasiado lejos para fines pedagógicos.