Por que a leitura da memória não é um efeito colateral, mas a leitura de um arquivo é?


16

O que exatamente faz da leitura da memória do processo uma operação pura? Suponha que eu criei uma matriz de 100 números inteiros na memória global e depois peguei o 42º elemento dessa matriz. Não é um efeito colateral, certo? Então, por que a leitura da mesma matriz de 100 números inteiros de um arquivo é um efeito colateral?


5
considere editar ing para explicar o que faz você pensar que a leitura da série de 100 números inteiros de um arquivo é um efeito colateral, bem como o que faz "operação pura" significa para você
mosquito

3
@gnat Porque é de I / O e E / S é um efeito colateral
ZhekaKozlov

3
o que faz você pensar que a E / S é um efeito colateral? considere editar ] para explicar isso para questionar os leitores. Em uma nota mais geral, compartilhar sua pesquisa ajuda a todos . Conte-nos o que você tentou e por que ele não atendeu às suas necessidades. Isso demonstra que você reservou um tempo para tentar ajudar a si mesmo, evita reiterar respostas óbvias e, acima de tudo, ajuda a obter uma resposta mais específica e relevante. Veja também How to Ask
gnat

22
@gnat I / O é um efeito colateral, ponto final. É um dos exemplos clássicos. Não somos a Wikipedia, não precisamos de citações para conhecimento popular. Se você acha que algo pode ser melhorado sobre a questão, diga-a diretamente, em vez de passar por esse homem de palha.

7
'O' é um efeito colateral. 'Eu' é apenas um efeito colateral se fazer o 'Eu' mudar o estado do que você está fazendo o 'Eu'. O que é verdade para certas coisas de E / S mapeadas na memória, mas é improvável que seja o caso de um arquivo normal.
Tom Tanner #

Respostas:


27

Se a memória que você acessa pode mudar, é realmente um efeito colateral.

Por exemplo, em Haskell, a função para acessar uma matriz mutável ( IOArray) possui o tipo

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

(ligeiramente simplificado para nossos propósitos). Ao acessar um array imutável, digite

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

A primeira versão retorna algo do tipo, o IO eque significa que possui efeitos colaterais de E / S. A segunda versão simplesmente retorna um elemento do tipo esem efeitos colaterais.

No caso de acessar um arquivo, você simplesmente não pode saber, em tempo de compilação, se o arquivo será alterado durante a execução do programa. Portanto, você sempre deve tratá-lo como uma operação com possíveis efeitos colaterais.


4
Bem, com arquivos você simplesmente não pode ter certeza absoluta.
ftr

2
Você nunca pode ter certeza, mas mais importante: o compilador não pode ter certeza. Além disso, seu sistema de arquivos pode ficar corrompido ou o disco rígido pode se desconectar enquanto você lê o arquivo.
Tobias Brandt

5
Esses não são efeitos colaterais do programa, são efeitos colaterais de outras coisas. A memória também não é livre de efeitos colaterais, uma vez que uma partícula alfa ou nêutron perdido pode virar um pouco e resultar em uma alteração na matriz.
Blrfl

3
@ Blrfl Esse é um bom ponto, no entanto, não acho que os dois sejam comparáveis. A corrupção de memória não é algo com o qual você possa lidar, pois pode afetar os dados e as instruções do programa de maneira arbitrária. Se isso acontecer, a única coisa a fazer é encerrar o programa (e provavelmente o sistema operacional). Por outro lado, um erro de leitura devido à corrupção do sistema de arquivos é algo que você deve esperar e poder lidar. É uma parte inerente ao lidar com arquivos.
Tobias Brandt

2
Você está saindo do campo dos efeitos colaterais e entrando na detecção e tratamento de erros, que é uma discussão totalmente diferente. A questão dos efeitos colaterais é se uma operação tem ou não algum efeito sobre outra coisa, se o resultado da operação pode ou não ser influenciado por fatores externos.
Blrfl

10

Na ciência da computação, diz-se que uma função ou expressão tem um efeito colateral se, além de retornar um valor, também modifica algum estado ou tem uma interação observável com as funções de chamada ou com o mundo exterior. Ler de um arquivo é uma interação observável com o mundo exterior. Ele atende à definição de efeito colateral. A leitura do 42º elemento da memória global também seria um efeito colateral, a menos que sua matriz seja uma constante, pois seria uma interação observável com outras funções que podem modificar a matriz.


2

Se você tiver um identificador de arquivo compartilhado, a leitura do arquivo moverá esse identificador para a posição em que você leu e o deixará nessa posição.

Se você tiver dois threads com identificadores de arquivo separados para o mesmo arquivo, a leitura de um não terá efeito colateral perceptível no outro.

No entanto, nesses dois casos, leitura de memória e leitura de arquivo, pode haver um efeito colateral oculto do cache do sistema do operador.


0

A leitura da memória não influencia outras funções e, portanto, é livre de efeitos colaterais. A leitura de um arquivo normalmente move o ponteiro de posição do arquivo, de modo que, quando você lê novamente, lê os dados depois do que já leu, para que uma função de leitura altere o resultado de outras funções de leitura, o que é um efeito colateral. Se você abrir, leia e feche um arquivo de uma só vez, para que esse efeito colateral desapareça, mas isso não é possível para arquivos grandes. Além disso, dependendo de como você abrir o arquivo, ele poderá ficar bloqueado após abri-lo. Portanto, a primeira tentativa de abrir e ler o arquivo será bem-sucedida, enquanto as tentativas seguintes falharão com um erro de arquivo já aberto , o que novamente é um efeito colateral.

Criar uma função de leitura sem efeitos colaterais que leia o arquivo de uma só vez e permita várias leituras ao mesmo tempo é difícil, porque há funções de gravação de arquivo que são influenciadas pela função de leitura e livrar-se das funções de gravação de arquivo também não é possível. .


1
Você pode ter uma leitura livre de efeitos colaterais de um arquivo se o arquivo não for alterado e você transformou o arquivo em um fluxo (lista lenta).
Giorgio

2
Chegar ao sistema operacional para um arquivo que não está sob seu controle é um efeito colateral. Somente se você pudesse controlar a mutabilidade do arquivo (e talvez sequenciar operações de mutação nele ... via IOmônada?), Você poderia criar uma função sem efeitos colaterais para a leitura.
Bergi

0

A leitura de um fluxo já é um efeito colateral, porque o resultado de funções como isEOFpode retornar resultados diferentes após a leitura e antes da leitura.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.