2010-07-21 7 views
7

क्या मानक-अनुरूप सी ++ कार्यान्वयन मानक में कार्यान्वयन-परिभाषित करने के लिए कुछ व्यवहार को लागू करने की अनुमति है, इस तरह से एक ही इनपुट डेटा के साथ एक बार संकलित एक ही संकलित के विभिन्न रनों के बीच अलग है?क्या कार्यान्वयन-परिभाषित व्यवहार सी ++ में रनों के बीच संगत होना आवश्यक है?

उदाहरण के लिए, "यह सप्ताहांत पर व्यवहार है और अन्यथा" और ऐसे कथन के अनुसार व्यवहार को लागू करने के लिए एक कार्यान्वयन की अनुमति है?

+2

क्या आपके मन में एक ठोस उदाहरण है? वैकल्पिक रूप से मैं "क्रियान्वयन परिभाषित" को वास्तव में अर्थ के रूप में लेता हूं और यदि कार्यान्वयनकर्ता स्थिरता की गारंटी देता है तो स्थिरता की अपेक्षा करता है, अन्यथा सभी दांव – msw

+3

बंद होते हैं जीसीसी अपरिभाषित व्यवहार के साथ अधिक शांत होता था: http: //en.wikipedia .org/wiki/undefined_behavior # Compiler_easter_eggs – sarnold

उत्तर

1

कार्यान्वयन परिभाषित व्यवहार का मतलब

Unspeci फाई एड व्यवहार जहां प्रत्येक कार्यान्वयन दस्तावेजों कैसे पसंद किया जाता है

यह संकलक लेखकों के लिए अनिवार्य एक विशेष प्रोग्रामिंग के व्यवहार दस्तावेज़ के लिए है एक विशेष कार्यान्वयन के लिए निर्माण।

..... इस तरह से यह एक ही इनपुट डेटा के साथ एक बार संकलित एक ही संकलित के विभिन्न रनों के बीच अलग है?

नोप्स!

उदाहरण के लिए, "यह सप्ताहांत पर व्यवहार है और अन्यथा" और ऐसे कथन के अनुसार व्यवहार को लागू करने के लिए एक कार्यान्वयन की अनुमति है?

मुझे यकीन है कि नहीं हूँ, लेकिन मुझे लगता है कि इस सवाल का जवाब कोई है।

+4

मुझे नहीं पता कि इसकी अनुमति क्यों नहीं है। मानक कहता है "कैसे चुनाव किया जाता है", न कि "कौन सी पसंद की जाती है"। – sharptooth

+3

जैसा कि मैंने इसे देखा है, कार्यान्वयन-परिभाषित व्यवहार की परिभाषा रन-टू-रन मतभेदों की संभावना से इंकार नहीं करती है, बशर्ते कि प्रत्येक मामले के दौरान यह ठीक से दस्तावेज हो और वास्तव में प्रत्येक के लिए क्या होता है। –

+1

@ शार्पतोथ: मैंने अपना जवाब संपादित कर लिया है, लेकिन मुझे लगभग निश्चित है कि आपके पहले प्रश्न का उत्तर नहीं है। उदाहरण के लिए 'आकार (int)' पर विचार करते हुए, यह गारंटी दी जाती है (जैसा कार्यान्वयन ने व्यवहार को दस्तावेज किया है) एक विशेष कार्यान्वयन के लिए ठीक रहने के लिए। .... मैं इस तरह के कथन के अनुसार व्यवहार में थोड़ा उलझन में हूं और व्यवहार को लागू करता हूं? –

0

rand(3)<stdlib.h> में सी ++ के भीतर से कॉल किया जा सकता है, यह सुनिश्चित नहीं है कि "मानक सी ++" में सी पुस्तकालय कितना शामिल है, लेकिन निश्चित रूप से यादृच्छिक संख्या उत्पन्न करने के लिए कुछ मानकों-अनुरूप तंत्र हैं।

<time.h> में वर्तमान समय देता है; सी ++ के साथ एक ही कहानी और सी पुस्तकालय में कॉलिंग।

+1

यह प्रश्न के लिए प्रासंगिक कैसे है? – Naveen

+0

'रैंड() 'या' समय()' लेबलिंग कार्यान्वयन-परिभाषित हैं? मैं केवल यह मान सकता हूं कि वे हैं, और यदि ऐसा है तो वे वास्तव में एक counterexample होगा। खैर, जब तक आप वर्तमान समय और/या सिस्टम आरएनजी राज्य इनपुट का हिस्सा नहीं मानते हैं। –

+0

@naveen, मैंने मान लिया कि 'rand()' मानक में निर्दिष्ट है लेकिन विवरण कार्यान्वयन-परिभाषित हैं। मुझे इस धारणा की पुष्टि करने में परेशानी हो रही है। – sarnold

6

बेशक, अगर कार्यान्वयन दस्तावेज वास्तव में व्यवहार अलग-अलग रनों के साथ बदलते हैं, तो यह ठीक है। ध्यान दें कि कार्यान्वयन से परिभाषित व्यवहार सार मशीन के मापदंडों का हिस्सा है:

इस अंतर्राष्ट्रीय मानक में अर्थ विवरण एक पैरामिट्रीकृत nondeterministic सार मशीन परिभाषित करते हैं।

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

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

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

+0

'... पैरामीटरकृत नोडेटर्मिनिस्टिक सार मशीन को परिभाषित करें। 'चूंकि अमूर्त मशीन नोडेटर्मेनिस्टिक है क्योंकि एक व्यवहार के लिए कंपाइलर के एक ही भाग में एकरूप होना आवश्यक है? –

+0

@ प्र्रासून, केवल कुछ पथ - वे जहां व्यवहार अनिर्दिष्ट है - गैर-निर्धारणा का परिचय दें। उदाहरण के लिए, नियमित अभिव्यक्ति 'z (a | b)' को गैर-निर्धारिती परिमित राज्य मशीन (एनएफए) द्वारा व्यक्त किया जा सकता है जो इनपुट के अंत में 'ए' या 'बी' से मेल खाता है। लेकिन फिर भी, यह इनपुट की शुरुआत में लगातार 'z' से मेल खाता है :) अब कार्यान्वयन-परिभाषित व्यवहार के लिए, यदि पैरामीटर (कहते हैं, शुरुआत में' z') बदल जाएगा, तो आपको परिणामस्वरूप एक अलग संबंधित सार मशीन मिल जाएगी। अब आपके पास एक ही कार्यान्वयन स्रोत कोड का अनुवाद नहीं करेगा, लेकिन दो। :) –

+0

आह !! और sharptooth के सवाल का उल्लेख है कि इनपुट डेटा की आवश्यकता है 'वही' .... पुhew! धन्यवाद जोहान्स :) –

1

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

3

एक उदाहरण मैं सोच सकता हूं यदि कार्यक्रम संख्याओं के लिए बड़े या छोटे एंडियन प्रतिनिधित्व का उपयोग करता है। मेरा मानना ​​है कि यह निश्चित रूप से कार्यान्वयन परिभाषित व्यवहार के रूप में गिना जाएगा।

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

इसी प्रकार मुझे लगता है कि आप एक कंपाइलर लिख सकते हैं जिसने एक ही प्रोग्राम के 32 विज्ञापन 64 बिट को संकलित किया - और जिस मोड को निष्पादित किया गया वह रन टाइम पर निर्धारित किया जा सकता है। दोबारा, प्रलेखन को यह कहना होगा कि इस पर निर्भर करता है कि इट्स 32 बिट या 64 बिट थे।

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

+0

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

+0

आह अच्छा, मुझे पता नहीं था कि मैक्सोक्स ने यह किया :) – jcoder

1

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

आप उम्मीद कर सकते हैं कि ज्यादातर मामलों में कार्यान्वयन कार्यान्वयन के व्यवहार और प्रोग्राम जो यह कंपाइलर/लिंकर पैरामीटर के दिए गए सेट के लिए उत्पन्न करता है, के बारे में कुछ बुनियादी गारंटी प्रदान करेगा। यहां तक ​​कि यदि सिस्टम का भार प्रभावित कर सकता है कि आपके प्रोग्राम पर ऑप्टिमाइज़र कितना काम कर सकता है - कुछ अनुकूलक कुछ सीमित समय आवंटित किए जाएंगे - जो अपेक्षित व्यवहार को नहीं बदलना चाहिए।

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

संबंधित मुद्दे

 संबंधित मुद्दे