ग्लोबल एडिट: सॉरी दोस्तों, मैंने सभी को निकाल दिया और बहुत सारी बकवास लिखी। बस एक बूढ़ा गीजर शेख़ी मार रहा है।
मैं विश्वास करना चाहता था कि सी को बख्श दिया गया था, लेकिन अफसोस कि C11 के बाद से इसे C ++ के बराबर लाया गया है। जाहिर है, यह जानते हुए कि संकलक अभिव्यक्ति में साइड इफेक्ट्स के साथ क्या करेंगे, अब थोड़ा मैथ्स रिडल को हल करने के लिए कोड अनुक्रमों के आंशिक क्रम को शामिल करने की आवश्यकता होती है, जो "एक पर आधारित है" के सिंक्रनाइज़ेशन बिंदु से पहले स्थित है।
मुझे लगता है कि K & R दिनों (इलेक्ट्रिक कार के नियंत्रक सहित) में कुछ महत्वपूर्ण वास्तविक-समय के एम्बेडेड सिस्टम को डिजाइन और कार्यान्वित किया गया है जो इंजन को जांच में नहीं रखे जाने पर निकटतम दीवार में दुर्घटनाग्रस्त लोगों को भेज सकते हैं, एक 10 टन औद्योगिक रोबोट जो लोगों को एक लुगदी के लिए स्क्वाश कर सकता है यदि ठीक से आज्ञा नहीं दी जाती है, और एक प्रणाली परत जो हानिरहित है, तो कुछ दर्जन प्रोसेसर होंगे जो 1% से कम सिस्टम ओवरहेड के साथ अपने डेटा बस को सूखा लेते हैं)।
मैं अपरिभाषित और अनिर्दिष्ट के बीच अंतर पाने के लिए बहुत छोटा या मूर्ख हो सकता हूं, लेकिन मुझे लगता है कि मुझे अभी भी बहुत अच्छा विचार है कि समवर्ती निष्पादन और डेटा एक्सेस का क्या मतलब है। मेरी स्पष्ट रूप से बताई गई राय में, C ++ और अब C लोग अपनी पालतू भाषाओं के साथ सिंक्रोनाइज़ेशन के मुद्दों को उठा रहे हैं, यह एक महंगा पाइप सपना है। या तो आप जानते हैं कि समवर्ती निष्पादन क्या है, और आपको इनमें से किसी भी गिज़्मोस की आवश्यकता नहीं है, या आप नहीं करते हैं, और आप दुनिया को बड़े पैमाने पर ऐसा करने की कोशिश करेंगे जो इसके साथ खिलवाड़ नहीं करेगा।
आंखों के पानी के मेमोरी बैरियर एब्स्ट्रक्शन के यह सभी ट्रक बस मल्टी-सीपीयू कैश सिस्टम की सीमाओं के एक अस्थायी सेट के कारण हैं, जिनमें से सभी को सामान्य ओएस सिंक्रनाइज़ेशन ऑब्जेक्ट्स में सुरक्षित रूप से समझाया जा सकता है, जैसे, म्यूटेक्स और स्थिति चर C ++। प्रदान करता है।
इस एनकैप्सुलेशन की लागत है, लेकिन प्रदर्शन में एक मिनट की गिरावट के साथ तुलना की जाती है कि विशिष्ट दाने वाले विशिष्ट सीपीयू निर्देशों का उपयोग कुछ मामलों में क्या कर सकता है। कीवर्ड (या एक
volatile
#pragma dont-mess-with-that-variable
सभी के लिए, एक सिस्टम प्रोग्रामर के रूप में, देखभाल) कंपाइलर को मेमोरी एक्सेस को फिर से रोकने के लिए बताने के लिए काफी होता। इष्टतम कोड आसानी से प्रत्यक्ष asm निर्देशों के साथ निम्न स्तर के ड्राइवर और OS कोड को तदर्थ CPU विशिष्ट निर्देशों के साथ छिड़का जा सकता है। अंतर्निहित हार्डवेयर (कैश सिस्टम या बस इंटरफ़ेस) कैसे काम करता है, इसका अंतरंग ज्ञान के बिना, आप वैसे भी बेकार, अक्षम या दोषपूर्ण कोड लिखने के लिए बाध्य हैं।
volatile
कीवर्ड और बॉब का एक मिनट का समायोजन हर किसी का होता लेकिन सबसे कम स्तर के प्रोग्रामर चाचा का। इसके बजाय, C ++ मैथ्स के सामान्य गिरोह के लोगों के पास एक फील्ड डे डिजाइनिंग थी जो अब तक एक और समझ से बाहर है, गैर-मौजूद समस्याओं की तलाश करने के लिए अपनी विशिष्ट प्रवृत्ति के लिए तैयार है और एक संकलक के चश्मे के साथ एक प्रोग्रामिंग भाषा की परिभाषा को गलत करता है।
केवल इस बार सी के एक मूलभूत पहलू को खराब करने के लिए आवश्यक परिवर्तन, क्योंकि इन "बाधाओं" को निम्न स्तर के सी कोड में भी ठीक से काम करने के लिए उत्पन्न किया जाना था। अन्य बातों के अलावा, अभिव्यक्ति की परिभाषा में कोई व्याख्या या औचित्य नहीं है।
निष्कर्ष के रूप में, तथ्य यह है कि एक कंपाइलर सी के इस बेतुके टुकड़े से एक सुसंगत मशीन कोड का उत्पादन कर सकता है जिस तरह से सी ++ लोग 2000 के दशक के अंत में कैश सिस्टम की संभावित विसंगतियों के साथ मुकाबला करते हैं।
इसने C के एक मूलभूत पहलू (अभिव्यक्ति परिभाषा) का एक भयानक गड़बड़ कर दिया, ताकि C प्रोग्रामर का विशाल बहुमत - जो कैश सिस्टम के बारे में कोई लानत नहीं देते हैं, और ठीक ही तो - अब समझाने के लिए गुरुओं पर भरोसा करने को मजबूर हैं a = b() + c()
और के बीच अंतर a = b + c
।
यह अनुमान लगाने की कोशिश करना कि इस दुर्भाग्यपूर्ण सरणी का क्या होगा, वैसे भी समय और प्रयासों का शुद्ध नुकसान है। कंपाइलर चाहे जो भी बना ले, यह कोड पैथोलॉजिकल रूप से गलत है। इसके साथ करने के लिए एकमात्र जिम्मेदार चीज इसे बिन में भेजना है।
वैचारिक रूप से, साइड इफेक्ट्स को हमेशा अभिव्यक्तियों से दूर ले जाया जा सकता है, मूल्यांकन के पहले या बाद में, स्पष्ट रूप से संशोधन के तुच्छ प्रयास के साथ, एक अलग बयान में।
80 के दशक में इस तरह के शिट्टी कोड को उचित ठहराया जा सकता था, जब आप कंपाइलर से कुछ भी ऑप्टिमाइज़ करने की उम्मीद नहीं कर सकते थे। लेकिन अब जब कि कंपाइलर अधिकांश प्रोग्रामर की तुलना में अधिक चतुर हो गए हैं, तो जो कुछ बचता है वह शिट्टी कोड का एक टुकड़ा है।
मैं इस अपरिभाषित / अनिर्दिष्ट बहस के महत्व को समझने में भी विफल हूं। या तो आप संगत व्यवहार के साथ कोड उत्पन्न करने के लिए संकलक पर भरोसा कर सकते हैं या आप नहीं कर सकते। चाहे आप उस अपरिभाषित या अनिर्दिष्ट को म्यूट बिंदु की तरह कहते हैं।
मेरे स्पष्ट रूप से सूचित राय में, सी पहले से ही अपने K & R राज्य में काफी खतरनाक है। एक उपयोगी विकास सामान्य ज्ञान सुरक्षा उपायों को जोड़ना होगा। उदाहरण के लिए, इस उन्नत कोड विश्लेषण उपकरण का उपयोग करने से ऐनक कंपाइलर को कम से कम बोनट कोड के बारे में चेतावनी देने के लिए लागू करने के लिए मजबूर करता है, बजाय चुपचाप कोड के चरम से अविश्वसनीय रूप से उत्पन्न करने के लिए।
लेकिन इसके बजाय, लोगों ने उदाहरण के लिए, C ++ 17 में एक निश्चित मूल्यांकन आदेश को परिभाषित करने का निर्णय लिया। अब हर सॉफ्टवेयर इम्बेकाइल को सक्रिय रूप से उसके / उसके कोड में साइड इफेक्ट डालने के लिए उकसाया जाता है, यह सुनिश्चित करते हुए कि नए कंपाइलर निर्धारित रूप से ओफ्यूजेशन को उत्सुकता से संभालेंगे।
K & R कंप्यूटिंग दुनिया के सच्चे चमत्कारों में से एक था। बीस रुपये के लिए आपको भाषा का एक व्यापक विनिर्देश मिला (मैंने देखा है कि एकल व्यक्ति इस पुस्तक का उपयोग करते हुए पूर्ण कंपाइलर लिखते हैं), एक उत्कृष्ट संदर्भ पुस्तिका (सामग्री की तालिका आमतौर पर आपके उत्तर के कुछ पृष्ठों के भीतर आपको इंगित करेगी) प्रश्न), और एक पाठ्यपुस्तक जो आपको समझदार तरीके से भाषा का उपयोग करना सिखाएगी। तर्कसंगत, उदाहरणों और चेतावनी के बुद्धिमान शब्दों के साथ पूरा करें कि आप कई तरीकों से भाषा का दुरुपयोग कर सकते हैं बहुत, बहुत बेवकूफ बातें।
इतने कम लाभ के लिए उस विरासत को नष्ट करना मुझे एक क्रूर बर्बादी की तरह लगता है। लेकिन फिर से मैं पूरी तरह से इस बिंदु को देखने में विफल हो सकता हूं। शायद कुछ दयालु आत्मा मुझे नए सी कोड के उदाहरण की दिशा में इंगित कर सकते हैं जो इन दुष्प्रभावों का महत्वपूर्ण लाभ उठाते हैं?