c++ - सी और सी++ कॉलिंग सम्मेलनों के बीच अंतर क्या हैं?




compiler-construction linker (4)

जैसा कि मुझे पता है, कॉलिंग सम्मेलन कंपाइलर और आर्किटेक्चर निर्भर है।

हाँ।

लेकिन क्या सी और सी ++ कॉलिंग सम्मेलनों के बीच कोई स्पष्ट अंतर है?

बेहतर सवाल है "क्या कोई समानताएं हैं?"

हाँ:

सी ++ एप्लिकेशन के अंदर extern "C" घोषणा की गई एक फ़ंक्शन उस वास्तुकला पर सी फ़ंक्शन द्वारा उपयोग किए जाने वाले समान कॉलिंग कॉन्फ़िगरेशन है।

सम्मेलनों को कॉल करने के बारे में आप जो अन्य धारणाएं कर रहे हैं वह सट्टा है और ऐसा ही हो सकता है लेकिन आपको इसके बारे में चिंता करने की ज़रूरत है मामले के आधार पर

जैसा कि मुझे पता है, कॉलिंग सम्मेलन कंपाइलर और आर्किटेक्चर निर्भर है। लेकिन क्या सी और सी ++ कॉलिंग सम्मेलनों के बीच कोई स्पष्ट अंतर है?


लेकिन क्या सी और सी ++ कॉलिंग सम्मेलनों के बीच कोई स्पष्ट अंतर है?

सामान्य में, कोई भी नहीं है सी ++ को जानबूझकर सी के साथ संगत जितना संभव हो उतना डिज़ाइन किया गया था, और विशेषकर यह सभी सिस्टमों पर सी एप्लिकेशन बाइनरी इंटरफ़ेस का उपयोग करता है।

लेकिन सी एबीआई सी ++ की जरूरतों (विशेष रूप से ओवरलोडिंग, नामस्थान और फ़ंक्शन टेम्प्लेट) की बहुत सी सुविधाओं को पूरा नहीं करता है, इसलिए सी ++ कंपाइलर कार्यों के नामों में कुछ बदलाव करता है। इसे नाम मँगलिंग कहलाता है

इसलिए काम करने के लिए सी और सी ++ कोड के बीच फ़ंक्शन कॉल्स के लिए, ऐसे फ़ंक्शंस को extern "C" रूप में घोषित किया जाना चाहिए जो नाम मैंगलिंग को अक्षम कर देता है और सुनिश्चित करता है कि कॉलिंग सम्मेलनों को सी द्वारा अपेक्षित हैं (लेकिन मुझे उम्मीद है कि यह दूसरा पहलू स्वचालित रूप से आता है , हालांकि मानक यह जनादेश नहीं करता है)।

सी ++ में सदस्य फ़ंक्शंस (कभी कभी यह कॉल कहा जाता है) के लिए अतिरिक्त कॉलिंग सम्मेलन भी होते हैं जो सी में मौजूद नहीं होते हैं। लेकिन नि: शुल्क कार्य उसी कॉलिंग कन्वेंशन को सी के रूप में उपयोग करते हैं, जो भी किसी दिए गए सिस्टम पर है


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

एबीआई का कर्तव्य इस तरह की अवधारणाओं को मानकीकृत / औपचारिक बनाना है, फिर, लोगों का सम्मान करने का कोई कर्तव्य नहीं है (और संभवतः क्योंकि कार्यान्वयन की रंगीन पैलेट काफी थोड़ी भिन्न होती है)

वास्तव में, विनिर्देशों को पारित करने के तरीके के बारे में अनजान होना जरूरी है, यह स्टैक या रजिस्टरों पर समाप्त हो रहा है, दोनों के संयोजन, आवंटन के आदेश आदि। यह कार्यान्वयन पर काम करने वाले लोगों की नौकरी और जो लोग डिजाइन करते हैं वास्तविक हार्डवेयर, अधिक महत्वपूर्ण बात यह है कि निर्देश सेट।

इसलिए: न तो सी, और न ही सी ++, मानकीकृत के रूप में किसी भी चीज को कैसे लागू किया जाता है। इसलिए, भाषाओं के लिए अंतर्निहित कोई अंतर नहीं होना चाहिए। केवल जिस तरह से वे लागू होते हैं। और यह कंपाइलर वास्तुकला का क्षेत्र है।


कोई सी या सी ++ मानक ABI परिभाषित नहीं करता है यह एक जानबूझकर डिजाइन निर्णय है, जो कि संकलक लेखकों को यथासंभव प्रभावी क्रियान्वयन के रूप में बनाने की स्वतंत्रता प्रदान करता है।

समय के साथ एक सी कॉलिंग कन्वेंशन जिसे cdecl कहा जाता है x86 आर्किटेक्चर पर डी-फ़ैक्टो मानक बन गया है। AMD64 मशीनों पर चल रहे C कोड के समान डी-फ़ैक्टो मानक हैं, लेकिन वे यूनिक्स और विंडोज ऑपरेटिंग सिस्टम के बीच अंतर रखते हैं।

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

डी-फ़ैक्टो सी एबीआई का उपयोग करते हुए एक फ़ंक्शन को कार्यान्वित करने के लिए extern "C" { ... } उपयोग पर अक्सर भरोसा किया जा सकता है, लेकिन यह C ++ मानक द्वारा भी आवश्यक नहीं है।

यदि आप वर्तमान C ++ ABI के व्यापक वर्णन में रुचि रखते हैं, तो आपको एगारर कोहरा के "विभिन्न C ++ कंपाइलर्स और ऑपरेटिंग सिस्टम के लिए कॉलिंग कन्वेंशन" देखना चाहिए।





calling-convention