¿Por qué se dice que cualquier operación de E / S tendrá efectos secundarios?

I / O es dos cosas, entrada y salida.

Tomar datos significa consumir datos que otro lector puede querer leer (por ejemplo, salir de una cola), o verificar algún recurso que no sea una entrada directa a la función (leer un archivo del sistema de archivos, incluso si el nombre de archivo es un argumento para la función). La función cambia el estado de otros lectores o depende del estado fuera de sus argumentos. Decimos que tiene efectos secundarios porque otro código tiene que saber que cambia las cosas o que la misma llamada en dos momentos diferentes puede dar dos resultados diferentes (porque ese archivo fue cambiado).

La escritura de salida significa cambiar los datos que otro código puede leer. ¡Ese es todo el valor de la producción, de hecho! Actualizamos la base de datos para que el sitio muestre una nueva publicación de blog, o escribimos en el búfer de salida para que el terminal muestre las palabras al usuario, o enviamos bytes al bus para que la computadora sepa que se movió el mouse.

Como el propósito de la entrada y la salida es compartir datos entre sistemas discretos, siempre tienen efectos secundarios.

Explicaré por qué la E / S de disco es un efecto secundario, tal como lo entiendo. Puede extender esto a otros tipos de E / S:

  • Escribir en el disco supera al proceso, por lo que es un efecto fuera del proceso, causado por el proceso. Cambia el estado del mundo (el disco) y otros procesos pueden ver este cambio (al ver de manera diferente cuando se lista ese directorio, por ejemplo)
  • Ahora en el lado de lectura: supongamos que tiene una función en la que lee de un archivo. Si llama a ese método varias veces, seguirá leyendo del archivo, diferentes partes del archivo. La función se comportará de manera diferente cada vez.
  • Ahora, hay un caso donde la función cierra el descriptor de archivo y se vuelve a abrir cada vez.
  • Ahora existe una posibilidad, pero ¿qué ocurre si otro programa modifica ese archivo? De nuevo, la función depende de cosas externas, y la salida de la función puede diferir, función del estado del mundo.

En una función libre de efectos secundarios, la llamada a la función puede ser reemplazada por su valor, y viceversa. Esta función se llama función pura. El lenguaje que solo permite que los programas sean expresiones puras se denomina lenguaje funcional puro. Solo Haskell califica, e incluso Haskell tiene un método feo que puede escabullirse en el sistema de tipos. Sin embargo, lo bueno es que las E / S se pueden realizar en un lenguaje puro, con mónadas y la forma en que funciona la evaluación del tiempo de ejecución, es decir, la parte con buen estado y en estado de ejecución, en la máquina virtual y contenida en el sistema de tipos. La programación funcional pura está íntimamente conectada a la evaluación diferida, porque el orden de evaluación es libre de cualquier orden que respete las matemáticas.

Los efectos secundarios también son cambios en variables no locales, regiones de memoria que se comparten entre diferentes funciones. Cualquier efecto de una función, además de obtener su resultado, es un efecto secundario. Por definición, una función nula solo se trata de un efecto colateral, porque carece de su efecto principal, de devolver un valor (o, más funcionalmente, ¡ser equivalente a su valor!).

Respuesta corta: E / S es un efecto secundario por definición.