2010-08-06 13 views
8

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

+0

+1 मैं दूसरा प्रश्न यह प्रश्न! – Poni

उत्तर

10

आपके द्वारा उल्लिखित कॉलिंग सम्मेलनों को विभिन्न भाषाओं और विभिन्न हार्डवेयर के दशकों के दौरान डिजाइन किया गया था। उन सभी के पास अलग-अलग लक्ष्य थे। printf के लिए cdecl समर्थित परिवर्तनीय तर्क। stdcall के परिणामस्वरूप छोटे कोड जेन, लेकिन कोई परिवर्तनीय तर्क नहीं है। फास्टकॉल पुरानी मशीनों पर केवल एक या दो तर्कों के साथ सरल कार्यों के प्रदर्शन को बहुत तेज कर सकता है (लेकिन शायद ही कभी एक गति तेज है।)

जब x64 को पेश किया गया था, तो ध्यान दें कि कम से कम विंडोज पर, यह डिजाइन करने के लिए डिज़ाइन किया गया था एक एकल कॉलिंग सम्मेलन।

रेमंड चेन ने सम्मेलन के इतिहास पर एक महान श्रृंखला लिखी, आप here शुरू कर सकते हैं।

+2

मुझे रेमंड चेन लेख पसंद है। इसने बहुत सारे सवालों का जवाब दिया। – dsimcha

1

क्योंकि ऐतिहासिक रूप से हर कोई और उनके बच्चे भाई ने अपने स्वयं के कॉलिंग सम्मेलनों को परिभाषित किया था। वे सभी अलग-अलग उद्देश्यों के लिए बनाए गए थे और इस प्रकार विभिन्न प्रदर्शन आवश्यकताओं से प्रेरित थे। उदाहरण के लिए, C++ this पैरामीटर को पारित करने के लिए अनुकूलन का पक्ष लेता है।

1
  • उनमें से कुछ प्रदर्शन के संबंध में अधिक कुशल हैं और अन्य कोड आकार में अधिक कुशल हैं।
  • कुछ विशेषताएं (परिवर्तनीय तर्क गणना) केवल कुछ सम्मेलनों के साथ समर्थित हैं।

अधिक जानकारी: http://en.wikipedia.org/wiki/X86_calling_conventions

0

कारण का हिस्सा माइक्रोप्रोसेसर (या प्रोसेसर) की अंतर्निहित संरचना है। अधिकांश भाषाएं एक विशिष्ट सीपीयू पर शुरू होती हैं, और उस आर्किटेक्चर के साथ थोड़ा उलझ जाती हैं। उदाहरण के लिए, पुराने यूनिवैक 1100 श्रृंखला कंप्यूटर में कॉल स्टैक भी नहीं था!

कारण का एक और हिस्सा यह है कि जब तक आप चीजों को करने के कई तरीकों का प्रयास नहीं करते हैं तब तक सबसे अच्छा समाधान देखना संभव नहीं है।

0

वे विभिन्न उद्देश्यों के लिए और विभिन्न अनुकूलन प्रणालियों के साथ बनाए गए हैं।

उदाहरण के लिए, "स्टैक ओवरफ़्लो" को कम करने के लिए (कोई इरादा नहीं है) कुछ लोगों ने स्टैक ओवरफ्लो असंभव बनाने के लिए फ़ंक्शन कॉल करने के लिए विभिन्न विचारों के बारे में सोचा था।

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