कुछ अन्य भाषाओं की तुलना में सी की एक दिलचस्प विशेषता यह है कि इसके कई प्रकार के डेटा लक्ष्य वास्तुकला के शब्द आकार पर आधारित हैं, बजाय पूर्ण शब्दों में निर्दिष्ट होने के। हालांकि यह भाषा को मशीनों पर कोड लिखने के लिए उपयोग करने की अनुमति देता है जो कुछ प्रकारों के साथ कठिनाई हो सकती है, यह कोड को डिज़ाइन करना बहुत कठिन बनाता है जो विभिन्न आर्किटेक्चर पर लगातार चलेगा। कोड पर विचार करें:
uint16_t ffff16 = 0xFFFF;
int64_t who_knows = ffff16 * ffff16;
एक आर्किटेक्चर पर जहां int
16 बिट्स (अभी भी कई छोटे माइक्रोकंट्रोलर का सच है) यह कोड अच्छी तरह से परिभाषित व्यवहार का उपयोग करके 1 का मान प्रदान करेगा। मशीनों पर जहां int
64 बिट्स है, यह अच्छी तरह से परिभाषित व्यवहार का उपयोग करते हुए, फिर से 4294836225 मान प्रदान करेगा। मशीनों पर जहां int
32 बिट्स हैं, यह संभवतः -131071 (मैं नहीं जानता कि अगर यह कार्यान्वयन-परिभाषित या अपरिभाषित व्यवहार होगा) का मान निर्दिष्ट करेगा। भले ही कोड कुछ भी नहीं का उपयोग करता है सिवाय इसके कि नाममात्र "तय-आकार" प्रकार के होने के अलावा, मानक के लिए आवश्यक होगा कि उपयोग में आने वाले दो अलग-अलग प्रकार के संकलक आज दो अलग-अलग परिणाम प्राप्त करेंगे, और कई लोकप्रिय संकलक आज एक तिहाई का उत्पादन करेंगे।
यह विशेष उदाहरण कुछ हद तक वंचित है, इसमें मैं वास्तविक दुनिया कोड में दो 16-बिट मान के उत्पाद को सीधे 64-बिट मान पर असाइन करने की अपेक्षा नहीं करूंगा, लेकिन इसे तीन तरीके पूर्णांक दिखाने के लिए एक संक्षिप्त उदाहरण के रूप में चुना गया था प्रोन्नति माना-निश्चित-आकार के अहस्ताक्षरित प्रकारों के साथ सहभागिता कर सकती है। कुछ वास्तविक दुनिया की स्थितियां हैं, जहां गणित के लिए आवश्यक है कि अहस्ताक्षरित प्रकारों पर गणितीय पूर्णांक अंकगणित के नियमों के अनुसार प्रदर्शन किया जाए, अन्य जहां यह आवश्यक है कि यह मॉड्यूलर अंकगणित के नियमों के अनुसार किया जाए, और कुछ जहां वास्तव में नहीं है ' टी मामला चेकसम जैसी चीजों के लिए बहुत सारे वास्तविक दुनिया कोड uint32_t
अंकगणित रैपिंग मॉड 2³² पर निर्भर करते हैं , और इसके विपरीत प्रदर्शन करने में सक्षम होते हैंuint16_t
अंकगणित और परिणाम प्राप्त करें, जो न्यूनतम हैं, सटीक मॉड 65536 के रूप में परिभाषित किए गए हैं (जैसा कि अपरिभाषित व्यवहार को ट्रिगर करने के विपरीत है)।
भले ही यह स्थिति स्पष्ट रूप से अवांछनीय प्रतीत होगी (और 64-बिट प्रसंस्करण के रूप में कई उद्देश्यों के लिए आदर्श बन जाएगा), सी मानकों समिति ने जो कुछ भी देखा है, मैं भाषा सुविधाओं को पेश करने के लिए पसंद करता हूं जो पहले से ही कुछ उल्लेखनीय उत्पादन में उपयोग किए जाते हैं। वातावरण, उन्हें "खरोंच से" आविष्कार करने के बजाय। क्या सी भाषा के लिए कोई उल्लेखनीय एक्सटेंशन हैं जो कोड को यह निर्दिष्ट करने की अनुमति देगा कि न केवल एक प्रकार को कैसे संग्रहीत किया जाएगा बल्कि यह भी कि संभावित प्रचार वाले परिदृश्यों में कैसे व्यवहार करना चाहिए? मैं कम से कम तीन तरीके देख सकता हूं कि एक कंपाइलर एक्सटेंशन ऐसे मुद्दों को हल कर सकता है:
एक निर्देशन जोड़कर जो संकलक को कुछ निश्चित "मौलिक" पूर्णांक प्रकारों को कुछ आकारों के लिए बाध्य करने का निर्देश देगा।
एक निर्देशन जोड़कर जो संकलक को विभिन्न संवर्धन परिदृश्यों का मूल्यांकन करने के लिए निर्देश देगा, हालांकि मशीन के प्रकारों के विशेष आकार थे, लक्ष्य वास्तुकला पर प्रकारों के वास्तविक आकार की परवाह किए बिना।
जोड़ने एक, (विशिष्ट विशेषताओं के साथ प्रकार की घोषणा जैसे घोषणा करते हैं कि एक प्रकार, एक आधुनिक-65536 रैपिंग बीजीय अंगूठी के रूप में व्यवहार करना चाहिए अंतर्निहित शब्द आकार की परवाह किए बिना, और परोक्ष अन्य प्रकार के लिए परिवर्तनीय नहीं होना चाहिए के माध्यम अनुमति देकर
wrap32
एक करने के लिएint
एक उपज चाहिए 16 बिट्स से बड़ा हैwrap32
या नहीं , इसके प्रकार के परिणामस्वरूपint
, जबकि एक सेwrap32
सीधे जोड़नाwrap16
अवैध होना चाहिए (क्योंकि न तो दूसरे में परिवर्तित हो सकता है)।
मेरी खुद की प्राथमिकता तीसरा विकल्प होगी, क्योंकि यह बहुत सारे कोड के साथ काम करने के लिए असामान्य शब्द आकारों के साथ मशीनों को भी अनुमति देगा जो चर को "लपेटने" की उम्मीद करता है क्योंकि वे पावर-ऑफ-टू आकार के साथ होंगे; कंपाइलर को उपयुक्त व्यवहार करने के लिए बिट-मास्किंग निर्देश जोड़ना पड़ सकता है, लेकिन यदि कोड को एक प्रकार की आवश्यकता होती है, जो मॉड 65536 को लपेटता है, तो यह बेहतर है कि कंपाइलर मशीनों पर ऐसे मास्किंग उत्पन्न करें, जिसके साथ स्रोत कोड को अव्यवस्थित करने की आवश्यकता हो। या बस मशीनों पर अनुपयोगी द्वारा ऐसा कोड है जहाँ इस तरह की मास्किंग की आवश्यकता होगी। मैं उत्सुक हूं, हालांकि, चाहे कोई भी सामान्य एक्सटेंशन हो जो उपरोक्त किसी भी माध्यम से पोर्टेबल व्यवहार को प्राप्त करेगा, या कुछ ऐसे माध्यमों के बारे में जिनके बारे में मैंने नहीं सोचा है।
यह स्पष्ट करने के लिए कि मैं क्या देख रहा हूं, कुछ चीजें हैं; सबसे एहम:
जबकि ऐसे कई तरीके हैं जिनके द्वारा कोड को लिखा जा सकता है ताकि वांछित शब्दार्थ सुनिश्चित किया जा सके (जैसे मैक्रोज़ को परिभाषित करने के लिए विशेष आकार के अनसाइन्ड ऑपरेंड पर गणित करने के लिए ताकि एक परिणाम मिल सके जो स्पष्ट रूप से या तो लपेटता है या नहीं) या कम से कम अवांछित है। शब्दार्थ (जैसे सशर्त रूप से संकलक
wrap32_t
होने के लिए एक प्रकार को परिभाषित करता हैuint32_t
जहांuint32_t
प्रचार नहीं किया जाएगा, और यह आंकड़ा है कि यह कोड के लिए बेहतर है जोwrap32_t
मशीनों पर संकलन को विफल करने की आवश्यकता है जहां उस प्रकार को बढ़ावा दिया जाएगा जहां इसे चलाने के लिए और फर्जी व्यवहार का उत्पादन करने के लिए, यदि कोड लिखने का कोई तरीका है जो भविष्य के भाषा एक्सटेंशन के साथ सबसे अनुकूल रूप से खेलेंगे, तो इसका उपयोग करना मेरे अपने दृष्टिकोण को तैयार करने से बेहतर होगा।मेरे पास कुछ ठोस विचार हैं कि कैसे भाषा को बढ़ाया जा सकता है ताकि कई पूर्णांक-आकार के मुद्दों को हल किया जा सके, जिससे कोड को अलग-अलग शब्द आकारों के साथ मशीनों पर समान शब्दार्थ प्राप्त करने की अनुमति मिलती है, लेकिन इससे पहले कि मैं कोई महत्वपूर्ण समय बिताऊं उन्हें लिखना पसंद करता हूं। यह जानने के लिए कि उस दिशा में क्या प्रयास किए गए हैं।
मैं किसी भी तरह से सी मानकों समिति या उनके द्वारा उत्पादित कार्य को नापसंद करने के रूप में नहीं देखना चाहता हूं; हालाँकि, मुझे उम्मीद है कि कुछ वर्षों के भीतर मशीनों पर कोड का काम सही ढंग से करना आवश्यक हो जाएगा, जहां "प्राकृतिक" पदोन्नति प्रकार 32 बिट्स, साथ ही साथ जहां यह 64 बिट्स होंगे। मुझे लगता है कि भाषा के कुछ मामूली विस्तार के साथ (C99 nnd C14 के बीच कई अन्य परिवर्तनों की तुलना में अधिक मामूली) यह न केवल 64-बिट आर्किटेक्चर का उपयोग करके कुशलता से एक स्वच्छ तरीका प्रदान करना संभव होगा, बल्कि सौदेबाजी में भी बातचीत की सुविधा प्रदान करता है। "असामान्य-शब्द-आकार" मशीनें जो मानक ऐतिहासिक रूप से समर्थन करने के लिए पिछड़े पर झुकती हैं [जैसे कि 12-बिट के साथ मशीनों के लिए संभव है char
कि कोड चलाने के लिए एक की उम्मीद हैuint32_t
रैप करने के लिए mod 2³²]। भविष्य के विस्तार की दिशा पर निर्भर करते हुए, मैं यह भी उम्मीद करूंगा कि मैक्रोज़ को परिभाषित करना संभव होगा, जो आज लिखे गए कोड को आज के कंपाइलरों पर प्रयोग करने योग्य बनाने की अनुमति देगा, जहां डिफ़ॉल्ट पूर्णांक प्रकार "अपेक्षित" के रूप में व्यवहार करते हैं, लेकिन भविष्य के कंपाइलरों पर भी उपयोग करने योग्य है। प्रकार डिफ़ॉल्ट रूप से अलग व्यवहार करेंगे, लेकिन आवश्यक व्यवहार कहां प्रदान कर सकते हैं।
int
, फिर भी यह अभी भी अंदर आता है (फिर से सी मानक की मेरी समझ सही है।)
int
बड़ा हैuint16_t
, तो गुणन के संचालन को बढ़ावा दिया जाएगाint
और गुणन कोint
गुणा के रूप में किया जाएगा , और जिसके परिणामस्वरूपint
मूल्य कोint64_t
आरंभीकरण के लिए परिवर्तित किया जाएगाwho_knows
।