메모리에서 읽는 것이 부작용이 아니라 파일에서 읽는 이유는 무엇입니까? 만든 다음이 배열의

프로세스 메모리에서 정확하게 읽기 작업을하는 것은 무엇입니까? 전역 메모리에 정수 100 개의 배열을 만든 다음이 배열의 42 번째 요소를 가져 갔다고 가정합니다. 부작용이 아닙니까? 그렇다면 왜 파일에서 100 개의 정수로 된 같은 배열을 읽는 것이 부작용입니까?



답변

액세스하는 메모리가 변경 될 수 있으면 실제로 부작용입니다.

예를 들어, Haskell에서 가변 배열 ( IOArray) 에 액세스하는 함수의 유형은 다음과 같습니다.

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

(우리의 목적을 위해 약간 단순화). 불변 배열에 액세스하는 동안 유형이 있습니다

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

첫 번째 버전 IO e은 I / O 부작용이있는 유형의 무언가를 반환합니다 . 두 번째 버전은 e부작용없이 유형의 요소를 반환합니다 .

파일에 액세스하는 경우 프로그램 실행 중에 파일이 변경되는지 컴파일 타임에 알 수 없습니다. 따라서 항상 부작용이있는 작업으로 취급해야합니다.


답변

컴퓨터 과학에서, 함수 또는 표현식은 값을 반환하는 것 외에도 일부 상태를 수정하거나 호출 함수 또는 외부 세계와 관찰 가능한 상호 작용을 갖는 경우 부작용이 있다고합니다. 파일에서 읽는 것은 외부 세계와의 관찰 가능한 상호 작용입니다. 부작용의 정의를 충족시킵니다. 배열이 수정 될 수있는 다른 함수와 관찰 가능한 상호 작용이기 때문에 배열이 상수가 아니면 전역 메모리에서 42 번째 요소를 읽는 것도 부작용이됩니다.


답변

공유 파일 핸들이있는 경우 파일을 읽으면 해당 파일 핸들을 읽은 위치로 이동하고 해당 위치에 그대로 둡니다.

동일한 파일에 대해 별도의 파일 핸들이있는 두 개의 스레드가있는 경우 하나에서 읽는 것이 다른쪽에 눈에 띄는 부작용이 없습니다.

그러나 메모리 읽기와 파일 읽기 모두에서 운영자 시스템 캐싱의 숨겨진 부작용이있을 수 있습니다.


답변

메모리에서 읽는 것은 다른 기능에 영향을 미치지 않으므로 부작용이 없습니다. 파일을 읽으면 일반적으로 파일의 위치 포인터가 이동하므로 다시 읽을 때 이미 읽은 내용을 읽은 후에 한 읽기 기능이 다른 읽기 기능의 결과를 변경하므로 부작용이 발생합니다. 대신에이 부작용이 사라지는 것보다 한 번에 파일을 읽고 닫으면 큰 파일에는 적용 할 수 없습니다. 또한 파일을 여는 방법에 따라 파일을 연 후 파일이 잠길 수 있으므로 파일 열기 및 읽기의 첫 번째 시도는 성공하지만 다음 시도는 파일 이미 열려 있음 오류 와 함께 실패하며 이는 부작용입니다.

한 번에 파일을 읽고 동시에 여러 번 읽을 수있는 부작용없는 읽기 기능을 만드는 것은 읽기 기능의 영향을받는 파일 쓰기 기능이 있고 파일 쓰기 기능을 다시 제거 할 수 없기 때문에 어렵습니다. .


답변

스트림에서 읽는 것은 이미 부작용이 있습니다. 왜냐하면 같은 함수의 결과 isEOF는 읽은 후와 읽은 것보다 다른 결과를 반환 할 수 있기 때문 입니다.