Mengapa membaca dari memori bukan efek samping tetapi membaca dari file?

16

Apa sebenarnya yang menjadikan pembacaan dari memori proses operasi murni? Misalkan saya membuat array 100 integer dalam memori global dan kemudian mengambil elemen ke-42 dari array ini. Itu bukan efek samping, kan? Jadi mengapa membaca array yang sama dari 100 bilangan bulat dari file efek samping?

ZhekaKozlov
sumber
5
pertimbangkan untuk mengedit untuk menjelaskan apa yang membuat Anda berpikir bahwa membaca array 100 integer dari sebuah file adalah efek samping, serta apa arti "operasi murni" bagi Anda
agas
3
@gnat Karena itu adalah I / O dan I / O adalah efek samping
ZhekaKozlov
3
apa yang membuat Anda berpikir bahwa I / O adalah efek samping? pertimbangkan edit untuk menjelaskannya kepada pembaca. Pada catatan yang lebih umum, berbagi penelitian Anda membantu semua orang . Beri tahu kami apa yang telah Anda coba dan mengapa itu tidak memenuhi kebutuhan Anda. Ini menunjukkan bahwa Anda telah meluangkan waktu untuk mencoba membantu diri sendiri, itu menyelamatkan kami dari mengulangi jawaban yang jelas, dan yang paling utama itu membantu Anda mendapatkan jawaban yang lebih spesifik dan relevan. Lihat juga Cara Meminta
nyamuk
22
@gnat I / O adalah efek samping, titik. Itu salah satu contoh klasik. Kami bukan Wikipedia, kami tidak membutuhkan kutipan untuk pengetahuan umum. Jika Anda berpikir sesuatu dapat diperbaiki tentang pertanyaan itu, katakan langsung daripada melalui pria jerami ini.
7
'O' adalah efek samping. 'Aku' hanya efek samping jika melakukan 'Aku' mengubah keadaan dari apa yang kamu lakukan 'Aku' dari. Yang berlaku untuk memori tertentu memetakan I / O hal-hal tetapi tidak mungkin untuk kasus file normal.
Tom Tanner

Jawaban:

27

Jika memori yang Anda akses dapat berubah, maka itu memang efek samping.

Misalnya, di Haskell, fungsi untuk mengakses array yang dapat diubah ( IOArray) memiliki tipe

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

(sedikit disederhanakan untuk tujuan kita). Saat mengakses array yang tidak dapat diubah memiliki tipe

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

Versi pertama mengembalikan sesuatu bertipe IO eyang artinya memiliki efek samping I / O. Versi kedua hanya mengembalikan elemen tipe etanpa efek samping.

Dalam hal mengakses file, Anda tidak bisa tahu pada waktu kompilasi apakah file akan pernah berubah selama menjalankan program. Karena itu, Anda harus selalu memperlakukannya sebagai operasi dengan potensi efek samping.

Tobias Brandt
sumber
4
Nah, dengan file Anda tidak bisa benar-benar yakin.
ftr
2
Anda tidak pernah bisa yakin, tetapi yang lebih penting: kompiler tidak dapat memastikan. Selain itu, sistem file Anda mungkin rusak atau hard disk Anda mungkin terputus saat Anda membaca file.
Tobias Brandt
5
Itu bukan efek samping dari program, mereka adalah efek samping dari hal lain. Memori juga tidak bebas efek samping, karena partikel alfa atau neutron yang tersesat dapat membalik sedikit dan menghasilkan perubahan pada array.
Blrfl
3
@ Blrfl Itu poin yang bagus, namun saya tidak berpikir keduanya sebanding. Memori yang rusak bukanlah sesuatu yang bisa Anda tangani karena dapat memengaruhi data dan instruksi program dengan cara yang sewenang-wenang. Jika itu terjadi, satu-satunya hal yang harus dilakukan adalah menghentikan program (dan mungkin OS). Di sisi lain, kesalahan baca akibat korupsi sistem file adalah sesuatu yang harus Anda harapkan dan dapat Anda tangani. Ini merupakan bagian yang tidak terpisahkan dari berurusan dengan file.
Tobias Brandt
2
Anda keluar dari dunia efek samping dan masuk ke deteksi dan penanganan kesalahan, yang merupakan diskusi yang sama sekali berbeda. Pertanyaan tentang efek samping adalah apakah suatu operasi memiliki efek pada hal lain atau tidak, apakah hasil operasi dapat dipengaruhi oleh faktor eksternal atau tidak.
Blrfl
10

Dalam ilmu komputer, fungsi atau ekspresi dikatakan memiliki efek samping jika, selain mengembalikan nilai, itu juga memodifikasi beberapa keadaan atau memiliki interaksi yang dapat diamati dengan fungsi panggilan atau dunia luar. Membaca dari file adalah interaksi yang dapat diamati dengan dunia luar. Memenuhi definisi efek samping. Membaca elemen ke-42 dari memori global akan menjadi efek samping juga kecuali jika array Anda adalah konstan karena itu akan menjadi interaksi yang dapat diamati dengan fungsi lain yang dapat memodifikasi array.

stonemetal
sumber
2

Jika Anda memiliki pegangan file bersama maka membaca file akan memindahkan pegangan file itu ke posisi di mana Anda telah membaca, dan akan meninggalkannya di posisi itu.

Jika Anda memiliki dua utas dengan pegangan file yang terpisah ke file yang sama, membaca dari satu tidak akan memiliki efek samping yang terlihat pada yang lain.

Namun dalam kedua kasus ini, pembacaan memori dan pembacaan file, mungkin ada efek samping tersembunyi dari caching sistem operator.

Uang tunai
sumber
0

Membaca dari memori tidak memengaruhi fungsi lain dan karenanya bebas efek samping. Membaca dari file biasanya akan memindahkan penunjuk posisi file, sehingga ketika Anda membaca lagi Anda membaca data setelah apa yang sudah Anda baca, jadi satu fungsi baca mengubah hasil dari fungsi baca lainnya, yang merupakan efek samping. Jika Anda membuka, membaca, dan menutup file sekaligus, efek samping ini menghilang, tetapi itu tidak layak untuk file besar. Selain itu, tergantung pada bagaimana Anda membuka file, mungkin menjadi terkunci setelah membukanya, jadi yang pertama mencoba untuk membuka dan membaca file berhasil sementara mencoba berikut akan gagal dengan kesalahan File Sudah Buka , yang lagi-lagi merupakan efek samping.

Membuat fungsi membaca bebas efek samping yang membaca file dalam sekali jalan dan memungkinkan banyak membaca sekaligus sulit karena ada fungsi penulisan file yang dipengaruhi oleh fungsi membaca dan menyingkirkan fungsi penulisan file lagi-lagi tidak layak. .

nwp
sumber
1
Anda dapat memiliki efek samping membaca gratis dari file jika file tidak berubah dan Anda mengubah file menjadi aliran (daftar malas).
Giorgio
2
Mencapai OS untuk file yang tidak di bawah kendali Anda adalah efek samping. Hanya jika Anda dapat mengontrol mutabilitas file (dan mungkin urutan operasi bermutasi di atasnya ... melalui IOmonad?) Anda dapat membuat fungsi bebas efek samping untuk membaca.
Bergi
0

Membaca dari aliran adalah efek samping karena hasil dari fungsi seperti isEOFdapat mengembalikan hasil yang berbeda setelah membaca daripada sebelum membaca.

Hagen von Eitzen
sumber