मेमोरी से पढ़ना साइड-इफ़ेक्ट क्यों नहीं है लेकिन फाइल से पढ़ना है?


16

क्या वास्तव में प्रक्रिया मेमोरी से एक शुद्ध संचालन पढ़ने बनाता है? मान लीजिए मैंने वैश्विक मेमोरी में 100 पूर्णांकों की एक सरणी बनाई और फिर इस सरणी का 42 वां तत्व लिया। यह एक साइड इफेक्ट नहीं है, है ना? तो क्यों एक फ़ाइल से एक साइड-इफेक्ट में 100 पूर्णांकों की एक ही सरणी पढ़ रहा है?


5
विचार करने के लिए संपादित करें पर विचार करें कि आपको क्या लगता है कि किसी फ़ाइल से 100 पूर्णांक का सरणी पढ़ना एक साइड-इफ़ेक्ट है, साथ ही साथ "शुद्ध संचालन" का आपके लिए क्या अर्थ है
gnat

3
@gnat क्योंकि यह I / O है और I / O एक साइड-इफेक्ट है
ZhekaKozlov

3
आपको क्या लगता है कि I / O एक दुष्प्रभाव है? विचार संपादित करें ] यह समझाने के लिए कि पाठकों से सवाल पूछें। अधिक सामान्य नोट पर, अपने शोध को साझा करना हर किसी की मदद करता है । हमें बताएं कि आपने क्या प्रयास किया है और यह आपकी आवश्यकताओं को पूरा क्यों नहीं करता है। यह दर्शाता है कि आपने खुद को मदद करने का प्रयास करने के लिए समय लिया है, यह हमें स्पष्ट उत्तरों को दोहराने से बचाता है, और सबसे अधिक यह आपको अधिक विशिष्ट और प्रासंगिक उत्तर प्राप्त करने में मदद करता है। यह भी देखें कैसे पूछें
gnat

22
@ जगत् I / O एक दुष्प्रभाव है, अवधि। यह क्लासिक उदाहरणों में से एक है। हम विकिपीडिया नहीं हैं, हमें लोक ज्ञान के लिए उद्धरणों की आवश्यकता नहीं है। यदि आपको लगता है कि इस प्रश्न के बारे में कुछ सुधार किया जा सकता है, तो इस स्ट्रॉ मैन के माध्यम से जाने के बजाय इसे सीधे कहें।

7
Effect O ’एक साइड इफेक्ट है। 'मैं' केवल एक साइड इफेक्ट है अगर 'मैं' करने से आप जो 'मैं' कर रहे हैं उसकी स्थिति बदल जाती है। जो कि कुछ मेमोरी मैप्ड I / O चीजों के लिए सही है लेकिन एक सामान्य फ़ाइल के मामले में होने की संभावना नहीं है।
टॉम टैनर

जवाबों:


27

यदि आपके द्वारा उपयोग की जाने वाली मेमोरी बदल सकती है, तो यह वास्तव में एक दुष्प्रभाव है।

उदाहरण के लिए, हास्केल में, एक उत्परिवर्तित सरणी ( IOArray) का उपयोग करने के लिए फ़ंक्शन का प्रकार है

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

(हमारे उद्देश्यों के लिए थोड़ा सरलीकृत)। एक अपरिवर्तनीय सरणी तक पहुँचने के दौरान टाइप होता है

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

पहला संस्करण कुछ प्रकार देता है IO eजिसका अर्थ है कि इसमें I / O दुष्प्रभाव हैं। दूसरा संस्करण eबिना किसी दुष्प्रभाव के बस एक प्रकार का तत्व देता है ।

किसी फ़ाइल तक पहुँचने के मामले में, आप बस संकलन समय पर नहीं जान सकते हैं कि प्रोग्राम के चलने के दौरान फ़ाइल कभी बदल जाएगी या नहीं। इसलिए, आपको इसे हमेशा संभावित दुष्प्रभावों के साथ एक ऑपरेशन के रूप में व्यवहार करना होगा।


4
ठीक है, फ़ाइलों के साथ आप बिल्कुल यकीन नहीं कर सकते हैं।
ftr

2
आप कभी सुनिश्चित नहीं हो सकते, लेकिन अधिक महत्वपूर्ण: संकलक सुनिश्चित नहीं किया जा सकता है। इसके अलावा, आपका फ़ाइल सिस्टम दूषित हो सकता है या फ़ाइल पढ़ते समय आपकी हार्ड डिस्क डिस्कनेक्ट हो सकती है।
टोबियास ब्रांड्ट

5
वे कार्यक्रम के दुष्प्रभाव नहीं हैं, वे अन्य चीजों के दुष्प्रभाव हैं। मेमोरी का साइड-इफ़ेक्ट-फ़्री नहीं है, या तो, चूंकि एक अल्फा कण या आवारा न्यूट्रॉन थोड़ा फ्लिप कर सकता है और परिणाम सरणी में बदल सकता है।
ब्लर एफएल fl

3
@Blrfl यह एक अच्छा बिंदु है, हालांकि मुझे नहीं लगता कि दोनों तुलनीय हैं। मेमोरी भ्रष्टाचार कुछ ऐसा नहीं है जिससे आप निपट सकते हैं क्योंकि यह प्रोग्राम डेटा और निर्देशों को अनियंत्रित तरीके से प्रभावित कर सकता है। यदि ऐसा होता है, तो केवल एक चीज कार्यक्रम को समाप्त करना है (और शायद ओएस)। दूसरी ओर, फ़ाइल सिस्टम भ्रष्टाचार के कारण एक पठन त्रुटि ऐसी चीज़ है जिसकी आपको अपेक्षा करनी चाहिए और उसे संभालने में सक्षम होना चाहिए। यह फाइलों से निपटने का एक अंतर्निहित हिस्सा है।
टोबियास ब्रांड

2
आप साइड इफेक्ट्स के दायरे से बाहर निकल रहे हैं और त्रुटि का पता लगाने और संभालने में, जो एक पूरी तरह से अलग चर्चा है। साइड इफेक्ट का सवाल यह है कि किसी ऑपरेशन का किसी और चीज पर कोई प्रभाव पड़ता है या नहीं, ऑपरेशन के परिणाम बाहरी कारकों से प्रभावित हो सकते हैं या नहीं।
ब्लरफिल fl

10

कंप्यूटर विज्ञान में, किसी फ़ंक्शन या एक्सप्रेशन को साइड इफ़ेक्ट कहा जाता है, यदि मान वापस करने के अलावा, यह कुछ अवस्थाओं को संशोधित भी करता है या कॉलिंग फ़ंक्शन या बाहरी दुनिया के साथ अवलोकन योग्य बातचीत करता है। एक फ़ाइल से पढ़ना बाहरी दुनिया के साथ एक अवलोकन योग्य बातचीत है। यह साइड इफेक्ट की परिभाषा को पूरा करता है। वैश्विक स्मृति से 42 वें तत्व को पढ़ना तब तक एक साइड इफेक्ट होगा जब तक कि आपका सरणी एक स्थिर नहीं है क्योंकि यह अन्य कार्यों के साथ अवलोकन योग्य होगा जो कि सरणी को संशोधित कर सकता है।


2

यदि आपके पास एक साझा फ़ाइल हैंडल है, तो एक फ़ाइल पढ़ने से वह फ़ाइल हैंडल उस स्थिति में चली जाएगी जहां आपने पढ़ा है, और उस स्थान पर छोड़ देगा।

यदि आपके पास एक ही फ़ाइल के लिए अलग-अलग फ़ाइल हैंडल वाले दो धागे हैं, तो एक से पढ़ने पर दूसरे पर कोई ध्यान देने योग्य दुष्प्रभाव नहीं होगा।

हालाँकि इन दोनों मामलों में, मेमोरी रीडिंग और फाइल रीडिंग, ऑपरेटर सिस्टम कैशिंग का एक छिपा हुआ दुष्प्रभाव हो सकता है।


0

स्मृति से पढ़ना अन्य कार्यों को प्रभावित नहीं करता है और इसलिए साइड-इफेक्ट-मुक्त है। फ़ाइल से पढ़ना आम तौर पर फ़ाइल की स्थिति सूचक को स्थानांतरित कर देगा, ताकि जब आप फिर से पढ़ते हैं तो आपने जो पहले से पढ़ा है उसके बाद डेटा पढ़ें, इसलिए एक रीड फ़ंक्शन अन्य रीड फ़ंक्शन के परिणाम को बदलता है, जो एक साइड इफेक्ट है। यदि आप इसके बजाय किसी फ़ाइल को खोलते, पढ़ते और बंद करते हैं तो यह साइड इफेक्ट गायब हो जाता है, लेकिन यह बड़ी फ़ाइलों के लिए संभव नहीं है। इसके अतिरिक्त, आप फ़ाइल को कैसे खोलते हैं, इस पर निर्भर करते हुए, यह खोलने के बाद लॉक हो सकता है, इसलिए फ़ाइल को खोलने और पढ़ने का पहला प्रयास सफल होता है जबकि निम्नलिखित प्रयास फ़ाइल पहले से ही खुली त्रुटि के साथ विफल हो जाएंगे , जो फिर से एक दुष्प्रभाव है।

एक साइड-इफ़ेक्ट-फ्री रीडिंग फंक्शन बनाना जो फ़ाइल को एक बार में पढ़ता है और एक ही समय में कई रीड्स की अनुमति देता है क्योंकि फाइल राइटिंग फ़ंक्शन हैं जो रीडिंग फ़ंक्शन से प्रभावित होते हैं और फाइल राइटिंग फ़ंक्शन से छुटकारा पाना फिर से संभव नहीं है। ।


1
यदि फ़ाइल नहीं बदली तो आप फ़ाइल से साइड-इफ़ेक्ट फ्री रीडिंग कर सकते हैं और आपने फाइल को एक स्ट्रीम (आलसी सूची) में बदल दिया है।
जियोर्जियो

2
आपके नियंत्रण में नहीं रहने वाली फ़ाइल के लिए OS पर पहुंचना एक दुष्प्रभाव है। केवल तभी जब आप फ़ाइल की उत्परिवर्तन को नियंत्रित कर सकते हैं (और शायद उस पर अनुक्रम उत्परिवर्तन कर सकते हैं ... IOमोनड के माध्यम से ?) आप पढ़ने के लिए एक साइड-इफ़ेक्ट-फ्री फ़ंक्शन बना सकते हैं।
Bergi

0

एक स्ट्रीम से पढ़ना पहले से ही एक साइड इफेक्ट है क्योंकि कार्यों के परिणाम जैसे isEOFकि पढ़ने से पहले पढ़ने के बाद अलग-अलग परिणाम दे सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.