¿Por qué leer de la memoria no es un efecto secundario sino leerlo de un archivo?

16

¿Qué hace exactamente que la lectura de la memoria del proceso sea una operación pura? Supongamos que creé una matriz de 100 enteros en la memoria global y luego tomé el elemento 42 de esta matriz. No es un efecto secundario, ¿verdad? Entonces, ¿por qué leer la misma matriz de 100 enteros de un archivo es un efecto secundario?

ZhekaKozlov
fuente
55
considere la posibilidad de editar para explicar qué le hace pensar que leer la matriz de 100 enteros de un archivo es un efecto secundario, así como lo que significa para usted "operación pura"
mosquito
3
@gnat Porque es E / S y E / S es un efecto secundario
ZhekaKozlov
3
¿Qué te hace pensar que I / O es un efecto secundario? considere editar para explicar eso para interrogar a los lectores. En una nota más general, compartir su investigación ayuda a todos . Cuéntanos qué has probado y por qué no satisfizo tus necesidades. Esto demuestra que te has tomado el tiempo para tratar de ayudarte a ti mismo, nos salva de reiterar respuestas obvias y, sobre todo, te ayuda a obtener una respuesta más específica y relevante. También vea Cómo preguntar
mosquito
22
@gnat I / O es un efecto secundario, punto. Es uno de los ejemplos clásicos. No somos Wikipedia, no necesitamos citas para el conocimiento popular. Si cree que se puede mejorar algo sobre la pregunta, dígalo directamente en lugar de pasar por este hombre de paja.
77
'O' es un efecto secundario. 'I' es solo un efecto secundario si hacer el 'I' cambia el estado de lo que está haciendo 'I'. Lo cual es cierto para ciertas cosas de E / S mapeadas en memoria, pero es poco probable que sea el caso de un archivo normal.
Tom Tanner

Respuestas:

27

Si la memoria a la que accede puede cambiar, es un efecto secundario.

Por ejemplo, en Haskell, la función para acceder a una matriz mutable ( IOArray) tiene tipo

Ix i => IOArray i e -> i -> IO e

(ligeramente simplificado para nuestros propósitos). Al acceder a una matriz inmutable tiene tipo

Ix i => Array i e -> i -> e

La primera versión devuelve algo de tipo, lo IO eque significa que tiene efectos secundarios de E / S. La segunda versión simplemente devuelve un elemento de tipo esin efectos secundarios.

En caso de acceder a un archivo, simplemente no puede saber en el momento de la compilación si el archivo cambiará alguna vez durante la ejecución del programa. Por lo tanto, siempre debe tratarlo como una operación con posibles efectos secundarios.

Tobias Brandt
fuente
44
Bueno, con archivos simplemente no puedes estar absolutamente seguro.
ftr
2
Nunca puede estar seguro, pero lo más importante: el compilador no puede estar seguro. Además, su sistema de archivos podría corromperse o su disco duro podría desconectarse mientras está leyendo el archivo.
Tobias Brandt
55
Esos no son efectos secundarios del programa, son efectos secundarios de otras cosas. La memoria tampoco está libre de efectos secundarios, ya que una partícula alfa o un neutrón parásito pueden voltearse un poco y provocar un cambio en la matriz.
Blrfl
3
@Blrfl Ese es un buen punto, sin embargo, no creo que los dos sean comparables. La corrupción de la memoria no es algo con lo que pueda lidiar porque puede afectar los datos del programa y las instrucciones de manera arbitraria. Si sucede, lo único que debe hacer es terminar el programa (y probablemente el sistema operativo). Por otro lado, un error de lectura debido a la corrupción del sistema de archivos es algo que debe esperar y poder manejar. Es una parte inherente de tratar con archivos.
Tobias Brandt
2
Estás saliendo del ámbito de los efectos secundarios y entrando en la detección y manejo de errores, lo cual es una discusión completamente diferente. La cuestión de los efectos secundarios es si una operación tiene o no algún efecto sobre otra cosa, no si el resultado de la operación puede o no estar influenciado por factores externos.
Blrfl
10

En informática, se dice que una función o expresión tiene un efecto secundario si, además de devolver un valor, también modifica algún estado o tiene una interacción observable con las funciones de llamada o el mundo exterior. Leer de un archivo es una interacción observable con el mundo exterior. Cumple con la definición de efecto secundario. Leer el elemento 42 de la memoria global también sería un efecto secundario, a menos que su matriz sea una constante porque sería una interacción observable con otras funciones que pueden modificar la matriz.

metal de piedra
fuente
2

Si tiene un identificador de archivo compartido, leer un archivo moverá ese identificador de archivo a la posición donde lo ha leído y lo dejará en esa posición.

Si tiene dos subprocesos con identificadores de archivo separados para el mismo archivo, la lectura de uno no tendrá efectos secundarios notables en el otro.

Sin embargo, en ambos casos, lectura de memoria y lectura de archivos, podría haber un efecto secundario oculto del almacenamiento en caché del sistema del operador.

CashCow
fuente
0

Leer de la memoria no influye en otras funciones y, por lo tanto, no tiene efectos secundarios. La lectura de un archivo generalmente moverá el puntero de posición del archivo, de modo que cuando lea de nuevo lea los datos después de lo que ya ha leído, de modo que una función de lectura cambia el resultado de otras funciones de lectura, lo cual es un efecto secundario. Si en su lugar abre, lee y cierra un archivo de una vez, este efecto secundario desaparece, pero eso no es factible para archivos grandes. Además, dependiendo de cómo abra el archivo, puede bloquearse después de abrirlo, por lo que el primer intento de abrir y leer el archivo tiene éxito mientras que los siguientes intentos fallarán con un archivo ya abierto error de , que nuevamente es un efecto secundario.

Crear una función de lectura sin efectos secundarios que lea el archivo de una vez y permita múltiples lecturas al mismo tiempo es difícil porque hay funciones de escritura de archivos que se ven influenciadas por la función de lectura y deshacerse de las funciones de escritura de archivos nuevamente no es factible .

nwp
fuente
1
Podría tener una lectura libre de efectos secundarios de un archivo si el archivo no cambiara y lo convirtiera en una secuencia (lista diferida).
Giorgio
2
Llegar al sistema operativo para un archivo que no está bajo su control es un efecto secundario. Solo si pudieras controlar la mutabilidad del archivo (y quizás secuenciar las operaciones de mutación en él ... ¿a través de la IOmónada?), Podrías hacer una función libre de efectos secundarios para la lectura.
Bergi
0

La lectura de una secuencia ya es un efecto secundario porque el resultado de funciones como isEOFpuede devolver un resultado diferente después de la lectura que antes de la lectura.

Hagen von Eitzen
fuente