शब्दार्थ में कैसे दुष्प्रभाव होते हैं?


19

शब्दार्थ पर एंथोनी ऐबी के "प्रोग्रामिंग भाषाओं का परिचय" खंड में , वह निम्नलिखित अवलोकन करते हैं:

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

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

एक प्रोग्रामिंग भाषा में साइड इफेक्ट्स का अस्तित्व एक प्रोग्राम को एक कम्प्यूटेशनल मॉडल में मैप करने की क्षमता को कैसे प्रभावित करता है? क्या प्रबंध राज्य के दृष्टिकोण हैं जो साइड इफेक्ट की अनुमति देते हुए इस प्रक्रिया में सुधार कर सकते हैं?


क्या इसे एक नरम-प्रश्न के रूप में टैग किया जाना चाहिए? चूंकि "शब्दार्थ में बहुत काम [...] [साइड-इफेक्ट्स] से प्रेरित है," निश्चित रूप से आप एक छोटे और कठोर उत्तर की उम्मीद नहीं कर सकते।
रादु GRIGore

1
@Radu: एमओ पर, यह संभवतः [बड़ी-तस्वीर] टैग किया जाएगा, जो ज्यादातर [सॉफ्ट-प्रश्न] या सीडब्ल्यू नहीं हैं।
चार्ल्स स्टीवर्ट

टैग बिग-पिक्चर और भी बेहतर है। मैं इसके विषय मे भूल गया।
राडू GRIGore

अच्छा सुझाव; मैंने टैग जोड़ा।
शेन

जवाबों:


18

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

Object x = new Object();
Object y = new Object();
... some more code ...

तो यह प्रोग्राम एक ऑब्जेक्ट बनाता है और इसे x नाम देता है, और फिर y नाम का दूसरा ऑब्जेक्ट बनाता है, और फिर कुछ और कोड निष्पादित करता रहता है। अब, मान लीजिए कि एक प्रोग्रामर इन दो वस्तुओं के आवंटन के आदेश को पलटने का फैसला करता है:

Object y = new Object();
Object x = new Object();
... some more code ...

अब, सवाल पूछें: क्या यह रिफैक्टिंग प्रोग्राम के व्यवहार को बदल देता है? एक ओर, अंतर्निहित मशीन पर, कार्यक्रम के दो रनों में x और y को विभिन्न स्थानों पर आवंटित किया जाएगा। तो इस अर्थ में, कार्यक्रम अलग तरह से व्यवहार करता है।

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

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

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

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


"दो प्रोग्राम तब बराबर होते हैं जब कोई भी क्लाइंट प्रोग्राम इनपुट के रूप में उन प्रोग्रामों को प्राप्त करने के आधार पर अलग-अलग उत्तरों की गणना नहीं कर सकता है।" मैं इससे भ्रमित हूं। यदि आपके पास एक प्रोग्राम एक्स और एक क्लाइंट प्रोग्राम वाई है, तो मैं इसका मतलब यह लेता हूं कि वाई 'एक्स में कॉल करता है। लेकिन फिर आप कहते हैं कि वाई एक्स के पाठ को इनपुट के रूप में पढ़ता है , जिस स्थिति में मैं शायद ही कॉल करूंगा। Y, X का 'ग्राहक' है। क्या आप कृपया स्पष्ट कर सकते हैं?
राडु GRIGore

1
"एक्स के ग्राहक" द्वारा, मेरा मतलब "प्रोग्राम संदर्भ" के समान है, जो कि सिर्फ एक "बड़ा प्रोग्राम है जिसमें एक्स के रूप में एक सबटर्म है"।
नील कृष्णस्वामी

तो आप 'X' Y का एक ग्राहक है, जो 'एक्स रीड्स वाई विद इनपुट' है, क्योंकि आप एक्स को एक लैम्ब्डा के रूप में वाई पर लगाते हैं? यह समझ में आता है, लेकिन जब आप जावा के बारे में बात करते हैं तो यह थोड़ा मुड़ जाता है। :)
राडु GRIGore

1
@RaduGRIGore: कार्यक्रम संदर्भ का अर्थ कुछ और है। आप पोस्ट को सही ढंग से पढ़ रहे हैं, लेकिन अगर X इनपुट के रूप में Y के स्रोत कोड को पढ़ता है (जो कि मैं पोस्ट की व्याख्या कैसे करता हूं), तो आप हर दो वाक्यात्मक रूप से अलग-अलग कार्यक्रमों को अलग कर सकते हैं; इसके बजाय यदि Y X पर लंबोदर फ़ंक्शन है, तो आप बहुत कम प्रोग्रामों को अलग कर सकते हैं। "प्रोग्राम संदर्भ" के बारे में नील की टिप्पणी सही परिभाषा है: एक प्रोग्राम संदर्भ वाई इसके एएसटी के छेद वाला एक प्रोग्राम है, जहां आप दो अलग-अलग प्रोग्राम टुकड़े X1 और X2 रख सकते हैं।
ब्लिसोरब्लेड

@ नीलकृष्णस्वामी: क्या आप स्पष्ट कर सकते हैं कि आपके पोस्ट में क्या अर्थ है? आप बस अपने उदाहरण का उपयोग करना जारी रख सकते हैं और एक कार्यक्रम के बारे में बात कर सकते हैं जहां आप एक या दूसरे टुकड़े को सम्मिलित कर सकते हैं।
१०:३०

12

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

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


1
हां, फ़ाइटर श्रेणी के शब्दार्थ सभी मेयर-सीबर समकक्षों को मान्य नहीं करते थे। पीटर ओ'हर्न और रॉबर्ट टेनेन्ट ने 90 के दशक के मध्य में फ़ंक्टर-श्रेणी के शब्दार्थ का एक पैरामीट्रिक संस्करण विकसित किया था, जो (IIRC) मेयर-सीबर उदाहरणों में से सभी को मिला, लेकिन मुझे नहीं पता कि यह पूरी तरह से अमूर्त था या नहीं।
नील कृष्णस्वामी

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

12

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

CESK मशीन के परिणामस्वरूप काम की एक लाइन, एक सरल सार मशीन फ्रेमवर्क है जो कंसेंटली मॉडलिंग फंक्शनल, ऑब्जेक्ट-ओरिएंटेड, इम्पावरमेंट और यहां तक ​​कि लॉजिक लैंग्वेजेज में सक्षम है। CESK फ्रेमवर्क न केवल साइड इफेक्ट्स को संभालता है, बल्कि अपवादों, निरंतरताओं, आलस्य और यहां तक ​​कि थ्रेड्स जैसे "जटिल" नियंत्रण निर्माणों को भी नियंत्रित करता है।

CESK मशीन, और छोटे चरण के परिचालन शब्दार्थ अधिक मोटे तौर पर, दो दशकों के लिए प्रोग्रामिंग भाषा सिद्धांत में वास्तविक मानक हैं।

संक्षेप में, CESK मशीन हर मशीन की स्थिति का वर्णन करने के लिए चार घटकों के साथ एक छोटी सी चरण मशीन है: नियंत्रण स्ट्रिंग (प्रोग्राम काउंटर का एक सामान्यीकरण), पर्यावरण, एक स्टोर (ढेर भी कहा जाता है) और वर्तमान निरंतरता।

पर्यावरण पतों को चर दिखाता है; स्टोर मैप्स मानों को संबोधित करता है।

यह परिवर्तनशील चर को सीधा करने के लिए इसे सरल बनाता है: बस इसके पते पर मूल्य बदलें।

यह पॉइंटर्स और डायनेमिक एलोकेशन को मॉडल करना भी आसान बनाता है: बस स्टोर एड्रेस को प्रथम श्रेणी मान बनाते हैं।

इसी तरह से, प्रथम श्रेणी की निरंतरता के परिणामस्वरूप उन्हें पता करने योग्य मान मिलता है।


6

एक प्रोग्रामिंग भाषा में साइड इफेक्ट्स का अस्तित्व एक प्रोग्राम को एक कम्प्यूटेशनल मॉडल में मैप करने की क्षमता को कैसे प्रभावित करता है?

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

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

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

क्या प्रबंध राज्य के दृष्टिकोण हैं जो साइड इफेक्ट की अनुमति देते हुए इस प्रक्रिया में सुधार कर सकते हैं?

कुछ हद तक, शब्दार्थ प्रदान करने में कठिनाइयाँ शक्तिशाली प्रोग्रामिंग भाषाओं को प्रदान करने की कठिनाई के अनुरूप होती हैं, जो उस तरह से व्यवहार करती हैं, जिसकी वे अपेक्षा करते हैं। व्यावहारिक रूप से प्रेरित डिजाइन निर्णय - क्योंकि संगणक के साथ वैश्विक स्थिति के उपयोग को टालना, आमतौर पर संदेश-गुजरता संगति के माध्यम से- शब्दार्थ प्रदान करना आसान बनाते हैं।


स्कॉट के PCF के पास राज्य नहीं है और न ही यह स्कॉट का है, यह है? देखें en.wikipedia.org/wiki/…
बाउर

@Andrej: एर, काफी, यह देखते हुए कि ल्यूक ओन्ग ने मेरे डी.फिल की देखरेख की, मुझे वह गलती नहीं करनी चाहिए। मैंने मिलनर के पीसीएफ और स्कॉट के एलसीएफ के एक टीज़र-सारांश को पोस्ट किया है जो कि अधिक है ... WP की तुलना में एक LtU कहानी के रूप में है: lambda-the-ultimate.org/node/2196 यह मेरे लिए होता है कि आपके पास लापता स्कॉट तक पहुंच हो सकती है (1969) पांडुलिपि ...
चार्ल्स स्टीवर्ट

यह प्लॉटकिन का पीसीएफ होगा, मुझे लगता है कि :-) मैं पांडुलिपि को पकड़ने की कोशिश कर सकता हूं, लेकिन मेरे पास वास्तव में ऐसा नहीं है।
बाउर

लेकिन बात यह है कि पीसीएफ में राज्य नहीं है। क्या आप "कारण" कह रहे हैं कि स्ट्रेची परिचालन शब्दार्थ की निंदा करने के लिए? यह मेरे लिए स्पष्ट नहीं था। पिछले पैराग्राफ विरोधाभासों जो आपने पहले कहा था, अर्थात, संरक्षित कमांड में अच्छे शब्दार्थ हैं, लेकिन पीसीएफ नहीं है!
उदय रेड्डी

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