2010-05-04 3 views
83

मैंने कई बार "आईबी" और "यूबी" शब्द देखा है, खासकर सी ++ के संदर्भ में। मैंने उन्हें गुगल करने की कोशिश की है, लेकिन जाहिर है कि उन दो अक्षर संयोजनों का बहुत उपयोग होता है। : पी"आईबी" और "यूबी" का क्या अर्थ है?

तो, मैं आपसे पूछता हूं ... उनका क्या मतलब है, जब उन्हें कहा जाता है कि वे एक बुरी चीज हैं?

+3

यदि आप किसी और के संपादन को वापस रोल करने का निर्णय लेते हैं, तो कृपया सुनिश्चित करें कि आपकी वर्तनी, विराम चिह्न और व्याकरण सही हैं। मूल पाठ पर पर्याप्त सुधार होने वाले संपादन को पीछे छोड़ना व्यर्थ है। –

उत्तर

102

आईबी: कार्यान्वयन से परिभाषित व्यवहार। मानक सटीक व्यवहार को परिभाषित करने के लिए मानक कंपाइलर/प्लेटफॉर्म पर छोड़ देता है, लेकिन इसकी आवश्यकता होती है कि इसे परिभाषित किया जाए।

कार्यान्वयन-परिभाषित व्यवहार का उपयोग उपयोगी हो सकता है, लेकिन आपका कोड कम पोर्टेबल बनाता है।

यूबी: अपरिभाषित व्यवहार। मानक यह निर्दिष्ट नहीं करता है कि अपरिभाषित व्यवहार का एक कार्यक्रम कैसे व्यवहार करना चाहिए। "नाक राक्षसों" के रूप में भी जाना जाता है क्योंकि सैद्धांतिक रूप से यह राक्षसों को आपकी नाक से बाहर निकाल सकता है।

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

+9

मैं अभी भी किसी भी नाक से उड़ने वाले राक्षस के लिए इंतजार कर रहा हूं क्योंकि सी ++ में अपरिभाषित व्यवहार का उपयोग करना है। मुझे लगता है कि यह तब होगा जब पहले कंपाइलर्स नए सी ++ मानक का पूरी तरह से पालन करते हैं। "नाक राक्षसों" के लिए – OregonGhost

+2

+1। :) – cHao

+4

@OregonGost: मुझे लगता है कि आप सही हैं। मैंने देखा है कि यह यूनिकॉर्न्स के साथ दो बार होता है, लेकिन कभी राक्षस नहीं। – Thomas

8
  • आईबी: क्रियान्वयन परिभाषित व्यवहार है - संकलक को यह दस्तावेज करना चाहिए कि यह क्या करता है। ऋणात्मक मूल्य पर >> ऑपरेशन करना एक उदाहरण है।

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

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

14

कार्यान्वयन से परिभाषित व्यवहार और अपरिभाषित व्यवहार

सी ++ मानक विभिन्न निर्माणों के प्रभाव के बारे में बहुत विशिष्ट है, और विशेष रूप से आप हमेशा मुसीबत की इन श्रेणियों के बारे में पता होना चाहिए:

  • अपरिभाषित व्यवहार का अर्थ है कि बिल्कुल कोई गारंटी नहीं दी जाती है। कोड काम कर सकता है, या यह आपके हार्डड्राइव या make demons fly out your nose पर आग लगा सकता है। जहां तक ​​सी ++ भाषा का सवाल है, बिल्कुल कुछ भी हो सकता है। व्यावहारिक शब्दों में, इसका आम तौर पर मतलब है कि आपके पास एक अप्राप्य बग है। यदि ऐसा होता है, तो आप वास्तव में अपने आवेदन के बारे में कुछ भी पर भरोसा नहीं कर सकते हैं (क्योंकि इस अपरिभाषित व्यवहार के प्रभावों में से एक आपके बाकी ऐप द्वारा उपयोग की गई स्मृति को गड़बड़ कर सकता है)।इसे सुसंगत होने की आवश्यकता नहीं है, इसलिए प्रोग्राम को दो बार चलाने से अलग-अलग परिणाम मिल सकते हैं। यह चंद्रमा के चरणों, आपके द्वारा पहनने वाली शर्ट का रंग, या बिल्कुल कुछ और पर निर्भर हो सकता है।

  • निर्दिष्ट व्यवहार का अर्थ है कि कार्यक्रम को कुछ सन और संगत करना चाहिए, लेकिन दस्तावेज़ पर यह आवश्यक नहीं है।

  • कार्यान्वयन-परिभाषित व्यवहार अनिर्दिष्ट के समान है, लेकिन संकलक लेखकों द्वारा भी दस्तावेज किया जाना चाहिए। इसका एक उदाहरण reinterpret_cast का परिणाम है। आमतौर पर, यह पते को संशोधित किए बिना बस एक सूचक के प्रकार को बदलता है, लेकिन मैपिंग वास्तव में क्रियान्वयन-परिभाषित है, इसलिए एक कंपाइलर नक्शा एक पूरी तरह से अलग पते पर नक्शा कर सकता है, जब तक यह इस विकल्प को दस्तावेज करता है। एक और उदाहरण एक int का आकार है। अगर यह 2, 4 या 8 बाइट्स सी ++ मानक परवाह नहीं करता है, लेकिन यह संकलक द्वारा प्रलेखित किया जाना चाहिए

लेकिन आम इन सभी के लिए है कि वे सबसे अच्छा बचा रहे हैं। जब संभव हो, तो व्यवहार के साथ चिपकें जो 100% सी ++ मानक द्वारा निर्दिष्ट है। इस तरह, आप पोर्टेबिलिटी की गारंटी है।

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

दूसरी ओर, अनिर्धारित व्यवहार हमेशा से बचा जाना चाहिए। आम तौर पर, आपको यह मानना ​​चाहिए कि यह आपके प्रोग्राम को एक या दूसरे तरीके से विस्फोट कर देता है।

+1

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

+3

@ जेरी: नहीं, यूबी से बचा जाना चाहिए * अगर यह पूरी तरह से अपरिभाषित है *। यदि मंच/कार्यान्वयन/रनटाइम/कंपाइलर और गारंटी देता है, तो आप व्यवहार पर भरोसा कर सकते हैं और पोर्टेबिलिटी खो सकते हैं। लेकिन फिर यह अब तक अनिर्धारित नहीं है ... हालांकि, आपके पास ऐसी कोई गारंटी नहीं है, और अपरिभाषित केवल अपरिभाषित है, और हर कीमत से बचा जाना चाहिए। – jalf

+0

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

4

लघु संस्करण:

कार्यान्वयन से परिभाषित व्यवहार (आईबी): सही ढंग से प्रोग्राम किया लेकिन अनिश्चित *

अपरिभाषित व्यवहार (यूबी): गलत तरीके से प्रोग्राम किया (! यानी एक बग)

*) भाषा मानक के संबंध में "अनिश्चित", यह निश्चित रूप से किसी निश्चित मंच पर निर्धारित होगा।

+0

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