क्या वास्तव में "के रूप में अगर" नियम है?


89

जैसा कि शीर्षक कहता है,

वास्तव में "जैसा-अगर" नियम क्या है?

एक विशिष्ट उत्तर मिलेगा:

नियम जो किसी भी और सभी कोड परिवर्तनों की अनुमति देता है जो कार्यक्रम के अवलोकन योग्य व्यवहार को नहीं बदलते हैं

समय-समय पर हम कुछ कार्यान्वयनों से व्यवहार करते रहते हैं जो इस नियम के लिए जिम्मेदार हैं। कई बार गलत तरीके से। तो, वास्तव में यह नियम क्या है। मानक स्पष्ट रूप से इस नियम का खंड या पैराग्राफ के रूप में उल्लेख नहीं करता है, तो वास्तव में इस नियम के दायरे में क्या आता है? मेरे लिए यह एक ग्रे क्षेत्र की तरह लगता है जिसे मानक द्वारा विस्तार से परिभाषित नहीं किया गया है। क्या कोई मानक से संदर्भों का हवाला देते हुए विवरण दे सकता है?

नोट: इसे C और C ++ दोनों के रूप में टैग करना, क्योंकि यह दोनों भाषाओं के लिए प्रासंगिक है।


2
यह अमूर्त मशीन को संदर्भित करता है।
एलेक्सी फ्रांज़

" इसे C और C ++ दोनों के रूप में टैग करना, क्योंकि यह दोनों भाषाओं के लिए प्रासंगिक है" यह किसी भी भाषा में प्रासंगिक है।
जिज्ञासु

@AlexeyFrunze " यह अमूर्त मशीन को संदर्भित करता है" यह " एब्सट्रैक्ट मशीन " की स्थिति को संदर्भित करता है एक उपकरण है और एक अंत नहीं है, और अनुरूपता की अवधि में अप्रासंगिक होने के कारण, क्योंकि यह "सार" है जो एक विनिर्देश उपकरण है जो वास्तविक नहीं है।
जिज्ञासु

जवाबों:


98

"क्या है के रूप में यदि " नियम?

" As-if " नियम मूल रूप से परिभाषित करता है कि एक कानूनी C ++ प्रोग्राम पर कार्यान्वयन के लिए किन परिवर्तनों को अनुमति दी जाती है। संक्षेप में, सभी परिवर्तनों को जो एक कार्यक्रम के " अवलोकनीय व्यवहार " को प्रभावित नहीं करते हैं (सटीक परिभाषा के लिए नीचे देखें) की अनुमति है।

लक्ष्य कार्यान्वयन को स्वतंत्रता प्रदान करना है जब तक कि कार्यक्रम का व्यवहार एक सार मशीन के संदर्भ में C ++ मानक द्वारा निर्दिष्ट शब्दार्थ के अनुरूप हो।


मानक इस नियम को कहाँ प्रस्तुत करता है?

C ++ 11 मानक पैराग्राफ 1.9 / 1 में " as-if " नियम का परिचय देता है :

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

इसके अलावा, एक व्याख्यात्मक फुटनोट कहते हैं:

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


नियम क्या कहता है?

पैराग्राफ 1.9 / 5 आगे निर्दिष्ट करता है:

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

यह ध्यान देने योग्य है कि यह बाधा तब लागू होती है जब " केवल एक सुव्यवस्थित कार्यक्रम का निष्पादन" किया जाता है, और यह कि ऐसे कार्यक्रम को निष्पादित करने के संभावित परिणाम जिनमें अपरिभाषित व्यवहार शामिल नहीं हैं, अप्रतिबंधित हैं। इसे पैरा 1.9 / 4 में भी स्पष्ट किया गया है:

इस अंतर्राष्ट्रीय मानक में कुछ अन्य परिचालनों को अपरिभाषित (उदाहरण के लिए, एक कास्ट ऑब्जेक्ट को संशोधित करने के प्रयास का प्रभाव) के रूप में वर्णित किया गया है। [नोट: यह अंतर्राष्ट्रीय मानक उन कार्यक्रमों के व्यवहार पर कोई आवश्यकता नहीं लगाता है जिनमें अपरिभाषित व्यवहार होता है । ध्यान दें]

अंत में, " अवलोकनीय व्यवहार " की परिभाषा के विषय में , पैरा 1.9 / 8 इस प्रकार है:

एक अनुरूप कार्यान्वयन पर सबसे कम आवश्यकताएं हैं:

- अमूर्त मशीन के नियमों के अनुसार अस्थिर वस्तुओं तक पहुंच का कड़ाई से मूल्यांकन किया जाता है।

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

- इंटरेक्टिव उपकरणों के इनपुट और आउटपुट डायनामिक्स इस तरह से घटित होंगे कि इनपुट के लिए प्रोग्राम का इंतजार करने से पहले आउटपुट को संकेत दिया जाता है। एक इंटरैक्टिव डिवाइस का गठन कार्यान्वयन-परिभाषित है।

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


क्या ऐसी परिस्थितियां हैं जहां यह नियम लागू नहीं होता है?

मेरे ज्ञान का सबसे अच्छा करने के लिए, "के रूप में- if " नियम का एकमात्र अपवाद कॉपी / मूव एलिसन है, जिसकी अनुमति है भले ही कॉपी कंस्ट्रक्टर, मूव कंस्ट्रक्टर, या क्लास के डिस्ट्रक्टर के साइड इफेक्ट्स हों। इसके लिए सटीक शर्तें अनुच्छेद 12.8 / 31 में निर्दिष्ट हैं:

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


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

2
@AlokSave: खैर C मानक में, हम देखते हैं "किसी वस्तु को संशोधित करना, किसी वस्तु को संशोधित करना, किसी फ़ाइल को संशोधित करना, या ऐसे कार्यों को करने वाले किसी फ़ंक्शन को कॉल करना सभी दुष्प्रभाव हैं"। संभवतः C ++ मानक (s) में कुछ समान है। अनौपचारिक रूप से, मुझे लगता है कि "कुछ भी जो बाहरी दुनिया के साथ अपनी बातचीत को बदलता है"।
ओलिवर चार्ल्सवर्थ

1
कोई भी व्यवहार जो अमूर्त मशीन की स्थिति को बदलता है (इसलिए, ऐसा कुछ जो परिवर्तनशील या वैश्विक चर में पारित चर को बदल देता है, या I / O उपकरणों को पढ़ता और लिखता है)।
मैट पीटरसन

1
क्या इसका मतलब यह है कि अनंत लूप को हटाने की अनुमति नहीं है, जब तक कि कुछ भी देखने योग्य नहीं होता है।
हैरोल्ड

5
विशेष रूप से ध्यान देने वाली बात यह है कि यह केवल कानूनी कार्यक्रमों पर लागू होता हैअपरिभाषित व्यवहार को लागू करने वाली कोई भी चीज़ किसी भी कवरेज से स्पष्ट रूप से बाहर है।
वॉनब्रांड

15

C11 में नियम को कभी भी इस नाम से नहीं पुकारा जाता है। हालाँकि, C ++ की तरह, C, अमूर्त मशीन के संदर्भ में व्यवहार को परिभाषित करता है। जैसा कि अगर नियम C11 5.1.2.3p4 और p6 में है :

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

  2. [...]

  3. एक अनुरूप कार्यान्वयन पर सबसे कम आवश्यकताएं हैं:

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

     

    यह कार्यक्रम का अवलोकनीय व्यवहार है।


-1

C, C ++, Ada, Java, SML ... किसी भी प्रोग्रामिंग भाषा में अच्छी तरह से (आमतौर पर कई संभव, गैर-निर्धारक) व्यवहार (एस / आई / ओ बंदरगाहों पर बातचीत की श्रृंखला के संपर्क में) का वर्णन करके निर्दिष्ट किया गया है। , नियम के रूप में कोई विशिष्ट नहीं है

विशिष्ट नियम का एक उदाहरण वह है जो यह कहता है कि शून्य द्वारा एक विभाजन एक अपवाद (Ada, Caml) या एक अशक्तता को एक अपवाद (Java) उठाता है। तुम कुछ निर्दिष्ट करने के लिए शासन को बदल सकता है और कुछ और आप एक अलग भाषा के साथ खत्म होता है (कि कुछ लोगों को नहीं बल्कि एक "बोली" कहेंगे (*)। एक विशिष्ट नियम वहाँ एक प्रोग्रामिंग भाषा के कुछ विशिष्ट का उपयोग करता है निर्दिष्ट करने के लिए है एक अलग तरह व्याकरणिक नियम कुछ वाक्य रचना का निर्माण करते हैं।

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

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

बाहरी दुनिया I / O इंटरफेस (stdio) हो सकती है, एक GUI, यहां तक ​​कि एक इंटरएक्टिव इंटरप्रेटर भी हो सकता है जो शुद्ध एपेरेटिव लैंग्वेज के परिणामी मूल्य को आउटपुट करता है। सी और सी ++ में वाष्पशील वस्तुओं तक पहुंच (अस्पष्ट निर्दिष्ट) शामिल है, जो यह कहने का एक और तरीका है कि दिए गए बिंदु पर कुछ वस्तुओं को एबीआई (एप्लिकेशन बाइनरी इंटरफेस) के अनुसार सख्ती से स्मृति में प्रतिनिधित्व किया जाना चाहिए, एबीबी स्पष्ट रूप से उल्लेख किए बिना।

निष्पादन की एक निशान की परिभाषा , जिसे दृश्यमान या अवलोकनीय व्यवहार भी कहा जाता है, यह परिभाषित करता है कि "as-if नियम" से क्या अभिप्राय है। जैसे-यदि नियम इसे समझाने की कोशिश करता है, लेकिन ऐसा करने से, यह लोगों को भ्रमित करता है, तो यह चीजों को स्पष्ट करता है क्योंकि यह एक अतिरिक्त अर्थ नियम के कार्यान्वयन के लिए और अधिक मार्ग देता है।

सारांश:

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

अगर लोगों का मानना ​​है कि मैं गलत हूं, और एक अलग "जैसा कि नियम" है, तो वे C ++ (एक बोली) w / o के एक संस्करण का वर्णन करने की कोशिश क्यों नहीं करते हैं? C ++ विनिर्देशन का क्या अर्थ होगा w / o भी? यह बताना बिल्कुल असंभव होगा कि कोई कंपाइलर कंफर्म हो रहा है या नहीं। या यहां तक ​​कि अनुरूपता को परिभाषित करने के लिए।
जिज्ञासु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.