Tại sao đọc từ bộ nhớ không phải là tác dụng phụ mà đọc từ tệp là?


16

Chính xác thì điều gì làm cho việc đọc từ bộ nhớ quá trình trở thành một hoạt động thuần túy? Giả sử tôi đã tạo một mảng gồm 100 số nguyên trong bộ nhớ chung và sau đó lấy phần tử thứ 42 của mảng này. Nó không phải là một tác dụng phụ, phải không? Vậy tại sao việc đọc cùng một mảng 100 số nguyên từ một tệp có tác dụng phụ?


5
xem xét chỉnh sửa ing để giải thích điều gì khiến bạn nghĩ rằng việc đọc mảng 100 số nguyên từ tệp là một tác dụng phụ, cũng như "hoạt động thuần túy" có ý nghĩa gì với bạn
gnat

3
@gnat Vì đó là I / O và I / O là tác dụng phụ
ZhekaKozlov

3
Điều gì khiến bạn nghĩ rằng I / O là một tác dụng phụ? xem xét chỉnh sửa ] ing để giải thích điều đó để hỏi độc giả. Trên một lưu ý chung hơn, chia sẻ nghiên cứu của bạn giúp mọi người . Hãy cho chúng tôi những gì bạn đã cố gắng và tại sao nó không đáp ứng nhu cầu của bạn. Điều này chứng tỏ rằng bạn đã dành thời gian để cố gắng tự giúp mình, nó giúp chúng tôi tránh nhắc lại các câu trả lời rõ ràng và hầu hết nó giúp bạn có được câu trả lời cụ thể và phù hợp hơn. Xem thêm Cách hỏi
gnat

22
@gnat I / O là tác dụng phụ, thời gian. Đây là một trong những ví dụ kinh điển. Chúng tôi không phải Wikipedia, chúng tôi không cần trích dẫn kiến ​​thức dân gian. Nếu bạn nghĩ rằng một cái gì đó có thể được cải thiện về câu hỏi, hãy nói thẳng ra thay vì đi qua người đàn ông rơm này.

7
'O' là một tác dụng phụ. 'Tôi' chỉ là tác dụng phụ nếu thực hiện 'Tôi' thay đổi trạng thái của những gì bạn đang làm 'Tôi' từ đó. Điều này đúng với một số thứ I / O được ánh xạ bộ nhớ nhất định nhưng không chắc là trường hợp của một tệp bình thường.
Tom Tanner

Câu trả lời:


27

Nếu bộ nhớ bạn truy cập có thể thay đổi, thì đó thực sự là một tác dụng phụ.

Ví dụ, trong Haskell, hàm để truy cập một mảng có thể thay đổi ( IOArray) có kiểu

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

(hơi đơn giản hóa cho mục đích của chúng tôi). Trong khi truy cập một mảng bất biến có loại

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

Phiên bản đầu tiên trả về một cái gì IO eđó có nghĩa là nó có tác dụng phụ I / O. Phiên bản thứ hai chỉ đơn giản trả về một phần tử loại emà không có bất kỳ tác dụng phụ nào.

Trong trường hợp truy cập một tệp, bạn chỉ đơn giản là không thể biết tại thời điểm biên dịch liệu tệp có bao giờ thay đổi trong quá trình chạy chương trình hay không. Do đó, bạn phải luôn coi nó như một hoạt động với các tác dụng phụ tiềm ẩn.


4
Vâng, với các tập tin bạn chỉ đơn giản là không thể hoàn toàn chắc chắn.
ftr

2
Bạn không bao giờ có thể chắc chắn, nhưng quan trọng hơn: trình biên dịch không thể chắc chắn. Ngoài ra, hệ thống tệp của bạn có thể bị hỏng hoặc đĩa cứng của bạn có thể bị ngắt kết nối trong khi bạn đang đọc tệp.
Tobias Brandt

5
Những tác dụng phụ của chương trình không phải là tác dụng phụ của những thứ khác. Bộ nhớ cũng không có tác dụng phụ, vì một hạt alpha hoặc neutron đi lạc có thể lật một chút và dẫn đến thay đổi mảng.
Blrfl

3
@Blrfl Đó là một điểm tốt, tuy nhiên tôi không nghĩ hai cái này tương đương nhau. Tham nhũng bộ nhớ không phải là điều bạn có thể giải quyết vì nó có thể ảnh hưởng đến dữ liệu và hướng dẫn chương trình một cách tùy tiện. Nếu nó xảy ra, điều duy nhất cần làm là chấm dứt chương trình (và có lẽ là HĐH). Mặt khác, lỗi đọc do hỏng hệ thống tệp là điều bạn phải mong đợi và có thể xử lý. Đó là một phần vốn có của việc xử lý các tập tin.
Tobias Brandt

2
Bạn đang thoát khỏi cảnh giới của các tác dụng phụ và phát hiện và xử lý lỗi, đây là một cuộc thảo luận hoàn toàn khác. Câu hỏi về tác dụng phụ là một trong những hoạt động có hay không có bất kỳ tác dụng nào đối với bất kỳ điều gì khác, không phải là liệu kết quả của hoạt động có thể bị ảnh hưởng bởi các yếu tố bên ngoài hay không.
Blrfl

10

Trong khoa học máy tính, một chức năng hoặc biểu thức được cho là có tác dụng phụ nếu ngoài việc trả về một giá trị, nó còn sửa đổi một số trạng thái hoặc có tương tác quan sát được với các chức năng gọi hoặc thế giới bên ngoài. Đọc từ một tập tin là một tương tác quan sát được với thế giới bên ngoài. Nó đáp ứng định nghĩa về tác dụng phụ. Đọc phần tử thứ 42 từ bộ nhớ chung cũng sẽ là một tác dụng phụ trừ khi mảng của bạn là hằng số vì nó sẽ là một tương tác có thể quan sát được với các chức năng khác có thể thay đổi mảng.


2

Nếu bạn có một tệp xử lý được chia sẻ thì việc đọc một tệp sẽ di chuyển tệp xử lý đó đến vị trí mà bạn đã đọc và sẽ để nó ở vị trí đó.

Nếu bạn có hai luồng xử lý tệp riêng biệt cho cùng một tệp, việc đọc từ một luồng sẽ không có tác dụng phụ đáng chú ý nào trên luồng kia.

Tuy nhiên, trong cả hai trường hợp này, đọc bộ nhớ và đọc tệp, có thể có một tác dụng phụ ẩn của bộ đệm hệ điều hành.


0

Đọc từ bộ nhớ không ảnh hưởng đến các chức năng khác và do đó không có tác dụng phụ. Đọc từ một tệp thường sẽ di chuyển con trỏ vị trí của tệp, để khi bạn đọc lại, bạn đọc dữ liệu sau những gì bạn đã đọc, do đó, một chức năng đọc thay đổi kết quả của các chức năng đọc khác, đó là hiệu ứng phụ. Thay vào đó, nếu bạn mở, đọc và đóng một tệp trong một lần thì hiệu ứng phụ này sẽ biến mất, nhưng điều đó không khả thi đối với các tệp lớn. Ngoài ra, tùy thuộc vào cách bạn mở tệp, nó có thể bị khóa sau khi mở tệp, vì vậy lần thử đầu tiên để mở và đọc tệp thành công trong khi các lần thử sau sẽ thất bại với lỗi Tệp đã mở , một lần nữa là tác dụng phụ.

Tạo một chức năng đọc không có tác dụng phụ để đọc tệp trong một lần và cho phép nhiều lần đọc cùng một lúc là khó khăn vì có các chức năng ghi tệp bị ảnh hưởng bởi chức năng đọc và loại bỏ chức năng ghi tệp lại không khả thi .


1
Bạn có thể đọc tác dụng phụ miễn phí từ một tệp nếu tệp không thay đổi và bạn đã biến tệp thành luồng (danh sách lười biếng).
Giorgio

2
Tiếp cận với HĐH cho một tệp không thuộc quyền kiểm soát của bạn một tác dụng phụ. Chỉ khi bạn có thể kiểm soát tính biến đổi của tệp (và có thể là các hoạt động đột biến theo trình tự trên nó thông qua IOđơn nguyên?) Thì bạn mới có thể thực hiện chức năng không có tác dụng phụ để đọc.
Bergi

0

Đọc từ một luồng đã có tác dụng phụ vì kết quả của các chức năng như isEOFcó thể trả về kết quả khác sau khi đọc so với trước khi đọc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.