संदर्भात्मक पारदर्शिता क्या है?


285

संदर्भात्मक पारदर्शिता शब्द का क्या अर्थ है? मैंने इसे "के रूप में वर्णित किया है, इसका मतलब है कि आप इसे बराबरी के साथ बदल सकते हैं" लेकिन यह एक अपर्याप्त विवरण की तरह लगता है।


1
वाह मुझे आश्चर्य है कि अचानक इस सवाल की लोकप्रियता में उतार-चढ़ाव क्यों ...
क्लाउडी

1
@ क्लौदिया: मैं निश्चित रूप से नहीं कह सकता, लेकिन आर / हैस्केल को हवा मिली और कई लोगों ने महसूस किया कि उदय सटीक था, लेकिन समुदाय में थोड़ा सा जीब ले रहा था।
४१:

6
@ एफ्रे ए जिब, शायद यह था। लेकिन, जब कार्यात्मक प्रोग्रामर अनिवार्य प्रोग्रामिंग भाषाओं और साइड-इफ़ेक्टिंग कार्यात्मक भाषाओं (जैसे लिस्प और एमएल) की शूटिंग करते हैं, तो यह दावा करते हैं कि वे संदर्भात्मक रूप से पारदर्शी नहीं हैं, क्या वे एक जिब नहीं ले रहे हैं? क्या ऐसा करने से पहले उन्हें कम से कम अपने तथ्यों को सही नहीं लाना चाहिए?
उदय रेड्डी

2
@ कलैदु मैं इसे हास्केल रेडिट पर पोस्ट कर रहा हूं और कोनल इसे ट्वीट कर रहा है। मैंने चर्चा को दिलचस्प पाया और सोचा कि यह व्यापक चर्चा का गुण है। मैंने उदय के जिब पर ध्यान आकर्षित किया ताकि चर्चा को बढ़ावा मिले। मैं सहमत हूं कि हमें FPers कभी-कभी रूखे हो सकते हैं और इसे प्रदान करने के लिए उदय के लिए एक अच्छे उत्पाद की जरूरत होती है।
क्रिसडॉर्न

7
@efrey। दरअसल, इसीलिए मैंने अपनी दूसरी पोस्ट में बर्ड और वडलर (अर्थशास्त्री?) का हवाला दिया। जानकार लोग जानते हैं कि संदर्भात्मक पारदर्शिता की लोकप्रिय अवधारणा अस्पष्ट और संभवतः असंगत है। लेकिन इसे प्रोग्रामिंग समुदाय को ठीक से समझाया नहीं गया है। उम्मीद है कि यहां मेरे लेखन से फर्क पड़ेगा।
उदय रेड्डी

जवाबों:


362

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

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

एक वाक्य में एक संदर्भ "संदर्भित रूप से पारदर्शी" है यदि उस संदर्भ में एक शब्द को दूसरे शब्द द्वारा प्रतिस्थापित किया जाए जो उसी इकाई को संदर्भित करता है जो अर्थ में परिवर्तन नहीं करता है। उदाहरण के लिए

स्कॉटलैंड की संसद स्कॉटलैंड की राजधानी में मिलती है।

के रूप में ही मतलब है

स्कॉटिश संसद एडिनबर्ग में मिलती है।

तो संदर्भ "स्कॉटिश संसद में मिलता है ..." एक संदर्भात्मक पारदर्शी संदर्भ है। हम अर्थ को बदले बिना "एडिनबर्ग" के साथ "स्कॉटलैंड की राजधानी" को बदल सकते हैं। एक और तरीका रखने के लिए, संदर्भ केवल इस बात की परवाह करता है कि शब्द क्या संदर्भित करता है और कुछ नहीं। यह वह अर्थ है जिसमें संदर्भ "संदर्भ रूप से पारदर्शी है।"

दूसरी ओर, वाक्य में,

एडिनबर्ग 1999 से स्कॉटलैंड की राजधानी रहा है।

हम ऐसा कोई प्रतिस्थापन नहीं कर सकते। यदि हमने किया, तो हमें "एडिनबर्ग 1999 से एडिनबर्ग रहा है", जो कहने के लिए एक पौष्टिक बात है, और मूल वाक्य के समान अर्थ को व्यक्त नहीं करता है। तो, ऐसा लगता है कि संदर्भ "एडिनबर्ग रहा है ... 1999 के बाद से" संदर्भित रूप से अपारदर्शी है (संदर्भित रूप से पारदर्शी के विपरीत)। यह जाहिरा तौर पर के बारे में परवाह करता है कुछ और क्या शब्द का उल्लेख करता है। यह क्या है?

"स्कॉटलैंड की राजधानी" जैसी चीजों को निश्चित शब्द कहा जाता है और उन्होंने लंबे समय तक तर्कवादियों और दार्शनिकों को सिरदर्द की कोई मात्रा नहीं दी। रसेल और क्वीन ने उन्हें यह कहते हुए छांटा कि वे वास्तव में "रेफ़रेंशियल" नहीं हैं, अर्थात, यह सोचने की गलती है कि उपरोक्त उदाहरणों का उपयोग संस्थाओं को संदर्भित करने के लिए किया जाता है। "एडिनबर्ग 1999 से स्कॉटलैंड की राजधानी रही है" यह समझने का सही तरीका है

स्कॉटलैंड की राजधानी 1999 से है और यह राजधानी एडिनबर्ग है।

इस वाक्य को एक नट के रूप में नहीं बदला जा सकता है। समस्या सुलझ गयी! क्वीन का कहना था कि प्राकृतिक भाषा गड़बड़ है, या कम से कम जटिल है, क्योंकि यह व्यावहारिक उपयोग के लिए सुविधाजनक है, लेकिन दार्शनिकों और तर्कवादियों को उन्हें सही तरीके से समझकर स्पष्टता लाना चाहिए। प्रासंगिक पारदर्शिता अर्थ की ऐसी स्पष्टता लाने के लिए इस्तेमाल किया जाने वाला उपकरण है

प्रोग्रामिंग के साथ यह सब क्या करना है? बहुत ज्यादा नहीं, वास्तव में। जैसा कि हमने कहा, रेफ़रेन्शियल ट्रांसपेरेंसी एक उपकरण है जिसका उपयोग भाषा को समझने में किया जाता है, अर्थात, अर्थ प्रदान करने मेंक्रिस्टोफर स्ट्रेची , जिन्होंने प्रोग्रामिंग भाषा शब्दार्थ के क्षेत्र की स्थापना की, ने अपने अर्थ के अध्ययन में इसका इस्तेमाल किया। उनका संस्थापक पत्र " प्रोग्रामिंग भाषाओं में मौलिक अवधारणा " वेब पर उपलब्ध है। यह एक सुंदर कागज है और हर कोई इसे पढ़ और समझ सकता है। तो, कृपया ऐसा करें। आप बहुत प्रबुद्ध होंगे। उन्होंने इस अनुच्छेद में "संदर्भात्मक पारदर्शिता" शब्द का परिचय दिया:

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

"संक्षेप में" का उपयोग यह बताता है कि स्ट्रेची इसे सरल शब्दों में समझाने के लिए इसे पैराफ़्रेस्स कर रहा है। कार्यात्मक प्रोग्रामर इस पैराग्राफ को अपने तरीके से समझने लगते हैं। कागज में "संदर्भात्मक पारदर्शिता" की 9 अन्य घटनाएं हैं, लेकिन वे दूसरों में से किसी के बारे में परेशान नहीं लगते हैं। वास्तव में, स्ट्रैची का पूरा पेपर अनिवार्य प्रोग्रामिंग भाषाओं के अर्थ को समझाने के लिए समर्पित है । लेकिन, आज, कार्यात्मक प्रोग्रामर का दावा है कि अनिवार्य प्रोग्रामिंग भाषाएं प्रासंगिक रूप से पारदर्शी नहीं हैं । स्ट्रैची उसकी कब्र में बदल जाएगा।

हम स्थिति को उबार सकते हैं। हमने कहा कि प्राकृतिक भाषा "गन्दा, या कम से कम जटिल है" क्योंकि यह व्यावहारिक उपयोग के लिए सुविधाजनक है। प्रोग्रामिंग लैंग्वेज उसी तरह हैं। वे "गन्दा, या कम से कम जटिल हैं" क्योंकि उन्हें व्यावहारिक उपयोग के लिए सुविधाजनक बनाया जाता है। इसका मतलब यह नहीं है कि उन्हें हमें भ्रमित करने की आवश्यकता है। उन्हें बस सही तरीके से समझा जाना चाहिए, एक मेटा भाषा का उपयोग करना जो संदर्भात्मक रूप से पारदर्शी है ताकि हमारे पास अर्थ की स्पष्टता हो। जिस पेपर में मैंने उद्धृत किया, स्ट्रैची ठीक यही करता है। वह अनिवार्य प्रोग्रामिंग भाषाओं के अर्थ को प्रारंभिक अवधारणाओं में तोड़कर स्पष्ट करता है, कहीं भी स्पष्टता नहीं खोता है। उनके विश्लेषण का एक महत्वपूर्ण हिस्सा यह बताना है कि प्रोग्रामिंग भाषाओं में अभिव्यक्ति के दो प्रकार "मूल्य" होते हैं:r- मान । स्ट्रैची के कागज से पहले, यह समझ में नहीं आया और भ्रम ने सर्वोच्च शासन किया। आज, C की परिभाषा इसे नियमित रूप से बताती है और हर C प्रोग्रामर भेद को समझता है। (क्या अन्य भाषाओं में प्रोग्रामर इसे समान रूप से अच्छी तरह समझते हैं, यह कहना मुश्किल है।)

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

[अतिरिक्त नोट: ऊपर दिए गए उदाहरण बताते हैं कि एक साधारण वाक्यांश जैसे "स्कॉटलैंड की राजधानी" के कई स्तर हैं। एक स्तर पर, हम मौजूदा समय में पूंजी के बारे में बात कर रहे होंगे। दूसरे स्तर पर, हम उन सभी संभावित राजधानियों के बारे में बात कर सकते हैं जो स्कॉटलैंड के समय के दौरान हो सकती थीं। हम सामान्य संदर्भ में काफी आसानी से सभी संदर्भों को प्राप्त करने के लिए "एक विशेष संदर्भ में ज़ूम" और "ज़ूम आउट" कर सकते हैं। प्राकृतिक भाषा की दक्षता ऐसा करने की हमारी क्षमता का उपयोग करती है। इंपीरियल प्रोग्रामिंग लैंग्वेज उसी तरह से बहुत कुशल हैं। हम एक विशेष स्थिति में इसके मूल्य के बारे में बात करने के लिए एक असाइनमेंट (राइट -वैल्यू ) के दाईं ओर एक चर x का उपयोग कर सकते हैं । या, हम इसके एल-मूल्य के बारे में बात कर सकते हैंजो सभी राज्यों में फैला हुआ है। ऐसी बातों से लोग शायद ही भ्रमित होते हैं। हालाँकि, वे भाषा निर्माणों में निहित अर्थ की सभी परतों की ठीक-ठीक व्याख्या करने में सक्षम हो भी सकते हैं और नहीं भी। अर्थ की ऐसी सभी परतें आवश्यक रूप से 'स्पष्ट' नहीं हैं और उनका सही ढंग से अध्ययन करना विज्ञान की बात है। हालांकि, ऐसे स्तरित अर्थों को समझाने के लिए आम लोगों की निष्पक्षता का मतलब यह नहीं है कि वे उनके बारे में भ्रमित हैं।]

नीचे एक अलग "पोस्टस्क्रिप्ट" इस चर्चा को कार्यात्मक और अनिवार्य प्रोग्रामिंग की चिंताओं से संबंधित करता है


10
धन्यवाद, लेकिन मैं यह नहीं मानता कि समानता की एक 'स्पष्ट' अपरिमित धारणा है। जब मैंने कहा कि "स्कॉटलैंड की राजधानी" एडिनबर्ग शहर को संदर्भित करता है, तो आपने इसके बारे में दो बार नहीं सोचा। लेकिन जब मैंने "1999 से" के बारे में बात करना शुरू किया, तो आपको अचानक पता चल गया कि समय शामिल है। तो, समानता की विलक्षण धारणा काफी सूक्ष्म हो सकती है और इसे प्रोग्रामिंग भाषा शोधकर्ताओं द्वारा औपचारिक रूप दिया जाता है। ऐसे लोग जो उस समानता के आदर्श की सही समझ चाहते हैं, उन्हें उस शोध के फल को सीखने की जरूरत है। यह 'स्पष्ट' नहीं हो सकता है।
उदय रेड्डी

5
बहुत खुबस! आरटी के बारे में लोकप्रिय भ्रांतियों में एक स्वागत योग्य राहत है, उदाहरण के लिए, इसे कार्यों से बांधना । या अभिव्यक्ति को अपने मूल्य के साथ परिभाषित करने के माध्यम से परिभाषित करना (जैसे विकिपीडिया पर) - अजीब तरह से इसलिए कि भाव और मूल्य विभिन्न प्रकार की चीजें हैं। शायद एक जगह जहां लोग अनिवार्य भाषाओं के आरटी-नेस पर विचार करने में गलत हो जाते हैं, यह मान लेना है कि ये "मूल्य" एक स्टोर से कार्यों की तरह अधिक जटिल चीजों के बजाय संख्या जैसी सरल चीजें हैं।
कोनल जूल

13
@sclv कंप्यूटर विज्ञान पर विश्लेषणात्मक दर्शन के व्यापक प्रभाव के लिए, मुझे कहना चाहिए कि कंप्यूटर विज्ञान, जैसा कि हम जानते हैं, इसकी स्थापना गोडेल, चर्च, क्लेन और ट्यूरिंग द्वारा की गई थी। ये लोग तर्कवादी थे और वे तर्क के गणितीय और दार्शनिक दोनों पहलुओं में विशेष रूप से पारंगत थे, विशेष रूप से पीनो, फ्रीज, रसेल, व्हाइटहेड, कार्नाप और क्वीन की परंपराएं। आधुनिक कंप्यूटर विज्ञान के शुरुआती अग्रदूतों को कनेक्शन पता था। लेकिन कंप्यूटर विज्ञान के तेजी से विकास ने उन्हें विचलित कर दिया है। हमें उन्हें वापस लाने की जरूरत है।
उदय रेड्डी

5
@ एसएलवी लॉजिक पारंपरिक रूप से परिणाम के विज्ञान के रूप में माना जाता है । लेकिन मुझे लगता है कि यह एक व्यापक है। यह सूचना का विज्ञान है । काफी, मैं पहले वाले को देखता हूं जिसने व्यापक दृष्टिकोण को सामने लाया। "शब्द और वस्तु" प्राकृतिक भाषा के बयानों की सूचना सामग्री का विश्लेषण है। हालांकि, न तो दार्शनिकों और न ही गणितज्ञों ने कभी संगणनाओं में सक्रिय रुचि ली है , जो काफी हैरान करने वाला है, यह देखते हुए कि प्राचीन काल से सभ्यता और विज्ञान के लिए केंद्रीय गणना कैसे रही है। हमें उन्हें दिलचस्पी लेने के तरीके खोजने की जरूरत है।
उदय रेड्डी

3
@ कॉनल: मैंने एक नया उत्तर जोड़ा है जो आपकी बात को बढ़ाता है। यह शायद पृष्ठ के नीचे होगा।
उदय रेड्डी

134

रेफ़रेंशियल ट्रांसपेरेंसी, आमतौर पर फ़ंक्शनल प्रोग्रामिंग में इस्तेमाल किया जाने वाला शब्द है, जिसका अर्थ है कि एक फंक्शन और एक इनपुट वैल्यू दिया जाता है, आपको हमेशा एक ही आउटपुट प्राप्त होगा। कहने का मतलब यह है कि फंक्शन में किसी बाहरी राज्य का इस्तेमाल नहीं किया जाता है।

यहाँ एक संदर्भित पारदर्शी समारोह का एक उदाहरण है:

int plusOne(int x)
{
  return x+1;
}

एक संदर्भात्मक पारदर्शी फ़ंक्शन के साथ, एक इनपुट और एक फ़ंक्शन को देखते हुए, आप फ़ंक्शन को कॉल करने के बजाय इसे एक मूल्य के साथ बदल सकते हैं। इसलिए 5 के एक पैरामीटर के साथ plusOne को कॉल करने के बजाय, हम इसे 6 के साथ बदल सकते हैं।

एक और अच्छा उदाहरण सामान्य रूप से गणित है। गणित में एक फ़ंक्शन और एक इनपुट मूल्य दिया गया है, यह हमेशा एक ही आउटपुट मूल्य पर मैप करेगा। f (x) = x + 1. इसलिए गणित में कार्य संदर्भित रूप से पारदर्शी होते हैं।

यह अवधारणा शोधकर्ताओं के लिए महत्वपूर्ण है क्योंकि इसका मतलब है कि जब आपके पास एक संदर्भित पारदर्शी फ़ंक्शन होता है, तो यह आसान स्वचालित समानांतरकरण और कैशिंग के लिए उधार देता है।

हस्केल जैसी कार्यात्मक भाषाओं में हमेशा प्रासंगिक पारदर्शिता का उपयोग किया जाता है।

-

इसके विपरीत संदर्भात्मक अपारदर्शिता की अवधारणा है। इसका अर्थ है विपरीत। फ़ंक्शन को कॉल करना हमेशा एक ही आउटपुट का उत्पादन नहीं कर सकता है।

//global G
int G = 10;

int plusG(int x)
{//G can be modified externally returning different values.
  return x + G;
}

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

फिर भी एक अन्य उदाहरण एक फ़ंक्शन है जो पाठ फ़ाइल से पढ़ता है और आउटपुट प्रिंट करता है। यह बाहरी पाठ फ़ाइल किसी भी समय बदल सकती है, इसलिए फ़ंक्शन संदर्भित रूप से अपारदर्शी होगा।


1
बस एक सिर ऊपर है, यह संभव है कि पूरी तरह से संदर्भित पारदर्शी वस्तु हो, रेफरल रूप से पारदर्शी सदस्य कार्यों के साथ। देखें okmij.org/ftp/Scheme/oop-in-fp.txt
जोनाथन

1
और यहाँ वह कोड है जिसके बारे में उस लेख में बात की जा रही है: okmij.org/ftp/Scheme/pure-oo-system.scm
जोनाथन

पूरी तरह से संदर्भित पारदर्शी वर्ग के मामले में, आपके पास शायद सभी सदस्य कार्य स्थिर होंगे।
ब्रायन आर। बॉडी

13
आप यहां जिस बारे में बात कर रहे हैं वह संदर्भात्मक पारदर्शिता नहीं है, हालांकि इसे आमतौर पर इस तरह से संदर्भित किया जाता है। देखिए उदय के दो जवाब और उन पर आए कमेंट। विशेष रूप से, जिसे आप "आउटपुट" कहते हैं, वह नोट नहीं है। यदि आपने "plusG 3" को किसी अन्य मूल्य के साथ समान मान / डिनोटेशन के साथ प्रतिस्थापित किया है, तो आपको वास्तव में उसी अर्थ के साथ एक प्रोग्राम मिलेगा, इसलिए RT अपूर्ण भाषाओं में पकड़ रखता है। अभिव्यक्ति "3 + 10" या "13" का "प्लसजी 3" के समान अर्थ नहीं है, क्योंकि अनिवार्यता वाली भाषाओं में अर्थ "स्टोर" (राज्य) का एक फ़ंक्शन है।
कोनल

1
मैं सिर्फ साइड इफेक्ट्स और राज्य के परिवर्तन पर एक लेख पढ़ता हूं और मुझे एक अंतर्ज्ञान मिला है कि इसका आरटी के साथ कुछ करना है। क्या आप कृपया इस पर एक नोट जोड़ सकते हैं?
गौरव

91

एक संदर्भित पारदर्शी फ़ंक्शन वह है जो केवल उसके इनपुट पर निर्भर करता है।


4
यही कारण है कि यह ओओ प्रोग्रामिंग में कठिन है क्योंकि वस्तुओं में स्थिति है।
क्रिश

5
तो क्या "वर्णनात्मक रूप से पारदर्शी" यह कहना सही है कि फ़ंक्शन का वर्णन करते समय "नियतात्मक" के समान है? यदि नहीं, तो दोनों शब्दों में क्या अंतर है?
mwolfe02

1
यह भी एक "शुद्ध" फ़ंक्शन की परिभाषा की तरह लगता है।
एवगेनी ए।

75

[यह कार्यात्मक / अनिवार्य प्रोग्रामिंग की चिंताओं के करीब चर्चा को लाने के प्रयास में, 25 मार्च से मेरे उत्तर की एक पोस्टस्क्रिप्ट है।]

संदर्भात्मक पारदर्शिता के कार्यात्मक प्रोग्रामर का विचार तीन तरीकों से मानक धारणा से भिन्न प्रतीत होता है:

  • जबकि दार्शनिक / तर्कशास्त्री "संदर्भ", " डिनोटेशन ", " डिज़ाइनटम " और " बेडियटुंग " ( फ्रीज जर्मन शब्द) जैसे शब्दों का उपयोग करते हैं , कार्यात्मक प्रोग्रामर "मूल्य" शब्द का उपयोग करते हैं। (यह पूरी तरह से उनका काम नहीं है। मेरा ध्यान है कि लैंडिन, स्ट्रैची और उनके वंशजों ने भी संदर्भ / मूल्य के बारे में बात करने के लिए "मूल्य" शब्द का इस्तेमाल किया। यह सिर्फ एक शब्दावली का सरलीकरण हो सकता है जिसे लैंडिन और स्ट्रेची ने पेश किया था, लेकिन यह एक ऐसा लगता है। भोली तरीके से इस्तेमाल किए जाने पर बड़ा अंतर।)

  • कार्यात्मक प्रोग्रामर यह मानते हैं कि ये "मूल्य" प्रोग्रामिंग भाषा के भीतर मौजूद हैं, न कि बाहर। ऐसा करने में, वे दार्शनिक और प्रोग्रामिंग भाषा के अर्थशास्त्री दोनों से अलग हैं।

  • वे मानते हैं कि इन "मूल्यों" को मूल्यांकन द्वारा प्राप्त किया जाना चाहिए।

उदाहरण के लिए, संदर्भात्मक पारदर्शिता पर विकिपीडिया लेख कहता है, आज सुबह:

एक अभिव्यक्ति को संदर्भात्मक रूप से पारदर्शी कहा जाता है यदि इसे प्रोग्राम के व्यवहार को बदलने के बिना इसके मूल्य के साथ बदला जा सकता है (दूसरे शब्दों में, एक प्रोग्राम जो उसी इनपुट पर समान प्रभाव और आउटपुट देता है)।

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

कोई यह मान सकता है कि प्रोग्रामिंग भाषा के अर्थशास्त्री उन्हें गुमराह कर सकते हैं। लेकिन, उन्होंने ऐसा नहीं किया।

लैंडिन :

(ए) प्रत्येक अभिव्यक्ति में एक घोंसले का शिकार उपप्रकार संरचना है, (बी) प्रत्येक उपप्रकारक कुछ को दर्शाता है (आमतौर पर एक संख्या, सत्य मूल्य या संख्यात्मक कार्य) , (ग) जिस चीज को एक अभिव्यक्ति निरूपित करता है, अर्थात, इसका "मूल्य", केवल पर निर्भर करता है इसके उप-भावों के मूल्य, उनमें से अन्य गुणों पर नहीं। [जोड़ा गया जोर]

Stoy :

केवल एक चीज जो एक अभिव्यक्ति के बारे में मायने रखती है, वह है इसका मूल्य, और किसी भी उपसंचाई को मूल्य [जोड़ा गया जोर] में किसी अन्य के बराबर बदला जा सकता है । इसके अलावा, एक अभिव्यक्ति का मूल्य कुछ सीमाओं के भीतर होता है, जब भी ऐसा होता है "।

पक्षी और वाडलर :

एक अभिव्यक्ति का मूल्य केवल उसके घटक अभिव्यक्तियों (यदि कोई हो) के मूल्यों पर निर्भर करता है और इन उप-संदर्भों को समान मूल्य [जोड़ा गया जोर] वाले अन्य लोगों द्वारा स्वतंत्र रूप से प्रतिस्थापित किया जा सकता है ।

इसलिए, पूर्वव्यापीकरण में, "संदर्भ" / "मूल्य" के साथ "मूल्य" के स्थान पर शब्दावली को सरल बनाने के लिए लैंडिन और स्ट्रैची के प्रयासों को चोट पहुंचाई गई हो सकती है। जैसे ही कोई "मूल्य" सुनता है, एक मूल्यांकन प्रक्रिया के बारे में सोचने का प्रलोभन होता है जो इसे आगे बढ़ाता है। मूल्यांकन के "मूल्य" के रूप में जो कुछ भी उत्पन्न होता है, यह सोचना भी उतना ही लुभावना है, हालांकि यह काफी स्पष्ट हो सकता है कि यह नकार नहीं है। यही मैं इकट्ठा करता हूं कि कार्यात्मक प्रोग्रामर की नजर में "रेफरेंशियल ट्रांसपेरेंसी" की अवधारणा को हुआ है। लेकिन प्रारंभिक अर्थवादियों द्वारा जिस "मूल्य" की बात की जा रही थी, वह किसी मूल्यांकन या किसी फ़ंक्शन या ऐसी किसी चीज़ के आउटपुट का परिणाम नहीं है। यह शब्द का अर्थ है।

एक बार जब हम एक जटिल गणितीय / वैचारिक वस्तु के रूप में एक अभिव्यक्ति ("संदर्भ" या शास्त्रीय दार्शनिकों के प्रवचन में "मूल्य") के तथाकथित "मूल्य" को समझते हैं, तो सभी प्रकार की संभावनाएं खुल जाती हैं।

  • स्ट्रेची ने अनिवार्य प्रोग्रामिंग भाषाओं में चर को L-मान के रूप में व्याख्या किया, जैसा कि मेरे 25 मार्च के उत्तर में बताया गया है, जो एक परिष्कृत वैचारिक वस्तु है जिसका प्रोग्रामिंग भाषा के सिंटैक्स के भीतर प्रत्यक्ष प्रतिनिधित्व नहीं है।
  • उन्होंने राज्य-से-राज्य कार्यों के रूप में ऐसी भाषाओं में आदेशों की व्याख्या की, एक जटिल गणितीय वस्तु का एक और उदाहरण जो वाक्य रचना के भीतर "मूल्य" नहीं है।
  • यहां तक ​​कि सी में एक साइड-इफ़ेक्टिंग फ़ंक्शन कॉल में राज्य ट्रांसफार्मर के रूप में एक अच्छी तरह से परिभाषित "मूल्य" है जो राज्यों और मूल्यों के जोड़े के लिए मैप करता है (कार्यात्मक प्रोग्रामर की शब्दावली में तथाकथित "मोनड")।

कार्यात्मक प्रोग्रामर्स की अनिच्छा ऐसी भाषाओं को "संदर्भात्मक रूप से पारदर्शी" कहने का तात्पर्य केवल यह है कि वे ऐसे जटिल गणितीय / वैचारिक वस्तुओं को "मूल्यों" के रूप में स्वीकार करने के लिए अनिच्छुक हैं। दूसरी ओर, वे एक राज्य ट्रांसफार्मर को "मान" कहने के लिए पूरी तरह से तैयार दिखते हैं, जब इसे अपने पसंदीदा सिंटैक्स में डाला जाता है और "मोनड" जैसे भद्दे शब्द के साथ तैयार किया जाता है। मेरा कहना है कि वे पूरी तरह से असंगत हो रहे हैं, भले ही हम उन्हें यह अनुदान दें कि उनके विचार से "संदर्भगत पारदर्शिता" में कुछ सामंजस्य है।

इन भ्रमों के अस्तित्व में आने पर थोड़ा इतिहास कुछ प्रकाश डाल सकता है। 1962 से 1967 के बीच की अवधि क्रिस्टोफर स्ट्रेची के लिए बहुत ही गहन थी। 1962-65 के बीच, उन्होंने मौरिस विल्क्स के साथ अनुसंधान सहायक के रूप में अंशकालिक नौकरी ली, जिसे सीपीएल के रूप में जाना जाने वाली प्रोग्रामिंग भाषा को डिजाइन और कार्यान्वित करने के लिए। यह एक अनिवार्य प्रोग्रामिंग भाषा थी लेकिन शक्तिशाली कार्यात्मक प्रोग्रामिंग भाषा क्षमताओं के रूप में अच्छी तरह से थी। लैंडिन, जो अपनी कंसल्टेंसी कंपनी में स्ट्रैची के कर्मचारी थे, ने प्रोग्रामिंग भाषाओं के स्ट्रैची के दृष्टिकोण पर बहुत प्रभाव डाला। लैंडमार्क 1965 के पेपर " नेक्स्ट 700 प्रोग्रामिंग लैंग्वेजेस " में, लैंडिन ने अनएब्सेम्डली फंक्शनल प्रोग्रामिंग लैंग्वेज को बढ़ावा दिया (उन्हें डिमोनेटिव कहते हुएभाषाएं) और अनिवार्य प्रोग्रामिंग भाषाओं को उनके "एंटीथिसिस" के रूप में वर्णित करती हैं। आगामी चर्चा में, हम स्ट्रेची को लैंडिन की मजबूत स्थिति पर संदेह उठाते हुए पाते हैं।

... डीएल सभी भाषाओं का एक सबसेट बनाते हैं। वे एक दिलचस्प उपसमुच्चय हैं, लेकिन एक का उपयोग करने के लिए असुविधाजनक है जब तक आप इसके लिए उपयोग नहीं किए जाते हैं। हमें इनकी आवश्यकता है क्योंकि इस समय हमें यह नहीं पता कि भाषाओं के साथ प्रमाणों का निर्माण कैसे किया जाए जिसमें अनिवार्यताएँ और छलांग शामिल हैं। [जोड़ा गया जोर]

1965 में, स्ट्रैची ने ऑक्सफोर्ड में एक पाठक का पद ग्रहण किया और लगता है कि अनिवार्य रूप से अनिवार्य रूप से अनिवार्य रूप से पूर्णकालिक और जंपर्स के सिद्धांत को विकसित करने पर काम किया है। 1967 तक, वह एक सिद्धांत के साथ तैयार थे, जो उन्होंने कोपेनहेगन ग्रीष्मकालीन स्कूल में " प्रोग्रामिंग भाषाओं में मौलिक अवधारणाओं " पर अपने पाठ्यक्रम में पढ़ाया था । व्याख्यान के नोट्स प्रकाशित होने चाहिए थे, लेकिन "दुर्भाग्य से, परिश्रम के संपादन के कारण, कार्यवाही कभी भी सफल नहीं हुई, जैसे ऑक्सफोर्ड में स्ट्रैची के बहुत से काम, हालांकि, कागज का एक प्रभावशाली निजी प्रचलन था।" ( मार्टिन कैंपबेल-केली )

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

  • खंड 3.2 में, वह "अभिव्यक्ति" से संबंधित है, जहां वह "आर-मूल्य संदर्भात्मक पारदर्शिता" के बारे में बात करता है।
  • उनका अनुभाग 3.3 "कमांड्स" से संबंधित है, जहां वह "एल-मूल्य संदर्भात्मक पारदर्शिता" के बारे में बात करता है।
  • धारा 3.4.5 में, वह "फ़ंक्शंस और रूटीन" के बारे में बात करता है और घोषणा करता है कि "आर-वैल्यू संदर्भ में आर-वैल्यू रिफ़रेंशियल ट्रांसपेरेंसी के किसी भी प्रस्थान को या तो एक्सप्रेशन को कई कमांड्स और सरल एक्सप्रेशंस में डिकम्पोज़ करके समाप्त किया जाना चाहिए, या, यदि यह मुश्किल हो जाता है, एक टिप्पणी का विषय। "

एल-मान, आर-मान और अन्य जटिल वस्तुओं के बीच अंतर को समझने के बिना "संदर्भात्मक पारदर्शिता" की कोई भी बात जो अनिवार्य प्रोग्रामर के वैचारिक ब्रह्मांड को पॉपुलेट करती है, मौलिक रूप से गलत है।


10
मुझे लगता है कि यह जोर देने लायक है कि "वैल्यू" (मूल्यांकन बनाम डिपोटेशन) की इन दो धारणाओं को भ्रमित करना कार्यात्मक प्रोग्रामर्स को उनकी अनिवार्य भाषाओं की आलोचना में गुमराह करता है , जहां धारणाओं के बीच का अंतर बड़ा है।
कोनल जूल

8
यानी, मूल्यांकन धारणा इस निष्कर्ष की ओर ले जाती है कि अत्यावश्यक भाषाएं आरटी नहीं हैं, जबकि नोटेशन धारणा नहीं है।
कॉनल

12
यह मुझे लगता है कि एक बार जब आप वास्तव में किसी भाषा के शब्दार्थ शब्द को पूरी तरह से समाप्त कर देते हैं, तो यह मदद नहीं कर सकता है, लेकिन संदर्भित रूप से पारदर्शी हो सकता है। इसलिए यह कहना कठिन है कि प्रोग्रामिंग भाषाओं के संबंध में यह शब्द उपयोगी नहीं है।
टॉम क्रॉकट

20
तो ऐसा लगता है कि जब लोग अतीत में उस शब्द का इस्तेमाल करते हैं तो अन्य लोगों की तुलना में भौतिक रूप से कुछ अलग करने के लिए शब्द का उपयोग करने की आदत होती है। जिस पर मैं कहता हूं: अंग्रेजी भाषा में आपका स्वागत है।
डैनियल प्रैट

17
@DanielPratt: यदि साइड-इफ़ेक्ट-फ्रीडम वह है जो कार्यात्मक प्रोग्रामर मतलब चाहते हैं, तो वे इसे "रेफ़रेंशियल ट्रांसपेरेंसी" क्यों कहते हैं? वे इसे केवल "साइड-इफेक्ट-फ्रीडम" कह सकते हैं, जो एक बिल्कुल स्पष्ट विचार है। किसी को भी स्टैकएक्सचेंज पर पूछने की आवश्यकता नहीं होगी कि "साइड-इफेक्ट-फ्रीडम" का क्या मतलब है। दादा-दादी की शास्त्रीय शब्दों को समझने की आवश्यकता कहां है जो किसी को समझ में नहीं आती है?
उदय रेड्डी

23

एक अभिव्यक्ति संदर्भित रूप से पारदर्शी है अगर इसे एल्गोरिथ्म को बदलने के बिना, एक एल्गोरिथ्म को उपजाने वाले एल्गोरिदम को बदलकर, उसी इनपुट पर समान प्रभाव और आउटपुट दिया जा सकता है।


18

एक संदर्भित पारदर्शी फ़ंक्शन वह है जो गणितीय फ़ंक्शन की तरह कार्य करता है; एक ही इनपुट दिया, यह हमेशा एक ही आउटपुट का उत्पादन करेगा। तात्पर्य यह है कि जो राज्य में पारित किया गया है वह संशोधित नहीं है, और यह कि फ़ंक्शन की अपनी कोई स्थिति नहीं है।


10

संक्षिप्त स्पष्टीकरण की आवश्यकता वाले लोगों के लिए मैं एक को खतरा होगा (लेकिन नीचे दिए गए प्रकटीकरण को पढ़ें)।

एक प्रोग्रामिंग लैंग्वेज में रेफ़रेंशियल ट्रांसपेरेंसी, इक्विशनल रीज़निंग को बढ़ावा देती है - जितना रेफ़रेंशियल ट्रांसपेरेंसी आपके पास है, उतना ही आसान है, इक्विशनल रीज़निंग करना। जैसे (छद्म) फ़ंक्शन परिभाषा के साथ,

fx = x + x,

इस परिभाषा के दायरे में आप आसानी (foo) को foo + foo से बदल सकते हैं, जिस पर आप इस कमी को पूरा नहीं कर सकते हैं, उस आसानी से आप कितनी आसानी से अपनी प्रोग्रामिंग भाषा को कितनी संदर्भात्मक पारदर्शिता का संकेत दे सकते हैं है।

उदाहरण के लिए यदि f प्रोग्रामिंग प्रोग्राम में C ++ में x ++ थे, तो आप इस कमी को सुरक्षित रूप से नहीं निभा सकते थे (जो कहना है, यदि आप इस कमी को पूरा करने के लिए थे, तो आप उसी प्रोग्राम के साथ समाप्त नहीं होंगे जो आपने शुरू किया था)।

व्यावहारिक प्रोग्रामिंग भाषाओं में आप सही संदर्भात्मक पारदर्शिता नहीं देखेंगे लेकिन कार्यात्मक प्रोग्रामर इसकी सबसे अधिक परवाह करते हैं (सीएफ हास्केल, जहां यह एक मुख्य उद्देश्य है)।

(पूर्ण प्रकटीकरण: मैं एक कार्यात्मक प्रोग्रामर हूं इसलिए शीर्ष उत्तर द्वारा आपको नमक के दाने के साथ यह स्पष्टीकरण लेना चाहिए।)


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

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

2
क्रिस: उदय ने बताया कि स्ट्रैची ने प्रोग्रामिंग भाषा के शब्दार्थों में विशेष रूप से अनिवार्य भाषाओं के लिए संदर्भात्मक अस्पष्टता की समस्या को समाप्त कर दिया । इसलिए कार्यात्मक प्रोग्रामर "अपने कार्यक्रमों में प्रासंगिक पारदर्शिता को डायल नहीं कर सकते हैं"। एक ठोस उदाहरण के रूप में, हास्केल आईओ आरटी के साथ बिल्कुल मदद नहीं करता है क्योंकि आरटी मदद की आवश्यकता नहीं है।
कॉनल

2
@chrisdornan: उपरोक्त मेरी पहली टिप्पणी के लिए क्षमा करें। मुझे स्वयं यह समझने में कठिनाई हुई कि मैं पहले दो वाक्यों में क्या कहना चाह रहा था :-( लेकिन, यहाँ एक स्पष्टीकरण है। दो-स्तरीय या बहु-स्तरीय मचान पथरी पर विचार करें। प्रत्येक मचान संचालक संदर्भात्मक रूप से अपारदर्शी है। यह वास्तव में है। , एक उद्धरण संचालक। हालाँकि, आप प्रत्येक चरण के भीतर समसामयिक तर्क कर सकते हैं। ठीक है, इसलिए, प्रत्येक संदर्भित रूप से अपारदर्शी संचालक समतुल्य तर्क के लिए सीमाएँ निर्धारित करता है। लेकिन आप अभी भी उन सीमाओं के भीतर समसामयिक तर्क दे रहे हैं।
यूडी रेड्डी

1
@chrisdomain: इसके अलावा, बहुत कम लोग इस तरह के मंचन संचालकों को निर्वासित करने के लिए संदर्भित पारदर्शिता-शुद्धतावादी बनना चाहेंगे। वे ऑपरेटर बेहद उपयोगी हैं। मैन्युअल रूप से मंचन करके उनके बिना प्रोग्रामिंग थकाऊ, त्रुटि-प्रवण और बदसूरत होगी। और, मैन्युअल रूप से मंचन करने से आपको पहले की तुलना में कोई और अधिक तर्कसंगत तर्क नहीं मिलेगा। तो, सम-सामयिक तर्क की शुद्धतावादी खोज में अच्छे प्रोग्रामिंग उपकरणों को प्रतिबंधित करना आपके चेहरे को दबाने के लिए अपनी नाक काटने के समान होगा।
उदय रेड्डी

8

यदि आप व्युत्पत्ति विज्ञान में रुचि रखते हैं (अर्थात इस अवधारणा का यह विशेष नाम क्यों है), इस विषय पर मेरे ब्लॉग पोस्ट पर एक नज़र डालें । शब्दावली दार्शनिक / तर्कशास्त्री क्वीन से आती है।


4
  1. नकारात्‍मक-शब्दार्थ, उन भाषाओं के निर्माण पर आधारित है, जो ऐसे डोमेन का निर्माण करती हैं, जो मूल्यहीन मान का निर्माण करते हैं ।
  2. कार्यात्मक प्रोग्रामर भाषा के पुनर्लेखन नियमों के आधार पर एक संगणना के अभिसरण का वर्णन करने के लिए शब्द मान का उपयोग करते हैं। इसके परिचालन शब्दार्थ।

1 में प्रश्न में दो भाषाओं की स्पष्टता है:

  • एक मॉडलिंग की जा रही है, वस्तु भाषा
  • मॉडलिंग की भाषा, मेटा भाषा

2 में, ऑब्जेक्ट और मेटलंगेज की निकटता के लिए धन्यवाद, उन्हें भ्रमित किया जा सकता है।

भाषा कार्यान्वयनकर्ता के रूप में, मुझे लगता है कि मुझे इस अंतर को लगातार याद रखने की आवश्यकता है।

तो प्रो। रेड्डी क्या मैं आपको इस तरह मना सकता हूं :-)

कार्यात्मक प्रोग्रामिंग और शब्दार्थ के संदर्भों में, रेफ़रेंशियल ट्रांसपेरेंसी शब्द प्रासंगिक रूप से पारदर्शी नहीं है।


1
हा हा! स्पष्टीकरण के लिए धन्यवाद। समस्या यह भी है कि कार्यात्मक प्रोग्रामर ऐसे कार्य करते हैं जैसे कि उनके पास "संदर्भात्मक पारदर्शिता" की सामान्य धारणा है जो सभी प्रोग्रामिंग भाषाओं पर लागू होती है । लेकिन यह उनके "मूल्य" की धारणा पर निर्भर है, जो अन्य भाषाओं के लिए समझ में नहीं आता है या नहीं हो सकता है। "संदर्भात्मक पारदर्शिता" के एक सामान्य सिद्धांत का दावा करने के लिए, उन्हें एक सामान्य सिद्धांत "मूल्य" का उत्पादन करने की आवश्यकता है। वह अब तक गायब है।
उदय रेड्डी

4

निम्नलिखित उत्तर मुझे आशा है कि विवादास्पद 1 और 3 उत्तर को जोड़ता है और योग्य है।

आइए हम बताएं कि कोई अभिव्यक्ति किसी संदर्भ को दर्शाता है या संदर्भित करता है। हालांकि, एक सवाल यह है कि क्या इन संदर्भों को अभिव्यक्तियों के हिस्से के रूप में समसामयिक रूप से इनकोड किया जा सकता है, ऐसे भावों को 'मूल्य' कहते हैं। उदाहरण के लिए, शाब्दिक संख्या मान अंकगणितीय अभिव्यक्तियों के समुच्चय का एक उपसमुच्चय है, सत्य मान बूलियन अभिव्यक्तियों के समुच्चय का एक उपसमुच्चय है, आदि। विचार एक अभिव्यक्ति का उसके मूल्य (यदि यह है) का मूल्यांकन करने के लिए है। इसलिए 'मूल्य' शब्द, एक भाव या संदर्भ के सेट के एक विशिष्ट तत्व को संदर्भित कर सकता है। लेकिन यदि संदर्भ और मूल्य के बीच एक समरूपता (एक आक्षेप) है तो हम कह सकते हैं कि वे एक ही चीज हैं। (यह कहा गया है, एक व्यक्ति को संदर्भों और समरूपता को परिभाषित करने के लिए सावधान रहना चाहिए, जैसा कि प्रतीयमान अर्थविज्ञान के क्षेत्र द्वारा सिद्ध किया गया है। 3 उत्तर के उत्तर द्वारा उल्लिखित उदाहरण को रखने के लिए,data Nat = Zero | Suc Nat प्राकृतिक संख्याओं के सेट के अनुरूप नहीं है।)

E[·]एक छिद्र के साथ एक अभिव्यक्ति के लिए लिखते हैं , जिसे कुछ तिमाहियों में 'संदर्भ' के रूप में भी जाना जाता है। C- जैसी अभिव्यक्तियों के लिए दो संदर्भ उदाहरण हैं [·]+1और [·]++

आइए हम [[·]]उस फ़ंक्शन के लिए लिखते हैं जो एक अभिव्यक्ति लेता है (कोई छेद नहीं) और कुछ अर्थ प्रदान करने वाले ब्रह्मांड में इसके अर्थ (संदर्भ, मूल्य, आदि) को वितरित करता है। (मैं अर्थशास्त्री शब्दार्थ के क्षेत्र से संकेतन उधार ले रहा हूं)

आइए क्विन की परिभाषा को कुछ हद तक औपचारिक रूप से रूपांतरित करें: एक संदर्भ संदर्भगत रूप E[·] से पारदर्शी है यदि किसी भी दो भाव दिए गए हैं E1और E2(कोई छेद नहीं है) ऐसे [[E1]] = [[E2]]( जैसे कि भाव उसी संदर्भ को दर्शाता / संदर्भित करता है) तो यह मामला है [[E[E1]]] = [[E[E2]]](यानी भरना ( E1या तो छेद के साथ या E2अभिव्यक्ति में परिणाम है कि एक ही संदर्भ निरूपित भी)।

बराबरी के लिए बराबर प्रतिस्थापन की लीबनीज के नियम आम तौर पर 'अगर के रूप में व्यक्त किया जाता है E1 = E2तो E[E1] = E[E2]' है, जो कहता है कि E[·]एक समारोह है। एक फ़ंक्शन (या उस मामले के लिए एक प्रोग्राम जो फ़ंक्शन को कंप्यूटिंग करता है) एक स्रोत से लक्ष्य तक मैपिंग है ताकि प्रत्येक स्रोत तत्व के लिए अधिकतम एक लक्ष्य तत्व हो। गैर-नियतात्मक कार्य गलत हैं, वे या तो संबंध हैं, सेट देने वाले कार्य हैं, आदि यदि लिबनीज के नियम में समानता =निरंकुश है, तो डबल-ब्रैकेट बस के लिए दिए जाते हैं और समाप्त हो जाते हैं। तो एक संदर्भित पारदर्शी संदर्भ एक कार्य है। और लीबनीज का नियम समतुल्य तर्क का मुख्य घटक है, इसलिए समतुल्य तर्क निश्चित रूप से संदर्भित पारदर्शिता से संबंधित है।

हालाँकि [[·]]यह अभिव्यक्ति से लेकर निरूपण तक का एक कार्य है, लेकिन यह भावों से एक फ़ंक्शन हो सकता है जिसे 'भाव' भावों के सीमित उपसमूह के रूप में समझा जाता है, और [[·]]इसे मूल्यांकन के रूप में समझा जा सकता है।

अब, अगर E1एक अभिव्यक्ति है और E2एक ऐसा मूल्य है जो हमारे पास है, जो मुझे लगता है कि ज्यादातर लोग अभिव्यक्ति, मूल्यों और मूल्यांकन के संदर्भ में प्रासंगिक पारदर्शिता को परिभाषित करते समय करते हैं। लेकिन जैसा कि इस पृष्ठ में 1 और 3 के उत्तर से स्पष्ट है, यह एक गलत परिभाषा है।

जैसे संदर्भों के साथ समस्या [·]++साइड इफेक्ट नहीं है, लेकिन यह है कि इसके मूल्य को C isomorphically इसके अर्थ में परिभाषित नहीं किया गया है। फ़ंक्शंस मान नहीं हैं (ठीक है, कार्यों के लिए संकेत हैं) जबकि कार्यात्मक प्रोग्रामिंग भाषाओं में वे हैं। लैंडिन, स्ट्रैची, और अर्थ प्रदान करने के लिए कार्यात्मक दुनिया का उपयोग करने में निंदात्मक शब्दार्थ के अग्रणी काफी चतुर थे।

अनिवार्य सी जैसी भाषाओं के लिए हम (मोटे तौर पर) फ़ंक्शन का उपयोग करके अभिव्यक्तियों को शब्दार्थ प्रदान कर सकते हैं [[·]] : Expression -> (State -> State x Value)

Valueका सबसेट है ExpressionStateइसमें जोड़े (पहचानकर्ता, मूल्य) शामिल हैं। सिमेंटिक फ़ंक्शन एक अभिव्यक्ति लेता है और इसके अर्थ के रूप में वर्तमान स्थिति से जोड़े को अद्यतन स्थिति और मूल्य के साथ एक फ़ंक्शन देता है। उदाहरण के लिए, [[x]]वर्तमान स्थिति से उस जोड़ी का कार्य है जिसका पहला घटक वर्तमान स्थिति है और जिसका दूसरा घटक x का मान है। इसके विपरीत, [[x++]]वर्तमान स्थिति से उस जोड़ी का कार्य है जिसका पहला घटक एक ऐसा राज्य है जिसमें x का मान बढ़ा हुआ है, और जिसका दूसरा घटक वह मूल्य है। इस अर्थ में, संदर्भ [·]++संदर्भात्मक रूप से पारदर्शी है यदि यह ऊपर दी गई परिभाषा को संतुष्ट करता है।

मुझे लगता है कि कार्यात्मक प्रोग्रामर इस संदर्भ में प्रासंगिक पारदर्शिता का उपयोग करने के हकदार हैं कि वे स्वाभाविक [[·]]रूप से अभिव्यक्ति से मूल्यों तक एक फ़ंक्शन के रूप में पुनर्प्राप्त करते हैं। कार्य प्रथम श्रेणी के मूल्य हैं और राज्य एक मूल्य हो सकता है, न कि एक मूल्य। राज्य मोनाड (भाग में) राज्य को पारित करने (या फैलाने) के लिए एक साफ तंत्र है।


संभवतः "1st" और "3rd" उत्तर क्रमशः UdayReddy के "25 मार्च" और "पोस्टस्क्रिप्ट" उत्तर हैं। एसओ में जवाबों को संदर्भित करने के लिए अध्यादेश एक अच्छा तरीका नहीं है। न केवल वोट और स्वीकार्यता समय के साथ बदलते हैं, बल्कि कई चयन आदेश भी होते हैं।
फिलिपिंस

2

ध्यान दें कि "अर्थ" की यह अवधारणा कुछ है जो पर्यवेक्षक के दिमाग में होती है। इस प्रकार, एक ही "संदर्भ" का अर्थ अलग-अलग लोगों के लिए अलग-अलग हो सकता है। इसलिए, उदाहरण के लिए, हमारे पास विकिपीडिया में एक एडिनबर्ग वितरण पृष्ठ है।

एक संबंधित समस्या जो प्रोग्रामिंग के संदर्भ में दिखाई दे सकती है वह बहुरूपता हो सकती है।

और शायद हमारे पास बहुरूपता के विशेष मामले के लिए एक नाम होना चाहिए (या शायद कास्टिंग भी) जहां हमारे उद्देश्यों के लिए अलग-अलग बहुरूपी मामले शब्दार्थ के समान हैं (जैसा कि सिर्फ समान होने के विपरीत है। उदाहरण के लिए, संख्या 1 - का प्रतिनिधित्व किया जा सकता है। पूर्णांक प्रकार, या एक जटिल प्रकार या विभिन्न प्रकार के किसी भी प्रकार का उपयोग करके - बहुरूपता का इलाज किया जा सकता है)।


0

मुझे " स्ट्रक्चर एंड इम्प्लीमेंटेशन ऑफ कंप्यूटर प्रोग्राम्स " (विजार्ड बुक) उपयोगी पुस्तक में रेफरेन्शियल ट्रांसपेरेंसी की परिभाषा मिली क्योंकि यह असाइनमेंट ऑपरेशन की शुरुआत करते हुए कैसे रेफरेंशियल ट्रांसपेरेंसी का उल्लंघन किया जाता है, इसकी व्याख्या द्वारा पूरक है । निम्नलिखित स्लाइड डेक की जाँच करें मैं विषय के बारे में किए गए: https://www.slideshare.net/pjschwarz/introducing-assignment-invalidates-the-substitution-model-of-evaluation-and-violates-referential-transparency-as- समझाया-इन-sicp-जादूगर पुस्तक


0

प्रासंगिक पारदर्शिता को केवल इस प्रकार कहा जा सकता है:

  • एक अभिव्यक्ति हमेशा किसी भी संदर्भ में एक ही परिणाम का मूल्यांकन करती है [1] ,
  • एक समारोह है, अगर दो बार एक ही मानकों को देखते हुए, एक ही परिणाम दो बार का उत्पादन होगा [2]

उदाहरण के लिए, प्रोग्रामिंग भाषा हास्केल एक शुद्ध कार्यात्मक भाषा है; इसका अर्थ है कि यह संदर्भित रूप से पारदर्शी है।

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