सी ++: बाइनरी स्तर पर मानकीकरण का अभाव


14

बाइनरी स्तर पर ISO / ANSI ने C ++ को मानकीकृत क्यों नहीं किया? सी ++ के साथ कई पोर्टेबिलिटी मुद्दे हैं, जो केवल द्विआधारी स्तर पर मानकीकरण की कमी के कारण है।

डॉन बॉक्स लिखते हैं, (अपनी पुस्तक एसेंशियल कॉम , अध्याय COM एज़ ए बेटर सी ++ से उद्धृत )

C ++ और पोर्टेबिलिटी


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

क्या बाइनरी मानकीकरण की इस कमी के अधिक लाभ या नुकसान हैं?


क्या यह प्रोग्रामर्स.स्टैकएक्सचेंज डॉट कॉम पर बेहतर तरीके से पूछा गया है , यह देखते हुए कि यह एक व्यक्तिपरक सवाल कैसे है?
स्टीफन फुरलानी

1
मेरा वास्तव में संबंधित प्रश्न: stackoverflow.com/questions/2083060/…
अर्क

4
डॉन बॉक्स एक जाइलॉट है। उसकी ओर ध्यान मत दो।
जॉन डिब्लिंग

8
खैर, बाइनरी स्तर में एएनएसआई / आईएसओ द्वारा सी को मानकीकृत नहीं किया गया है; OTOH C में de jure one के बजाय एक वास्तविक मानक ABI है । C ++ में ऐसा मानकीकृत ABI नहीं है क्योंकि विभिन्न निर्माताओं के पास उनके कार्यान्वयन के साथ अलग-अलग लक्ष्य थे। उदाहरण के लिए, Windows SEH के शीर्ष पर VC ++ पिग्गबैक में अपवाद। POSIX का कोई SEH नहीं है और इसलिए उस मॉडल को लेने का कोई मतलब नहीं होता (इसलिए G ++ और MinGW उस मॉडल का उपयोग नहीं करते)।
बिली ओनेल

3
मैं इसे एक कमजोरी नहीं एक विशेषता के रूप में देखता हूं। यदि आप किसी विशिष्ट ABI के लिए एक कार्यान्वयन को बाँधते हैं तो हमारे पास कभी भी नवाचार नहीं होगा और नया हार्डवेयर भाषा के डिजाइन के लिए बाध्य होगा (और चूंकि प्रत्येक नए संस्करण के बीच 15 साल है जो हार्डवेयर उद्योग में एक लंबा समय है) और stifling द्वारा कोड को और अधिक कुशलता से निष्पादित करने के लिए नए विचारों को नया बनाना होगा। मूल्य यह है कि एक निष्पादन योग्य में सभी कोड एक ही संकलक / संस्करण (एक समस्या लेकिन एक प्रमुख नहीं) द्वारा बनाया जाना चाहिए।

जवाबों:


16

द्विआधारी-संगत संकलित रूप वाली भाषाएँ अपेक्षाकृत नया चरण [*] हैं, उदाहरण के लिए जेवीएम और .NET रनटाइम। C और C ++ कंपाइलर आमतौर पर देशी कोड का उत्सर्जन करते हैं।

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

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

यहां तक ​​कि अगर आपको वह मिलता है, तो दो निष्पादकों को एक साथ जोड़ना वास्तव में केवल तब तक सही ढंग से काम करेगा जब तक: (क) आप एक परिभाषा नियम का उल्लंघन नहीं करते हैं, जो कि अलग-अलग संकलक / विकल्प / जो भी हो, के साथ संकलित करना आसान है ऐसे कि वे एक ही वर्ग की विभिन्न परिभाषाओं का उपयोग कर रहे थे (या तो हेडर में, या क्योंकि वे प्रत्येक सांख्यिकीय रूप से अलग-अलग कार्यान्वयन के खिलाफ जुड़े हुए हैं); और (बी) सभी प्रासंगिक कार्यान्वयन विवरण जैसे संरचना लेआउट बल में संकलक विकल्पों के अनुसार समान हैं जब प्रत्येक को संकलित किया गया था।

C ++ मानक के लिए यह सब परिभाषित करने के लिए कार्यान्वयनकर्ताओं के लिए वर्तमान में उपलब्ध बहुत सारी स्वतंत्रता को हटा देगा। कार्यान्वयनकर्ता उन फ्रीडम का उपयोग कर रहे हैं , खासकर जब सी ++ (और सी, जिसमें एक ही मुद्दा है) में बहुत कम-स्तरीय कोड लिखते हैं।

यदि आप बाइनरी-पोर्टेबल लक्ष्य के लिए C ++ की तरह दिखने वाले कुछ लिखना चाहते हैं, तो C ++ / CLI है, जो .NET, और मोनो को लक्षित करता है ताकि आप (उम्मीद है) विंडोज़ की तुलना में .NET कहीं और चला सकें। मुझे लगता है कि एमएस के कंपाइलर को शुद्ध सीआईएल असेंबली बनाने के लिए राजी करना संभव है जो मोनो पर चलेगा।

संभावित रूप से ऐसी चीजें भी हैं जो उदाहरण के लिए एलएलवीएम के साथ बाइनरी-पोर्टेबल सी या सी ++ वातावरण बनाने के लिए की जा सकती हैं। मैं नहीं जानता कि कोई भी व्यापक उदाहरण सामने आया है, हालांकि।

लेकिन ये सभी बहुत सारी चीजों को ठीक करने पर निर्भर करते हैं जो C ++ कार्यान्वयन-निर्भर बनाता है (जैसे कि आकार के प्रकार)। फिर पोर्टेबल बायनेरिज़ को समझने वाला वातावरण, उस सिस्टम पर उपलब्ध होना चाहिए जहाँ कोड चलाना है। गैर-पोर्टेबल बायनेरिज़ की अनुमति देकर, C और C ++ उन स्थानों पर जा सकते हैं जहां पोर्टेबल बायनेरी नहीं हो सकते हैं, और यही कारण है कि मानक बायनेरिज़ के बारे में कुछ भी नहीं कहते हैं।

तो फिर किसी भी मंच पर, कार्यान्वयन आमतौर पर अभी भी विकल्प के विभिन्न सेट के बीच दोहरी संगतता, प्रदान नहीं हालांकि मानक उन्हें रोक नहीं है है। यदि डॉन बॉक्स को यह पसंद नहीं है कि कंपाइलर विकल्पों के अनुसार, Microsoft के कंपाइलर उसी स्रोत से असंगत बायनेरिज़ का उत्पादन कर सकते हैं, तो यह कंपाइलर टीम है जिसे उसे शिकायत करने की आवश्यकता है। C ++ लैंग्वेज में कंपाइलर या OS को सभी आवश्यक विवरणों को पिन करने से मना नहीं किया जाता है, इसलिए एक बार जब आप अपने आप को विंडोज तक सीमित कर लेते हैं तो यह C ++ के साथ मौलिक समस्या नहीं है। माइक्रोसॉफ्ट है चुना ऐसा करने के लिए नहीं।

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

[*] मुझे यकीन नहीं है कि इस विचार का आविष्कार पहली बार हुआ था, शायद १६४२ या कुछ और, लेकिन उनकी वर्तमान लोकप्रियता अपेक्षाकृत नई है, उस समय की तुलना में जब C ++ डिजाइन निर्णयों के लिए प्रतिबद्ध है जो बाइनरी-पोर्टेबिलिटी को परिभाषित करने से रोकते हैं।


@Steve लेकिन C में i386 और AMD64 पर एक अच्छी तरह से परिभाषित ABI है, इसलिए मैं GCC संस्करण X द्वारा संकलित एक फ़ंक्शन को MSVC संस्करण Y द्वारा संकलित एक फ़ंक्शन के लिए एक सूचक पास कर सकता हूं। ऐसा करना कि C ++ फ़ंक्शन के साथ असंभव है।
user877329

7

क्रॉस-प्लेटफॉर्म और क्रॉस-कंपाइलर संगतता सी और सी ++ के पीछे प्राथमिक लक्ष्य नहीं थे। वे एक युग में पैदा हुए थे, और उन उद्देश्यों के लिए थे जिनके लिए समय और स्थान के प्लेटफॉर्म-विशिष्ट और संकलक-विशिष्ट न्यूनतम महत्वपूर्ण थे।

स्ट्रॉस्ट्रुप की "द डिजाइन एंड एवोल्यूशन ऑफ सी ++" से:

"स्पष्ट उद्देश्य रन-टाइम, कोड कॉम्पैक्टनेस और डेटा कॉम्पैक्टनेस के संदर्भ में सी से मेल खाना था। ... आदर्श - जो हासिल किया गया था - यह था कि सी के साथ जो भी सी के लिए इस्तेमाल किया जा सकता था, सी का उपयोग किया जा सकता था।"


1
+1 - बिल्कुल। कैसे एक मानक ABI का निर्माण होगा जो ARM और Intel दोनों बक्सों पर काम करता है? मतलब नहीं होगा!
बिली ओनेल

1
दुर्भाग्य से, यह इसमें विफल रहा। आप वह सब कुछ कर सकते हैं जो C करता है ... रनटाइम के दौरान गतिशील रूप से C ++ मॉड्यूल को छोड़कर। आपको उजागर इंटरफ़ेस में C फ़ंक्शंस का उपयोग करने के लिए 'रिवर्ट' करना होगा।
gbjbaanb

6

यह एक बग नहीं है, यह एक सुविधा है! यह कार्यान्वयनकर्ताओं को बाइनरी स्तर पर उनके कार्यान्वयन का अनुकूलन करने की स्वतंत्रता देता है। छोटे एंडियन i386 और इसके वंश केवल सीपीयू नहीं हैं जो मौजूद हैं या मौजूद हैं।


6

उद्धरण में वर्णित समस्या प्रतीक-नाम की मैन्बलिंग योजनाओं के मानकीकरण से काफी जानबूझकर बचने के कारण होती है (मुझे लगता है कि " बाइनरी स्तर पर मानकीकरण " इस संबंध में एक भ्रामक वाक्यांश है, हालांकि यह मुद्दा एक संकलक के आवेदन बाइनरी इंटरफेस से संबंधित है ) एबीआई)।

C ++ एक फ़ंक्शन या डेटा ऑब्जेक्ट के हस्ताक्षर और प्रकार की जानकारी को एन्कोड करता है, और इसके वर्ग / नामस्थान सदस्यता को प्रतीक-नाम में, और विभिन्न कंपाइलरों को विभिन्न योजनाओं का उपयोग करने की अनुमति है। नतीजतन, एक स्थिर पुस्तकालय, DLL या ऑब्जेक्ट फ़ाइल में एक प्रतीक एक अलग संकलक (या संभवतः एक ही संकलक के एक अलग संस्करण) का उपयोग करके संकलित कोड के साथ लिंक नहीं करेगा।

इस मुद्दे का वर्णन किया गया है और समझाया गया है कि शायद मैं यहां से बेहतर हूं , विभिन्न कंपाइलरों द्वारा उपयोग की जाने वाली योजनाओं के उदाहरणों के साथ।

मानकीकरण की जानबूझकर कमी के कारणों को भी यहाँ समझाया गया है


3

आईएसओ / एएनएसआई का उद्देश्य सी ++ भाषा का मानकीकरण करना था, यह मुद्दा ऐसा लगता है कि भाषा के मानकों और संकलक समर्थन का अद्यतन करने के लिए वर्षों की आवश्यकता के लिए पर्याप्त जटिल हो ।

द्विआधारी संगतता बहुत अधिक जटिल है, यह देखते हुए कि बायनेरिज़ को विभिन्न सीपीयू के आर्किटेक्चर और विभिन्न ओएस वातावरणों पर चलने की आवश्यकता है।


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

@ क्लिफोर्ड: नाम प्रबंधन योजना बाइनरी स्तर की संगतता का एक सबसेट है। उत्तरार्द्ध एक छाता शब्द की तरह अधिक है!
नवाज

मुझे संदेह है कि विंडोज़ मशीन पर लिनक्स बाइनरी को चलाने की कोशिश करने में समस्या है। यदि कोई ABI प्रति-प्लेटफ़ॉर्म होता, तो चीजें बहुत बेहतर होतीं, क्योंकि कम से कम एक स्क्रिप्ट भाषा गतिशील रूप से एक ही प्लेटफ़ॉर्म पर बाइनरी को लोड और चला सकती थी, या ऐप अलग कंपाइलर के साथ निर्मित घटकों का उपयोग कर सकते थे। आज आप linux पर C dll का उपयोग नहीं कर सकते हैं, और कोई भी शिकायत नहीं करता है, लेकिन सी dll को अभी भी एक अजगर ऐप द्वारा लोड किया जा सकता है जो कि लाभ अर्जित करता है।
gbjbaanb

2

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

सी अनुकूलता भी महत्वपूर्ण थी और इससे काफी जटिल होगा।

कार्यान्वयन के सबसेट के लिए ABI को मानकीकृत करने के लिए बाद में कुछ प्रयास किए गए हैं ।


डार, मैं सी संगतता भूल गया। अच्छी बात, +1!
एंडी थॉमस

1

मुझे लगता है कि सी ++ के लिए एक मानक की कमी आज की दुनिया में डी-कपल, मॉड्यूलर प्रोग्रामिंग की समस्या है। हालांकि, हमें यह परिभाषित करना होगा कि हम इस तरह के मानक से क्या चाहते हैं।

उनके दाहिने दिमाग में कोई भी एक बाइनरी के लिए कार्यान्वयन या मंच को परिभाषित नहीं करना चाहता है। इसलिए आप x86 विंडोज dll नहीं ले सकते हैं और x86_64 लिनक्स प्लेटफॉर्म पर इसका उपयोग शुरू कर सकते हैं। वह थोड़ा बहुत होगा।

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

इसलिए यदि मानक निकाय परिभाषित करता है कि इंटरफ़ेस किस मॉड्यूल को उजागर करता है, तो हमारे पास C ++ मॉड्यूल लोड करने में बहुत अधिक लचीलापन होगा, हमें C ++ कोड को C कोड के रूप में उजागर नहीं करना होगा, और हमें संभवतः बहुत अधिक उपयोग करना होगा स्क्रिप्ट भाषाओं में C ++ का।

हमें COM जैसी चीजों को भी नहीं झेलना पड़ेगा जो इस समस्या का समाधान प्रदान करने का प्रयास करती है।


1
+1। हाँ मै सह्मत हूँ। यहाँ अन्य उत्तर मूल रूप से यह कहकर समस्या को दूर कर देते हैं कि बाइनरी मानकीकरण वास्तुकला-विशिष्ट अनुकूलन को रोक देगा। लेकिन वह बात नहीं है। कोई भी कुछ क्रॉस-प्लेटफॉर्म बाइनरी निष्पादन योग्य प्रारूप के लिए बहस नहीं कर रहा है। समस्या यह है कि गतिशील रूप से C ++ मॉड्यूल को लोड करने के लिए कोई मानक इंटरफ़ेस नहीं है ।
चार्ल्स साल्विया

1

सी ++ के साथ कई पोर्टेबिलिटी मुद्दे हैं, जो केवल द्विआधारी स्तर पर मानकीकरण की कमी के कारण है।

मुझे नहीं लगता कि यह काफी सरल है। प्रदान किए गए जवाब पहले से ही मानकीकरण पर ध्यान केंद्रित करने की कमी के रूप में उत्कृष्ट तर्क प्रदान करते हैं, लेकिन C ++ एक एबीआई मानक के रूप में सी के साथ अच्छी तरह से प्रतिस्पर्धा करने के लिए एक भाषा के लिए बहुत समृद्ध हो सकता है

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

लेकिन एक ABI मानक केवल एक संकलक में निर्मित C ++ dylibs बनाने के बारे में नहीं है, जो एक अलग संकलक द्वारा निर्मित दूसरे बाइनरी द्वारा उपयोग किए जाने में सक्षम है। ABI का उपयोग क्रॉस-लैंग्वेज में किया जाता है । यह अच्छा होगा यदि वे कम से कम पहले भाग को कवर कर सकते हैं, लेकिन ऐसा कोई तरीका नहीं है कि मैं सी ++ को कभी भी वास्तव में सी के साथ प्रतिस्पर्धा कर पाऊं जो सार्वभौमिक एबीआई स्तर की सबसे व्यापक रूप से-संगत dylibs बनाने के लिए बहुत महत्वपूर्ण है।

इस तरह निर्यात किए गए कार्यों की एक सरल जोड़ी की कल्पना करें:

void f(Foo foo);
void f(Bar bar, int val);

... और कल्पना कीजिए Fooऔर Barश्रेणीबद्ध कन्स्ट्रक्टरों के साथ वर्ग थे, रचनाकारों की प्रतिलिपि बनाएँ, कंस्ट्रक्टरों को स्थानांतरित करें, और गैर-तुच्छ विध्वंसक।

फिर एक पायथन / लुआ / सी # / जावा / हास्केल / आदि का परिदृश्य लें। डेवलपर इस मॉड्यूल को आयात करने और इसे अपनी भाषा में उपयोग करने की कोशिश कर रहा है।

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

लेकिन अब एक कठिन परिदृश्य। उदाहरण के लिए, पायथन डेवलपर कैसे चलता है, बिल्ड कंस्ट्रक्टर्स, कॉपी कंस्ट्रक्टर्स और डिस्ट्रक्टर्स को स्थानांतरित करता है? शायद हम dylib के हिस्से के रूप में निर्यात कर सकते हैं। लेकिन क्या होगा Fooऔर अगर Barविभिन्न मॉड्यूल में निर्यात किया जाता है? क्या हमें इस dylib में जुड़े प्रतीकों और कार्यान्वयनों की नकल करनी चाहिए या नहीं? मेरा सुझाव है कि हम ऐसा करते हैं, क्योंकि यह वास्तव में बहुत तेजी से कष्टप्रद हो सकता है अन्यथा केवल एक वस्तु बनाने के लिए कई dylib इंटरफेस में उलझ जाना शुरू हो सकता है, इसे यहां पास करें, एक को कॉपी करें, यहां इसे नष्ट करें। जबकि एक ही मूल चिंता कुछ हद तक सी (बस अधिक मैन्युअल रूप से / स्पष्ट रूप से) में लागू हो सकती है, सी केवल इस तरह से लोगों के साथ कार्यक्रम करने की प्रकृति से बचने के लिए जाता है।

यह अजीबता का सिर्फ एक छोटा सा नमूना है। क्या होता है जब fऊपर दिए गए फंक्शन्स में से कोई एक BazException(जावास्क्रिप्ट के साथ एक C ++ क्लास भी कंस्ट्रक्टर्स और डिस्ट्रक्टर्स और व्युत्पन्न std :: अपवाद) के रूप में फेंकता है ?

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

सुझाया हुआ समाधान

COM- शैली इंटरफेस के साथ सालों से API / ABI के लिए C ++ इंटरफेस का उपयोग करने के तरीके खोजने के लिए संघर्ष करने के बाद मेरा सुझाया गया समाधान सिर्फ "C / C ++" (सज़ा) डेवलपर बनना है।

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

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

अजगर ग्राहक सीधे सी या सी ++ इंटरफ़ेस का उपयोग नहीं करना चाहेंगे क्योंकि उन अजगर को बनाने का कोई तरीका नहीं है। वे इसे अपने पाइथनिक इंटरफेस में लपेटना चाहते हैं, इसलिए यह वास्तव में एक अच्छी बात है कि हम नंगे न्यूनतम सी एपीआई / एबीआई का निर्यात कर रहे हैं ताकि यह यथासंभव आसान हो सके।

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


1
"कार्यान्वयन के लिए C ++ के साथ उन सार्वभौमिक ABI को बनाने के लिए C का उपयोग करें।" ... मैं वही करता हूं, जैसे कई अन्य!
नवाज

-1

मुझे नहीं पता कि यह बाइनरी स्तर पर मानकीकृत क्यों नहीं है। लेकिन मुझे पता है कि मैं इसके बारे में क्या करता हूं। विंडोज पर मैं फंक्शन एक्सटर्नल "C" BOOL WINAPI घोषित करता हूं। (बेशक जो भी प्रकार है समारोह के साथ BOOL की जगह।) और वे साफ निर्यात कर रहे हैं।


2
लेकिन अगर आप इसे घोषित करते हैं extern "C", तो यह सी एबीआई का उपयोग करेगा, जो सामान्य पीसी हार्डवेयर पर एक वास्तविक मानक है, भले ही इसे किसी भी प्रकार की समिति द्वारा लागू नहीं किया गया हो।
बिली ओनेल

-3

unzip foo.zip && make foo.exe && foo.exeयदि आप अपने स्रोत की पोर्टेबिलिटी चाहते हैं तो उपयोग करें ।

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