Bellekten okumak neden bir yan etki değil, bir dosyadan okumak neden?


16

İşlem belleğinden okumayı tam olarak saf bir işlem yapan nedir? Global bellekte 100 tamsayı bir dizi oluşturduğumu ve bu dizinin 42. elemanını aldığımı varsayalım. Bu bir yan etki değil, değil mi? Peki bir dosyadan aynı 100 tamsayı dizisini okumak neden bir yan etkidir?


5
düşünün düzenlemeyi bir dosyadan 100 tamsayılar dizisi okuma yan etkidir yanı "saf operasyonu" ne kadar düşündürüyor anlatmaya ing ortalama size
tatarcık

3
@gnat Çünkü I / O ve I / O bir yan etkidir
ZhekaKozlov

3
G / Ç'nin bir yan etki olduğunu düşündüren nedir? düşünün düzenlemek soru okuyucularına anlatmaya ing]. Daha genel bir not, araştırmanızı paylaşmak herkese yardımcı olur . Neyi denediğinizi ve neden ihtiyaçlarınızı karşılamadığını bize bildirin. Bu, kendinize yardımcı olmak için zaman ayırdığınızı gösterir, bizi açık cevapları tekrar etmekten kurtarır ve en önemlisi daha spesifik ve ilgili bir cevap almanıza yardımcı olur. Ayrıca bkz. Nasıl
Sorulur

22
@gnat I / O bir yan etkidir, nokta. Klasik örneklerden biri. Wikipedia değiliz, halk bilgisi için alıntıya ihtiyacımız yok. Soru hakkında bir şeylerin iyileştirilebileceğini düşünüyorsanız, bu saman adamdan geçmek yerine açıkça söyleyin.

7
'O' bir yan etkidir. 'Ben' sadece 'ben' yapmak 'ben' yaptığınız şeyin durumunu değiştirirse bir yan etkidir. Bu, belirli bellek eşlemeli G / Ç şeyleri için doğrudur, ancak normal bir dosya için durum böyle değildir.
Tom Tanner

Yanıtlar:


27

Eriştiğiniz bellek değişebiliyorsa, bu gerçekten de bir yan etkidir.

Örneğin, Haskell'de, değiştirilebilir bir diziye ( IOArray) erişim işlevi türüne sahiptir

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

(bizim amaçlarımız için biraz basitleştirilmiş). Değişmez bir diziye erişirken,

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

İlk sürüm IO e, G / Ç yan etkileri olduğu anlamına gelen türden bir şey döndürür . İkinci sürüm e, herhangi bir yan etkisi olmayan bir tür öğeyi döndürür .

Bir dosyaya erişilmesi durumunda, derleme zamanında dosyanın programın çalışması sırasında değişip değişmeyeceğini bilemezsiniz. Bu nedenle, her zaman potansiyel yan etkileri olan bir işlem olarak ele almalısınız.


4
Eh, dosyalar ile kesinlikle emin olamazsınız.
ftr

2
Asla emin olamazsınız, ancak daha da önemlisi: derleyici emin olamaz. Ayrıca, dosyayı okurken dosya sisteminiz bozulabilir veya sabit diskinizin bağlantısı kesilebilir.
Tobias Brandt

5
Bunlar programın yan etkileri değil, başka şeylerin yan etkileri. Bir alfa parçacığı veya başıboş nötron biraz dönebildiğinden ve dizide bir değişikliğe neden olabileceğinden, bellek yan etkiden bağımsız değildir.
Blrfl

3
@Blrfl Bu iyi bir nokta, ancak ikisinin karşılaştırılabilir olduğunu düşünmüyorum. Bellek bozulması başa çıkabileceğiniz bir şey değildir, çünkü program verilerini ve talimatları keyfi bir şekilde etkileyebilir. Böyle bir durumda, yapılacak tek şey programı (ve muhtemelen işletim sistemini) sonlandırmaktır. Öte yandan, dosya sistemi bozulması nedeniyle bir okuma hatası beklemeniz ve işleyebilmeniz gereken bir şeydir. Dosyalarla uğraşmanın doğal bir parçası.
Tobias Brandt

2
Tamamen farklı bir tartışma olan yan etkiler alanından ve hata tespiti ve işlenmesine giriyorsunuz. Yan etkiler sorunu, bir operasyonun başka bir şey üzerinde herhangi bir etkisi olup olmadığı, operasyonun sonucunun dış faktörlerden etkilenip etkilenmeyeceği olup olmadığıdır.
Blrfl

10

Bilgisayar biliminde, bir fonksiyonun veya ifadenin, bir değer döndürmenin yanı sıra, bazı durumları değiştirir veya çağrı fonksiyonları veya dış dünya ile gözlemlenebilir bir etkileşime sahip olması durumunda bir yan etkiye sahip olduğu söylenir. Bir dosyadan okumak, dış dünya ile gözlemlenebilir bir etkileşimdir. Yan etki tanımını karşılar. 42. elementin global bellekten okunması, diziniz sabit olmadığı sürece diziyi değiştirebilecek diğer işlevlerle gözlemlenebilir bir etkileşim olacağı için bir yan etki olacaktır.


2

Paylaşılan bir dosya tanıtıcısı varsa, bir dosyayı okumak o dosya tanıtıcısını okuduğunuz konuma taşır ve bu konumda bırakır.

Aynı dosya için ayrı dosya tanıtıcılarına sahip iki iş parçacığınız varsa, bir dosyadan okumanın diğerinde gözle görülür bir yan etkisi olmaz.

Ancak her iki durumda da, bellek okuma ve dosya okuma, operatör sisteminin önbelleğe alınmasının gizli bir yan etkisi olabilir.


0

Bellekten okuma diğer işlevleri etkilemez ve bu nedenle yan etkisi yoktur. Bir dosyadan okumak genellikle dosyanın konum işaretçisini hareket ettirir, böylece tekrar okuduğunuzda zaten okuduklarınızdan sonra verileri okursunuz, böylece bir okuma işlevi diğer okuma işlevlerinin sonucunu değiştirir, bu da bir yan etkidir. Bunun yerine bir dosyayı bir seferde açıp kapatırsanız, bu yan etki ortadan kalkar, ancak bu büyük dosyalar için uygun değildir. İlk deneme açın ve aşağıdaki çalışır bir ile başarısız olurken dosya başarılı okumak çok Ayrıca, dosyayı açmak şekline bağlı olarak, bu, açmadan sonra kilitli hale Zaten Dosya Aç yine bir yan etkisi olduğu hata.

Dosyayı bir seferde okuyan ve aynı anda birden fazla okumaya izin veren yan etkisi olmayan bir okuma işlevi oluşturmak zordur çünkü okuma işlevinden etkilenen dosya yazma işlevleri vardır ve dosya yazma işlevlerinden kurtulmak yine mümkün değildir .


1
Dosya değişmediyse ve dosyayı bir akışa (tembel liste) dönüştürdüyseniz, bir dosyadan yan etkisiz okuma yapabilirsiniz.
Giorgio

2
Sizin kontrolünüz altında olmayan bir dosya için OS uzanarak olan bir yan etki. Yalnızca dosyanın değişebilirliğini kontrol edebilseydiniz (ve belki de dizideki mutasyon işlemlerini… IOmonad aracılığıyla ?) Okumak için yan etkisiz bir işlev yapabilirsiniz.
Bergi

0

Bir akıştan okumak zaten bir yan etkidir, çünkü gibi işlevlerin isEOFsonuçları okumadan sonra okumadan farklı sonuçlar döndürebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.