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