C जहां C ++ कम पड़ता है, वहां भाषा 'बाइंडिंग' क्यों प्रदान करती है?


60

मैं हाल ही में सोच रहा था कि C ++ से अधिक C का उपयोग कब करना है, और इसके विपरीत? सौभाग्य से किसी ने मुझे पहले ही हरा दिया और हालांकि इसमें कुछ समय लगा, मैं उस प्रश्न के सभी उत्तरों और टिप्पणियों को पचाने में सक्षम था।

हालाँकि उस पोस्ट में एक वस्तु को बार-बार संबोधित किया जा रहा है, बिना किसी प्रकार के उदाहरण, सत्यापन या स्पष्टीकरण के:

"जब आप अपने पुस्तकालय के लिए कई भाषा बाँधना चाहते हैं तो सी कोड अच्छा है"

यह एक विरोधाभास है। मुझे ध्यान देना चाहिए कि कई लोग बताते हैं कि C ++ (कुछ externकामकाज के माध्यम से ) में कई भाषा बाइंडिंग संभव हैं , लेकिन फिर भी, यदि आप उस पोस्ट को उसकी संपूर्णता में पढ़ते हैं, तो यह बहुत स्पष्ट है कि C पोर्टेबिलिटी / भाषा बाइंडिंग के लिए आदर्श है। मेरा सवाल है: क्यों?

क्या कोई व्यक्ति ठोस कारण प्रदान कर सकता है कि क्यों सी में पुस्तकालय लिखना अन्य भाषाओं में आसान बाइंडिंग और / या पोर्टेबिलिटी की अनुमति देता है?


6
ज्यादातर ऐतिहासिक और सामाजिक कारणों से। अधिकांश भाषा कार्यान्वयन और रनटाइम सिस्टम सी के ऊपर बनाए गए हैं। उदाहरण के लिए, Ocaml, SBCL, हास्केल रनटाइम को C में कोडित किया गया है (और C ++ में
दोबारा

8
व्यवहार में, इन रनटाइम्स में वास्तविक C ++ लाइब्रेरीज़ (Qt के बारे में सोचना) को देखना दर्दनाक है।
बेसिल स्टेयरनेविच

3
@ बैसिल: क्यूटी एक वास्तविक सी ++ लाइब्रेरी नहीं है। इसके अलावा, यहां तक ​​कि अधिक दर्दनाक पुस्तकालयों के लिए, यह केवल दर्दनाक है क्योंकि वे वास्तव में उपयोगी शब्दार्थ व्यक्त करते हैं।
डेडएमजी


2
डॉन बॉक्स द्वारा आवश्यक COM पढ़ें। यह C ++ में ABI बनाने की प्रक्रिया की व्याख्या करता है। COM Microsoft का ABI बनाने का तरीका था। यानी COM C ++ पुस्तकालयों का उपयोग C या VB या अन्य भाषाओं से किया जा सकता है।
user93353

जवाबों:


69

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

सी में, कोई मानक बाइनरी भाषा कार्यान्वयन नियम नहीं है, या तो, लेकिन यह परिमाण सरल का एक आदेश है और व्यवहार में कंपाइलर समान नियमों का उपयोग करते हैं। C ++ कोड को डीबग करने के लिए एक और कारण कठिन है उपर्युक्त जटिल व्याकरण, क्योंकि डिबगर अक्सर कई भाषा सुविधाओं (टेम्पलेट्स में पार्स पॉइंटर्स, डेटा डिस्प्ले विंडो में पार्स पॉइंटर कास्टिंग कमांड आदि) से निपट नहीं सकते हैं।

मानक ABI (एप्लिकेशन बाइनरी इंटरफ़ेस) की कमी का एक और परिणाम है - यह अन्य टीमों / ग्राहकों को अव्यवहारिक C ++ इंटरफेस बनाता है क्योंकि उपयोगकर्ता कोड तब तक काम नहीं करेगा जब तक कि यह एक ही टूल के साथ संकलित न हो और विकल्प का निर्माण न करें। हमने पहले ही इस समस्या का एक और स्रोत देखा है - संकलन समय की कमी के कारण बाइनरी इंटरफेस की अस्थिरता।

- दोषपूर्ण C ++


4
आपको ध्यान देना चाहिए, जबकि C ++ में कार्यान्वित सी- extern "C"
लाइक

5
C ++ ABI प्रश्न के संदर्भ में अप्रासंगिक है, जहाँ C ++ पुस्तकालयों के साथ आसानी से निर्यात किया जा सकता है extern "C"
डेडएमजी

12
@ झोमिनल: इसे C में लिखने से बहुत बेहतर है, जहाँ आपको C इंटरफ़ेस को परिभाषित करना है और फिर आपको इसे C में लागू करना है, जबकि C ++ में आप C इंटरफ़ेस को परिभाषित कर सकते हैं और फिर आपको इसे लागू करने की आवश्यकता नहीं है। यह सी में कोई फर्क नहीं पड़ता कि आप किस भाषा में लागू कर रहे हैं, आपको अभी भी सी इंटरफ़ेस को परिभाषित करना है- यह सी ++ में निश्चित रूप से सही है क्योंकि यह सी या किसी अन्य भाषा में है जो सी बाइंडिंग को उजागर कर सकता है।
डेडएमजी

9
क्या उस FQA ड्राइवल के लिंक से डिस्क्लेमर जोड़ना संभव होगा?
मार्टिन बा

2
@DocBrown: निश्चित रूप से मुझे लगता है जैसे सवाल सी भाषा बाइंडिंग बनाम सी ++ भाषा बाइंडिंग के बारे में है।
मेसन व्हीलर

32

यदि आप किसी अन्य भाषा के वक्ता के साथ संवाद करने की कोशिश कर रहे हैं, तो पीडगिन शेक्सपियर की अंग्रेजी की तुलना में आसान है।

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

सी ++ काफी सामान जोड़ता है - कक्षाएं, विरासत और vtables और एक्सेस संशोधक के साथ; अपवाद, स्टैक अनइंडिंग और नियंत्रण के प्रवाह को बदलने के साथ; टेम्पलेट्स। यह सब सी + + बाइंडिंग का उपयोग करने के लिए अन्य भाषाओं के लिए कठिन बनाता है: सबसे अच्छा, लागू करने के लिए अधिक "गोंद" या इंटरऑपरेबिलिटी कोड है, और सबसे खराब रूप से, अवधारणाएं सीधे अनुवाद नहीं करती हैं (वर्ग मॉडल में अंतर के कारण, अपवाद हैंडलिंग,) आदि।)। विशेष रूप से टेम्पलेट्स के लिए, बस (तत्काल) का उपयोग करके उन्हें आमतौर पर C ++ कंपाइलर के साथ एक संकलन कदम की आवश्यकता होती है, जो उन्हें अन्य वातावरणों से उपयोग करने में काफी जटिल हो जाती है।

उन सभी ने कहा, C ++ लाइब्रेरी से दूसरी भाषा में बाइंडिंग प्रदान करने की कठिनाई को समाप्त करना संभव है:

  • C ++ बाइंडिंग C के समान ही संगत हो सकती है, यदि आप इस पर काम करने के इच्छुक हैं। जैसा कि @DeadMG बताता है, C ++ समर्थन करता है extern "C", इसलिए आप C-++ लाइब्रेरी से सी-स्टाइल लैंग्वेज बाइंडिंग (सभी सरलता और C बाइंडिंग की अनुकूलता के साथ) निर्यात कर सकते हैं (सीमा के साथ कि आप किसी भी C ++ विशिष्ट कार्यक्षमता को उजागर नहीं कर सकते) ।
  • C ++ भाषा बाइंडिंग के लिए एक और आम आपत्ति C ++ के लिए ABI स्थिरता की कमी है, लेकिन यह बहुत अधिक है; C ++ ABI, C ABI की तुलना में कम मानकीकृत हैं, लेकिन मानक और वास्तविक तथ्य मौजूद हैं (इटेनियम C ++ ABI, जो OS X पर भी प्रयोग किया जाता है ; GCC का लिनक्स के लिए वास्तविक मानक )। विंडोज बदतर है, लेकिन यहां तक ​​कि विंडोज पर भी, एक दृश्य C ++ संस्करण में रहना ठीक काम करना चाहिए।

1
C ++ लाइब्रेरी से किसी अन्य भाषा में बाइंडिंग प्रदान करने के साथ दूसरा मुद्दा यह है कि दूसरी भाषा को C ( या, .NET / P / Invoke या Python) ctypes जैसी भाषाओं के लिए C. या C ++ ABI का उपयोग करने के लिए कोई उपकरण प्रदान नहीं कर सकता है ।
रैंडम 832

6
@ Random832: जो पूरी तरह से अप्रासंगिक है जब C ++ पक्ष केवल C इंटरफ़ेस की पेशकश कर सकता है। आपको C को बाइंड करने के लिए C में बाइंडिंग लागू करने की आवश्यकता नहीं है।
डेडएमजेड

21

C अभी भी आसपास की सबसे पुरानी भाषाओं में से एक है। इसका ABI सरल है, और वस्तुतः आज भी उपयोग में आने वाला प्रत्येक ऑपरेटिंग सिस्टम इसमें लिखा गया है । जबकि उन OS में से कुछ में C # /। NET या जो कुछ भी शीर्ष पर सामान जोड़ा जा सकता है, नीचे वे C में बहुत अधिक स्टैक्ड हैं।

इसका मतलब यह है कि, ओएस द्वारा प्रदान की गई कार्यक्षमता का उपयोग करने के लिए , लगभग हर प्रोग्रामिंग भाषा को वैसे भी सी पुस्तकालयों के साथ इंटरफेस करने की आवश्यकता थी । पर्ल, जावा, सी ++, वे सभी मूल रूप से , तरीके "बात सी 'के लिए प्रदान करते हैं, क्योंकि वे अगर वे हर एक पहिया है एक नए अंदाज़ में नहीं करना चाहता था के लिए था।

यह C लैटिन को प्रोग्रामिंग लैंग्वेज बनाता है। (उस रूपक से पहले कितने साल का इंटरनेट "प्रोगामिंग लैंग्वेज की अंग्रेजी" होना है?)


जब आप अपनी लाइब्रेरी को C में लिख रहे होते हैं, तो आपको मुफ्त (जाहिर है) के लिए C- संगत इंटरफ़ेस मिलता है। यदि आप अपनी लाइब्रेरी को C ++ में लिख रहे हैं, तो आप सी बाइंडिंग प्राप्त कर सकते हैं, extern "C"घोषणाओं के अनुसार।

हालाँकि , आप उन बाइंडिंग को केवल कार्यक्षमता के लिए प्राप्त कर सकते हैं जिन्हें C में व्यक्त किया जा सकता है

इसलिए आपकी लाइब्रेरी API का उपयोग नहीं कर सकती ...

  • टेम्पलेट्स,
  • कक्षाएं,
  • अपवाद हैं,
  • वस्तुओं को लेने या लौटाने का कोई कार्य ।

एक साधारण उदाहरण के लिए, आप अपने निर्यात कार्यों बनाने के लिए की आवश्यकता होगी लेने और वापसी सरणियों ( []) के बजाय std::vector(या std::stringउस बात के लिए)।

इसलिए, न केवल आप C ++ में अपनी लाइब्रेरी के ग्राहकों को प्रदान की जाने वाली अच्छी चीजों में से कोई भी प्रदान करने में असमर्थ होंगे, आपको C ++ से "C संगत" ( ) में अपनी लाइब्रेरी API का "अनुवाद" करने के लिए अतिरिक्त प्रयास करने होंगे extern "C"

इसलिए यह मुद्दा बनाया जा सकता है कि पुस्तकालय को लागू करने के लिए सी बेहतर विकल्प है। व्यक्तिगत रूप से, मुझे लगता है कि C ++ के लाभ अभी भी एक extern "C"एपीआई के लिए आवश्यक प्रयास को आगे बढ़ाते हैं, लेकिन यह सिर्फ मेरे लिए है।


लगता है कि Windows .NET के आसपास ही आधार बनाने की कोशिश कर रहा है, Android Java ( कुछ C के लिए कार्यान्वयन डिटेल के रूप में भी C ) पर आधारित है, और iOS / OSX ऑब्जेक्टिव-सी के आसपास आधारित हैं।
user253751

1
प्रोग्रामिंग दुनिया में अंग्रेजी पहले से ही प्रमुख भाषा है। अन्य व्यवसायों की तुलना में अधिक प्रभावी।
सियान रेन

3
@ मिनीबिस: विंडोज, लिनक्स / एंड्रॉइड, और बीएसडी / ओएसएक्स सभी सी में लिखे गए गुठली हैं, जिसमें (और) सी के लिए लिखे गए इंटरफेस के साथ कोई फर्क नहीं पड़ता कि उसके ऊपर क्या बनाया गया है, जावा को जेएनआई की जरूरत है, पर्ल को सी कॉल की जरूरत है। NET को C कॉल्स की जरूरत है, Python को C कॉल्स की जरूरत है, Objective-C को C कॉल्स की जरूरत है। उन लोगों में से किसी को C ++ कॉल की आवश्यकता नहीं है , जो वह बिंदु है जिसे मैं बनाने की कोशिश कर रहा था।
देवसोलर

@DevSolar एंड्रॉइड का बहुत सारा सामान जावा में मूल रूप से लिखा गया है और यह जेएनआई का उपयोग नहीं करता है (आप इसे सी से जावा कोड को कॉल करने के लिए "बैकवर्ड" का उपयोग कर सकते हैं, लेकिन यह सिर्फ पुष्टि करता है कि यह मूल रूप से जावा है)। IOS / OSX के साथ कोई अनुभव नहीं है, लेकिन मैंने सुना है कि उद्देश्य-सी के साथ समान हैं।
user253751

3
@ मिनीबिस: लेकिन क्या आप जानते हैं कि ओएस कर्नेल और उसके उपयोक्ता के बीच का अंतर है, है ना? मुझे गंभीरता से संदेह है कि ज्यादातर जावा यूजरस्पेस एंड्रॉइड को मेरे डेस्कटॉप पर चलने वाले लिनक्स कर्नेल की तुलना में सी-स्टाइल सिस्टम कॉल के साथ लिनक्स लिनक्स कर्नेल बनाता है। मुझे यह भी संदेह है कि वे कर्नेल में या मिडलवेयर में जावा का उपयोग कर रहे हैं। वास्तव में, मुझे पता है कि वे सी का उपयोग कर रहे हैं। यह मुर्गी और अंडे की समस्या है, बस दूसरे तरीके से। यह सी में पहले किया गया है, और इस तरह यह अभी भी सी में ऐसा करने के लिए बहुत आसान है
DevSolar

6

पहले से उपलब्ध कराए गए अन्य उत्तरों का विवरण छोड़कर:

इतनी सारी भाषाएं C बाइंडिंग प्रदान करती हैं, यह है कि सभी * nix और Windows ऑपरेटिंग सिस्टम C इंटरफ़ेस के माध्यम से अपने OS API का अधिकांश भाग उजागर करते हैं। इसलिए भाषा के कार्यान्वयन को पहले से ही सी के साथ इंटरफेस करने की आवश्यकता है जो प्रमुख ओसेस पर चलने में सक्षम हो। इसलिए, यह सीधे भाषा से किसी भी सी इंटरफ़ेस के साथ सीधे संवाद करने की पेशकश करने के लिए सीधा है।


5

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

यह वास्तव में उबलता है कि वे लोग हैं जो नई भाषाओं या विचारों को सीखना नहीं चाहते हैं जो वास्तव में उपयोगी शब्दार्थ या विशेषताएं हैं जो डायनासोर युग में रहने के लिए किसी भी कारण को लेने के लिए सख्त कोशिश कर रहे हैं।


4
मुझे लगता है कि आप सही हैं और डाउनवोटर्स प्रश्न को गलत समझते हैं, लेकिन वास्तव में आपका जवाब उस संभावित गलतफहमी को उजागर करने से चूक जाता है: सवाल "सी इंटरफेस वाली लाइब्रेरी" बनाम "सी ++ इंटरफेस वाली लाइब्रेरी" के बारे में नहीं है, इसके बारे में है। "एक पुस्तकालय पूरी तरह से सी" बनाम "एक पुस्तकालय जिसमें सी + + में लिखा सी इंटरफ़ेस है"।
डॉक्टर ब्राउन

@ स्नोमैन: समस्याग्रस्त सी ++ बाइंडिंग का सी बाइंडिंग को उजागर करने में किसी भी समस्या से कोई लेना-देना नहीं है।
डेडएमजी

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

2
@prosfilaes: अपवादों को रिटर्न कोड में बदलना तुच्छ है। आपको कक्षाओं का उपयोग करने से बचने की आवश्यकता नहीं है क्योंकि इन्हें आसानी से C API में उतारा जा सकता है और आपको अपने कार्यान्वयन में टेम्प्लेट का उपयोग करने से बचने की आवश्यकता नहीं है। और आपके उपयोगकर्ताओं को C ++ ABI झड़पों के बारे में बताने की आवश्यकता नहीं है जब तक कि वे स्रोत से निर्माण नहीं कर रहे हों, उस स्थिति में, आपको स्रोत भाषा से निपटना होगा चाहे वह कोई भी हो।
डेडएमजी

4
मैंने नीचे नहीं लिखा क्योंकि किसी को C ++ में C API के साथ लाइब्रेरी लिखना नहीं चाहिए, लेकिन क्योंकि डायनासोर होने के अलावा C का उपयोग करने के अच्छे कारण हैं। यदि आप भाषा X में API के लिए लिख रहे हैं, तो मान लीजिए कि C, FORTRAN, COBOL, BLISS, या Java हमेशा ऐसा समय होता है, जहां यह उस भाषा में लिखने के लिए सरल, आसान और अधिक सही होने वाला होता है, फिर किसी प्रशंसक में लिखने के लिए , और अधिक मजेदार भाषा और इंटरफ़ेस दो।
अभियोजन पक्ष

2

किसी अन्य भाषा के साथ अंतर करने पर दो प्रमुख अक्ष होते हैं:

  • अवधारणाओं कि इंटरफ़ेस पर ले जा सकते हैं: सिर्फ मूल्यों? संदर्भ? जेनरिक?
  • इंटरफ़ेस "बायनेरिज़" में कैसे लागू होता है (जिसे ABI कहा जाता है)

C का उन दो मोर्चों पर C ++ से अधिक लाभ है:

  • सी में केवल ज्यादातर सरल अवधारणाएं हैं, जो कि हर दूसरी भाषा में दिखाई देती हैं 1
  • C बायनेरिज़ का ABI OS 2 द्वारा तय किया जाता है

अब, अधिकांश भाषाओं में अवधारणाओं का एक समान सेट क्यों होता है , C की तुलना में यह "सरल" या "पूर्व-विद्यमान" होने के कारण हो सकता है; हालांकि इससे कोई फर्क नहीं पड़ता, बात यह है कि वे करते हैं।

इसके विपरीत, C ++ में जटिल अवधारणाएँ हैं, और प्रत्येक कंपाइलर द्वारा ABI का निर्णय लिया जाता है (हालाँकि, Windows पर छोड़कर, इटानियम ABI के कई पालन करता है)। वास्तव में इस मुद्दे को आंशिक रूप से संबोधित करने के लिए OSes को C ++ ABI (प्रति OS आधार पर) ठीक करने के लिए हर्ब सटर द्वारा एक प्रस्ताव था। इसके अलावा, एक को ध्यान देना चाहिए कि C ++ FFI संभव है, D इसे 3 का प्रयास कर रहा है ।

1 वेराडिक्स ( ...) को छोड़कर , वे सरल नहीं हैं

2 C में एक मानक ABI है?

3 इंटरफैडिंग डी को लिगेसी सी ++ कोड


0

मौलिक रूप से यह एबीआई मानकीकरण के लिए नीचे आता है। जबकि न तो C और न ही C ++ में एक मानकीकृत ABI है जिसे अन्य भाषाएं लिखित बायनेरिज़ के बीच इंटरफेस का उपयोग कर सकती हैं, C एक वास्तविक तथ्य बन गया है, हर कोई इसे जानता है और बाकी सभी उसी, सरल, नियमों का उपयोग कर सकते हैं जो भाषा के संबंध में है प्रकार और फ़ंक्शन कॉल।

C ++ में एक मानक ABI हो सकता है, लेकिन Stroustrup ने कहा है कि वह एक की आवश्यकता नहीं देखता है। उन्होंने यह भी कहा कि संकलक लेखकों से आम सहमति प्राप्त करना मुश्किल होगा (हालांकि मुझे संदेह है कि - सी ++ मानक समिति मौजूदा लोगों के समान एक एबीआई जारी करेगी और संकलक लेखक बस अपने संकलक के अगले संस्करण को बदल देंगे, जो कभी-कभी बायनेरिज़ के साथ असंगत होते हैं। वैसे भी उनके संकलक के पुराने संस्करणों के साथ बनाया गया - मुझे याद है कि नए सूर्य संकलक के साथ पुस्तकालयों के एक जोड़े को फिर से जोड़ना और वे पुराने लोगों के साथ काम करने में विफल रहे)

आप ध्यान देंगे कि कुछ कंपनियों ने एक मानक ABI का उपयोग करने के लिए स्थानांतरित कर दिया है, Microsoft ने यह प्रक्रिया COM तरीके से 90 के दशक में शुरू की थी, और आज उन्होंने इसे WinRT ABI में परिशोधित किया है (जो अन्य WinRT के साथ भ्रमित नहीं है) एक प्रकार की टेबल OS) जो C # में लिखे प्रोग्राम को C या C ++ में लिखी गई लाइब्रेरी से संवाद करने की अनुमति देती है (यानी Microsoft की अपनी OS लेयर C ++ में लिखी गई है, WinRT का उपयोग करके और C # एप्लिकेशन द्वारा उपभोग किया जाता है जब वे किसी भी OS रनिंग रूटीन को कॉल करते हैं)

जब तक कोई मानक निकाय इस स्थिति को ठीक नहीं कर लेता, तब तक कोई भी ऐसा नहीं कर सकता है। Microsoft स्पष्ट रूप से इसमें मूल्य देखता है और इसे अपने मंच के लिए हल करने के लिए कदम उठाया है।

तो जवाब वास्तव में है सी भाषा बाँध प्रदान नहीं करता है । ऐसा होता है कि किसी ने भी उनकी बात नहीं मानी और उनका उपभोग किया।


-2

सभी उत्तर वास्तविक समस्या से कम हो जाते हैं: C ++ संकलन "नाम की शिथिलता" का परिचय देता है, इसलिए बायनेरिज़ "सरल" फ़ंक्शन कॉल के साथ असंगत हैं।

सभी ABI सामान इसे मानकीकृत करने के प्रयास से थोड़ा अधिक है।

सामान्य तौर पर यह गारंटी नहीं है कि आप विभिन्न संकलक के साथ संकलित कार्यों को पार कर सकते हैं, भले ही आप सादे सी ++ से चिपके हों। पूर्व में यह सुनिश्चित था कि वे असंगत थे, लेकिन आजकल मानकीकरण में कमी हो रही है;)

OTOH C को "उच्च स्तरीय असेंबली" के रूप में डिजाइन किया गया था और सभी प्रकार के आसान इंटरफेस की अनुमति देता है। यह आश्चर्यचकित नहीं होना चाहिए कि यह क्रॉस-लैंग्वेज पसंद करने के लिए बेहतर है।

साइड नोट: मूल C ++ कंपाइलर (cfront) वास्तव में C स्रोत का निर्माण किया गया था जिसे संकलित किया जाना था, बिल्कुल gcc की तरह जो "हुड के नीचे असेंबली" का निर्माण करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.