Pourquoi la lecture depuis la mémoire n'est-elle pas un effet secondaire, mais la lecture depuis un fichier l'est?

16

Qu'est-ce qui fait de la lecture de la mémoire de processus une opération pure? Supposons que j'ai créé un tableau de 100 entiers dans la mémoire globale, puis pris le 42e élément de ce tableau. Ce n'est pas un effet secondaire, non? Alors, pourquoi la lecture du même tableau de 100 entiers dans un fichier est-elle un effet secondaire?

ZhekaKozlov
la source
5
pensez à éditer pour expliquer ce qui vous fait penser que la lecture du tableau de 100 entiers dans un fichier est un effet secondaire, ainsi que ce que signifie pour vous le "fonctionnement pur"
gnat
3
@gnat Parce qu'il s'agit d'E / S et d'E / S est un effet secondaire
ZhekaKozlov
3
qu'est-ce qui vous fait penser que les E / S sont un effet secondaire? pensez à éditer pour expliquer cela aux lecteurs. De manière plus générale, le partage de vos recherches aide tout le monde . Dites-nous ce que vous avez essayé et pourquoi cela n'a pas répondu à vos besoins. Cela démontre que vous avez pris le temps d'essayer de vous aider, cela nous évite de réitérer des réponses évidentes et, surtout, cela vous aide à obtenir une réponse plus spécifique et pertinente. Voir aussi Comment demander
moucher
22
@gnat I / O est un effet secondaire, point final. C'est l'un des exemples classiques. Nous ne sommes pas Wikipédia, nous n'avons pas besoin de citations pour la connaissance populaire. Si vous pensez que quelque chose peut être amélioré sur la question, dites-le franchement plutôt que de passer par cet homme de paille.
7
«O» est un effet secondaire. «Je» n'est qu'un effet secondaire si faire le «je» change l'état de ce que vous faites «je». Ce qui est vrai pour certaines choses d'E / S mappées en mémoire, mais il est peu probable que ce soit le cas pour un fichier normal.
Tom Tanner

Réponses:

27

Si la mémoire à laquelle vous accédez peut changer, c'est en effet un effet secondaire.

Par exemple, dans Haskell, la fonction pour accéder à un tableau mutable ( IOArray) a le type

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

(légèrement simplifié pour nos besoins). Lors de l'accès à un tableau immuable de type

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

La première version renvoie quelque chose de type, IO ece qui signifie qu'elle a des effets secondaires d'E / S. La deuxième version renvoie simplement un élément de type esans aucun effet secondaire.

En cas d'accès à un fichier, vous ne pouvez tout simplement pas savoir au moment de la compilation si le fichier changera jamais au cours d'une exécution du programme. Par conséquent, vous devez toujours le traiter comme une opération avec des effets secondaires potentiels.

Tobias Brandt
la source
4
Eh bien, avec des fichiers, vous ne pouvez tout simplement pas être absolument sûr.
ftr
2
Vous ne pouvez jamais être sûr, mais plus important: le compilateur ne peut pas être sûr. De plus, votre système de fichiers peut être corrompu ou votre disque dur peut se déconnecter pendant que vous lisez le fichier.
Tobias Brandt
5
Ce ne sont pas des effets secondaires du programme, ce sont des effets secondaires d'autres choses. La mémoire n'est pas exempte d'effets secondaires non plus, car une particule alpha ou un neutron parasite peut basculer un peu et entraîner une modification du tableau.
Blrfl
3
@Blrfl C'est un bon point, mais je ne pense pas que les deux soient comparables. La corruption de mémoire n'est pas quelque chose que vous pouvez gérer car elle peut affecter les données et les instructions du programme de manière arbitraire. Si cela se produit, la seule chose à faire est de terminer le programme (et probablement le système d'exploitation). D'un autre côté, une erreur de lecture due à une corruption du système de fichiers est quelque chose que vous devez vous attendre et être capable de gérer. C'est une partie inhérente au traitement des fichiers.
Tobias Brandt,
2
Vous sortez du domaine des effets secondaires pour vous lancer dans la détection et la gestion des erreurs, ce qui est une discussion entièrement différente. La question des effets secondaires est de savoir si une opération a ou non des effets sur quoi que ce soit d'autre, pas si le résultat de l'opération peut ou non être influencé par des facteurs externes.
Blrfl
10

En informatique, une fonction ou une expression est censée avoir un effet secondaire si, en plus de renvoyer une valeur, elle modifie également un état ou a une interaction observable avec les fonctions d'appel ou le monde extérieur. La lecture d'un fichier est une interaction observable avec le monde extérieur. Il répond à la définition de l'effet secondaire. La lecture du 42e élément de la mémoire globale serait également un effet secondaire, à moins que votre tableau ne soit une constante, car ce serait une interaction observable avec d'autres fonctions qui pourraient modifier le tableau.

stonemetal
la source
2

Si vous avez un descripteur de fichier partagé, la lecture d'un fichier le déplacera à la position où vous l'avez lu et le laissera à cette position.

Si vous avez deux threads avec des poignées de fichier distinctes vers le même fichier, la lecture de l'un n'aura aucun effet secondaire notable sur l'autre.

Cependant, dans ces deux cas, la lecture de la mémoire et la lecture des fichiers, il peut y avoir un effet secondaire caché de la mise en cache du système opérateur.

Vache à lait
la source
0

La lecture à partir de la mémoire n'influence pas les autres fonctions et est donc sans effet secondaire. La lecture à partir d'un fichier déplace généralement le pointeur de position du fichier, de sorte que lorsque vous relisez, vous lisez les données après ce que vous avez déjà lu, donc une fonction de lecture modifie le résultat des autres fonctions de lecture, ce qui est un effet secondaire. Si vous ouvrez, lisez et fermez un fichier en une seule fois, cet effet secondaire disparaît, mais ce n'est pas possible pour les gros fichiers. En outre, selon la façon dont vous ouvrez le fichier, il peut se verrouiller après l'avoir ouvert, de sorte que la première tentative d'ouverture et de lecture du fichier réussit tandis que les essais suivants échouent avec une erreur de fichier déjà ouvert , ce qui est encore un effet secondaire.

Il est difficile de créer une fonction de lecture sans effet secondaire qui lit le fichier en une seule fois et permet plusieurs lectures en même temps car il existe des fonctions d'écriture de fichier qui sont influencées par la fonction de lecture et se débarrasser des fonctions d'écriture de fichier n'est à nouveau pas possible .

nwp
la source
1
Vous pouvez avoir une lecture libre des effets secondaires à partir d'un fichier si le fichier ne change pas et que vous avez transformé le fichier en flux (liste paresseuse).
Giorgio
2
Tendre la main au système d'exploitation pour un fichier qui n'est pas sous votre contrôle est un effet secondaire. Ce n'est que si vous pouviez contrôler la mutabilité du fichier (et peut-être séquencer les opérations de mutation sur celui-ci… via la IOmonade?) Que vous pourriez créer une fonction sans effet secondaire pour la lecture.
Bergi
0

La lecture à partir d'un flux est déjà un effet secondaire car le résultat de fonctions telles que isEOFpeut retourner un résultat différent après la lecture qu'avant la lecture.

Hagen von Eitzen
la source