मैं निम्न स्तर पर समझना चाहता हूं कि यदि डेटा संरचना लगातार नहीं होगी तो क्या होगा?
आइए डेटा संरचना के रूप में एक विशाल राज्य अंतरिक्ष ( 2450 बाइट्स वाले राज्य के साथ " मेर्सन ट्विस्टर ") के साथ एक छद्म आयामी संख्या जनरेटर को देखें । हम वास्तव में किसी भी यादृच्छिक संख्या का एक से अधिक बार उपयोग नहीं करना चाहते हैं, इसलिए इसे अपरिवर्तनीय स्थायी डेटा संरचना के रूप में कार्यान्वित करने का बहुत कम कारण प्रतीत होता है। अब चलो खुद से पूछें कि निम्नलिखित कोड में क्या गलत हो सकता है:
mt_gen = CreateMersenneTwisterPRNGen(seed)
integral = MonteCarloIntegral_Bulk(mt_gen) + MonteCarloIntegral_Boundary(mt_gen)
अधिकांश प्रोग्रामिंग भाषाओं जिस क्रम में निर्दिष्ट नहीं करते हैं MonteCarloIntegral_Bulk
और MonteCarloIntegral_Boundary
मूल्यांकन किया जाएगा। यदि दोनों एक तर्क के रूप में एक उत्परिवर्ती mt_gen का संदर्भ लेते हैं, तो इस गणना का परिणाम प्लेटफॉर्म पर निर्भर हो सकता है। इससे भी बुरी बात यह है कि ऐसे प्लेटफ़ॉर्म हो सकते हैं जहाँ परिणाम अलग-अलग रनों के बीच बिल्कुल भी नहीं होता।
एक ऐसे mt_gen के लिए एक कुशल उत्परिवर्तनीय डेटा संरचना को डिज़ाइन कर सकता है जैसे कि निष्पादन के किसी भी interleaving MonteCarloIntegral_Bulk
और MonteCarloIntegral_Boundary
"सही" परिणाम देगा, लेकिन एक अलग interleaving सामान्य रूप से एक अलग "सही" परिणाम का नेतृत्व करेगा। यह गैर-प्रजनन योग्यता संबंधित कार्य को "अशुद्ध" बनाता है, और कुछ अन्य समस्याओं को भी जन्म देता है।
एक निश्चित अनुक्रमिक निष्पादन आदेश लागू करने से गैर-प्रजनन योग्यता से बचा जा सकता है। लेकिन उस स्थिति में कोड को इस तरह से व्यवस्थित किया जा सकता है कि किसी भी समय mt_gen के लिए केवल एक ही संदर्भ उपलब्ध हो। टाइप की गई कार्यात्मक प्रोग्रामिंग भाषा में, इस बाधा को लागू करने के लिए विशिष्टता प्रकारों का उपयोग किया जा सकता है, जिससे शुद्ध कार्यात्मक प्रोग्रामिंग भाषाओं के संदर्भ में भी सुरक्षित परिवर्तनशील अद्यतन सक्षम हो सकते हैं। यह सब अच्छा और नम्र लग सकता है, लेकिन कम से कम सिद्धांत में मोंटे कार्लो सिमुलेशन शर्मनाक रूप से समानांतर हैं, और हमारे "समाधान" ने इस संपत्ति को नष्ट कर दिया। यह सिर्फ एक सैद्धांतिक समस्या नहीं है, बल्कि एक बहुत ही वास्तविक व्यावहारिक मुद्दा है। हालांकि, हमें अपने छद्म आयामी संख्या जनरेटर और इसके द्वारा उत्पादित यादृच्छिक संख्याओं के अनुक्रम को संशोधित करना होगा (और कोई भी प्रोग्रामिंग भाषा हमारे लिए यह स्वचालित रूप से नहीं कर सकती है। (बेशक हम एक अलग छद्म आयामी संख्या पुस्तकालय का उपयोग कर सकते हैं जो पहले से ही आवश्यक कार्यक्षमता प्रदान करता है।)
निम्न स्तर पर, उत्परिवर्तनीय डेटा संरचनाएं आसानी से गैर-प्रजनन-क्षमता (और इसलिए अशुद्धता) की ओर ले जाती हैं, यदि निष्पादन क्रम अनुक्रमिक और निश्चित नहीं है। इन समस्याओं से निपटने के लिए एक विशिष्ट अनिवार्य रणनीति तय निष्पादन क्रम के साथ अनुक्रमिक चरण है, जिसके दौरान उत्परिवर्तनीय डेटा संरचनाएं बदली जाती हैं, और मनमाने ढंग से निष्पादन आदेश के साथ समानांतर चरण होते हैं, जिसके दौरान सभी साझा किए गए परिवर्तनशील डेटा संरचनाएं स्थिर रहती हैं।
लेडी बाउर ने उत्परिवर्तनीय डेटा संरचनाओं के लिए अलियासिंग का मुद्दा उठाया। दिलचस्प रूप से पर्याप्त है, फ़ॉर्टन और सी जैसी अलग-अलग अनिवार्य भाषाओं में फ़ंक्शन तर्कों की अनुमति के बारे में अलग-अलग धारणाएं हैं, और अधिकांश प्रोग्रामर इस बात से अनजान हैं कि उनकी भाषा में अलियासिंग मॉडल है।
अपरिवर्तनीयता और मूल्य शब्दार्थ थोड़ा अधिक हो सकता है। अधिक महत्वपूर्ण यह है कि आपकी प्रोग्रामिंग भाषा का प्रकार सिस्टम और लॉजिकल फ्रेमवर्क (एब्सट्रैक्ट मशीन मॉडल, अलियासिंग मॉडल, कंसीडर मॉडल या मेमोरी मैनेजमेंट मॉडल), "कुशल" डेटा के साथ "सुरक्षित रूप से" काम करने के लिए पर्याप्त समर्थन प्रदान करता है। संरचनाओं। C ++ 11 के लिए "चाल शब्दार्थ" की शुरुआत एक सैद्धांतिक दृष्टिकोण से शुद्धता और "सुरक्षा" के संदर्भ में एक विशाल कदम की तरह लग सकती है, लेकिन व्यवहार में यह विपरीत है। नए शब्दार्थ से जुड़े खतरे के बड़े हिस्से को हटाने के लिए टाइप सिस्टम और भाषा के तार्किक ढांचे को बढ़ाया गया है। (और यहां तक कि अगर किसी न किसी किनारों रहते हैं, इसका मतलब यह नहीं है कि यह "बेहतर" द्वारा सुधार नहीं किया जा सकता है
उदय रेड्डी ने यह मुद्दा उठाया कि गणित ने कभी भी परिवर्तनशील डेटा ऑब्जेक्ट्स के साथ काम नहीं किया है, और यह कि कार्यात्मक कार्यक्रमों के लिए प्रकार सिस्टम अपरिवर्तनीय डेटा ऑब्जेक्ट्स के लिए अच्छी तरह से विकसित होते हैं। इसने मुझे जीन-यवेस गिरार्ड के स्पष्टीकरण को याद दिलाया कि गणित का उपयोग अस्थिर वस्तुओं के साथ काम करने के लिए नहीं किया जाता है, जब वह रैखिक तर्क को प्रेरित करने की कोशिश करता है।
कोई यह पूछ सकता है कि कार्यात्मक प्रोग्रामिंग भाषाओं की प्रकार प्रणाली और तार्किक रूपरेखा को किस प्रकार "कुशल" परस्पर "गैर-स्थायी डेटा संरचनाओं" के साथ "सुरक्षित" काम करने की अनुमति दें। यहां एक समस्या यह हो सकती है कि शास्त्रीय तर्क और बूलियन बीजगणित परस्पर डेटा संरचनाओं के साथ काम करने के लिए सबसे अच्छा तार्किक ढांचा नहीं हो सकता है। शायद लीनियर लॉजिक और कम्यूटेटिव मोनॉयड उस कार्य के लिए बेहतर अनुकूल हो सकते हैं? शायद मुझे यह पढ़ना चाहिए कि फंक्शनल प्रोग्रामिंग लैंग्वेजेज के लिए टाइप लॉजिक के रूप में फिलिप वाडलर को लीनियर लॉजिक पर क्या कहना है ? लेकिन भले ही रैखिक तर्क इस समस्या को हल करने में सक्षम नहीं होना चाहिए, इसका मतलब यह नहीं है कि "सुरक्षित" और "कुशल" की अनुमति देने के लिए एक कार्यात्मक प्रोग्रामिंग भाषा के प्रकार और तार्किक ढांचे को बढ़ाया नहीं जा सकता है।