एकल निष्पादन योग्य विकसित करते समय विभिन्न सी ++ संकलक और भाषा संस्करणों का उपयोग करना


15

हमारी कंपनी उपग्रह संचार के लिए स्रोत कोड का एक बड़ा और बहुत जटिल टुकड़ा खरीदेगी।

यह C ++ में कोडित है और हम इसे C ++ में भी जोड़ देंगे, हमारे कोड को खरीदे गए कोड के साथ एक एकल निष्पादन योग्य इकाई में जोड़ देंगे।

  • क्या यह आवश्यक है कि हम उसी संकलक और उसी संकलक संस्करण का उपयोग करें जिसका उपयोग खरीदे गए कोड को विकसित करने के लिए किया गया था?

  • क्या यह आवश्यक है कि हम खरीदे गए कोड के समान C ++ के संस्करण का उपयोग करें? यदि यह 2014 का उपयोग नहीं कर रहा है, तो हम _might_ इसकी कुछ विशेषताओं का उपयोग करना चाहते हैं, लेकिन नहीं अगर विभिन्न संस्करणों के मिश्रण के साथ कुछ समस्याएं हो सकती हैं।

सिद्धांत रूप में, निश्चित रूप से, यह विशेष रूप से भाषा संस्करण के लिए महत्वपूर्ण नहीं है, लेकिन यह समझ में नहीं आता है कि संकलक के विभिन्न संस्करण अलग-अलग ऑब्जेक्ट कोड, संभवतः समय के अंतर के लिए अग्रणी आदि उत्पन्न करेंगे।

हमें किस बारे में पता होना चाहिए?


7
मुझे आशा है कि आप न केवल स्रोत कोड खरीद रहे हैं, लेकिन इस पर कुछ (योग्य व्यक्तियों द्वारा) समर्थन करते हैं।
बेसाइल स्टारीनेवविच

1
वास्तव में, हम हैं। और, ज़ाहिर है, मैंने आपूर्तिकर्ता के इस प्रश्न को भी पूछा है। लेकिन मैंने सोचा कि यह यहाँ एक अच्छा चर्चा बिंदु होगा, और भविष्य में दूसरों के लिए एक अच्छा भविष्य संदर्भ होगा।
मावग का कहना है कि मोनिका

2
क्या आप किसी असमर्थित संकलक का उपयोग करके तीसरे पक्ष के कोड को संकलित करने के बारे में बात कर रहे हैं, या आप विभिन्न संकलक का उपयोग करके कोड के विभिन्न भागों को संकलित करने के बारे में बात कर रहे हैं (जैसे कि आपके द्वारा खरीदे गए कोड के लिए समर्थित एक का उपयोग करना और अपने स्वयं के कोड के लिए एक नया और फिर उन्हें जोड़ने)? या सवाल के उन हिस्सों के बीच निर्णय ले रहा है?
jpmc26

3
यहां तक ​​कि भाषा संस्करण भी मायने रख सकता है, ABI में (पुराने) संकलक संस्करणों और छोटे अंतरों की सूची के लिए gcc.gnu.org/wiki/Cxx11AbiCompatibility देखें । दूसरे शब्दों में: समान संकलक, लेकिन विभिन्न c ++ भाषा सेटिंग (c ++ 03 s c ++ 11) मायने रख सकती है।
एंड्रे

2
और MSVC के साथ, मानक लाइब्रेरी ऑब्जेक्ट्स (डायनामिक) लाइब्रेरी सीमाओं के पार से गुजरना सामान्य रूप से सुरक्षित नहीं है। उदाहरण के लिए देखें stackoverflow.com/q/5661738/417197
André

जवाबों:


9

क्या यह आवश्यक है कि हम उसी संकलक और उसी संकलक संस्करण का उपयोग करें जिसका उपयोग खरीदे गए कोड को विकसित करने के लिए किया गया था?

निर्भर करता है।

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

फिर मानक पुस्तकालय का मुद्दा है। संकलक (या एक ही संकलक के विभिन्न संस्करण) स्वयं एक ही ABI का उपयोग कर सकते हैं, और फिर भी उनका मानक पुस्तकालय असंगत हो सकता है (और कुछ संकलक जैसे cl ++ ++ कई मानक पुस्तकालयों के साथ प्रयोग करने योग्य हो सकता है)। यह काम करने में सक्षम होने के कारण इंटरफ़ेस में उपयोग किए जाने वाले पर निर्भर हो सकता है।

दूसरे शब्दों में, आपको उस विशिष्ट मामले के लिए जानकारी खोदना और ढूंढना होगा जो आप में हैं। एक शुरुआती बिंदु और उदाहरण के लिए कि आपको किस तरह की जानकारी देखनी चाहिए, यहां libstdc ++ (g ++ द्वारा उपयोग की गई लाइब्रेरी) द्वारा दी गई जानकारी है और क्लैंग ++ द्वारा कुछ विन्यास में)


10
ABI = एप्लीकेशन बाइनरी इंटरफ़ेस
साइमन बी

2
यह उत्तर ऑब्जेक्ट कोड की संगतता के बारे में है। ओपी सोर्स कोड खरीद रहा है ।
मोनिका

7
@LightnessRacesinOrbit प्रश्न एक एकल निष्पादन योग्य उत्पन्न करने के लिए विभिन्न संकलक का उपयोग करने के बारे में बात करता है। यह सोचने के लिए एक बड़ी छलांग नहीं है, "उनका मतलब है कि एक संकलक (शायद एक 'समर्थित' एक) और एक अलग संकलक (शायद एक नया वाला) के साथ अपने स्वयं के कोड के साथ तीसरे पक्ष के कोड का संकलन।" (यह निश्चित रूप से है कि मैं ओपी को पूछ रहा हूं; यदि आप इसे अलग तरीके से पढ़ते हैं, तो आप ओपी को स्पष्ट करने के लिए पूछना चाह सकते हैं।) उस संभावना या अन्य समान में, ऑब्जेक्ट कोड की संगतता अत्यधिक प्रासंगिक लगती है।
jpmc26

1
@ jpmc26: "यह निश्चित रूप से है कि मैं ओपी से पूछ रहा हूं; यदि आप इसे अलग तरीके से पढ़ते हैं, तो आप ओपी को स्पष्ट करने के लिए पूछना चाह सकते हैं।" ओपी ने स्पष्ट रूप से कहा कि उनकी कंपनी "सोर्स कोड का एक बड़ा और बहुत जटिल टुकड़ा खरीदेगी"। इसके अलावा, "जैसे कि यह बोधगम्य है कि संकलक के विभिन्न संस्करण अलग-अलग ऑब्जेक्ट कोड उत्पन्न करेंगे, संभवतः समय के अंतर के लिए अग्रणी होंगे", वे पूछ रहे हैं कि जब वे अलग-अलग टूलचिन के साथ खरीदे गए कोड को संकलित करते हैं, तो क्या परिवर्तन नहीं। मुझे नहीं लगता कि वहाँ व्याख्या के लिए बहुत जगह है!
मोनिका के साथ लाइटनेस दौड़

8

क्या यह आवश्यक है कि हम उसी संकलक और उसी संकलक संस्करण का उपयोग करें जिसका उपयोग खरीदे गए कोड को विकसित करने के लिए किया गया था? क्या यह आवश्यक है कि हम खरीदे गए कोड के समान C ++ के संस्करण का उपयोग करें?

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

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


यह वास्तव में एक बहुत अच्छी सलाह है!
टी। सार - पुनः मोनिका

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

4

हमारी कंपनी उपग्रह संचार के लिए स्रोत कोड का एक बड़ा और बहुत जटिल टुकड़ा खरीदेगी। यह C ++ में कोडित है और हम इसे C ++ में भी जोड़ देंगे, हमारे कोड को खरीदे गए कोड के साथ एक एकल निष्पादन योग्य इकाई में जोड़ देंगे।

बढ़िया है!

क्या यह आवश्यक है कि हम उसी संकलक और उसी संकलक संस्करण का उपयोग करें जिसका उपयोग खरीदे गए कोड को विकसित करने के लिए किया गया था?

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

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

अंततः, आपको लेखक / विक्रेता से पूछना होगा कि स्रोत कोड किसके लिए लिखा गया है। यदि वे दावा करते हैं कि यह विशेष रूप से खिलाफ लिखा गया है, तो Visual Studio 2015, और Windows API सुविधाओं की आवश्यकता है, आपको संभवतः उसी के साथ रहना चाहिए। लेकिन अगर वे दावा करते हैं कि यह पोर्टेबल, मानक C ++ है, तो आपको जो भी संकलक पसंद है, उसका उपयोग करें। सुनिश्चित करें कि आपके खरीद समझौते में एक समर्थन व्यवस्था शामिल है, ताकि विक्रेता के झूठ बोलने पर आपको मुफ्त मदद मिल सके।

क्या यह आवश्यक है कि हम खरीदे गए कोड के समान C ++ के संस्करण का उपयोग करें? यदि यह 2014 का उपयोग नहीं कर रहा है, तो हम इसकी कुछ विशेषताओं का उपयोग करना चाह सकते हैं, लेकिन यदि अलग-अलग संस्करणों को मिलाकर कुछ समस्याएं हो सकती हैं, तो नहीं।

शायद। शायद।

C ++ 03 अधिकांश भाग के लिए आगे-संगत है, इसलिए यदि कोड C ++ 03 है, तो आपको समस्या होने की संभावना नहीं है। (हालांकि कुछ ट्विक की आवश्यकता हो सकती है।)

लेकिन C ++ 11 और C ++ 14 में शुरू की गई विशेषताएं पिछड़े-संगत नहीं हैं इसलिए यदि विक्रेता ने कहा, C ++ 11 लैंबडास का उपयोग किया है, और आप C ++ 03 संकलक में उनके कोड का निर्माण करने का प्रयास करते हैं, जो अभी जीता है 'काम नहीं है।

सिद्धांत रूप में, निश्चित रूप से, यह विशेष रूप से भाषा संस्करण के लिए महत्वपूर्ण नहीं है, लेकिन यह समझ में नहीं आता है कि संकलक के विभिन्न संस्करण अलग-अलग ऑब्जेक्ट कोड, संभवतः समय के अंतर के लिए अग्रणी आदि उत्पन्न करेंगे।

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

और मैं यह कहूंगा कि दूसरों ने क्या कहा है: यह सुनिश्चित करें कि आपके पास किसी प्रकार का समर्थन सहारा है, ताकि यदि वे इन सवालों के जवाबों को गलत तरीके से प्रस्तुत करें (चाहे जानबूझकर या अन्यथा) आप परिणामी लागत को समाप्त नहीं करते हैं।


वर्थ नोटिंग: लिंकिंग पूरी तरह से C ++ विनिर्देशों में शामिल नहीं है। हालांकि कोड कई अनुरूप संकलक में संकलित हो सकता है, यह गारंटी नहीं है कि आप उन्हें केवल एक साथ जोड़ सकते हैं और यह काम कर सकता है।
Cort Ammon

1
@CortAmmon: आपको टूलबार के साथ परिणामी वितरण के सभी घटकों को संकलित करना चाहिए / करना चाहिए जो एक ABI साझा करते हैं। ABI मानक C ++ के दायरे से बाहर हैं। मुझे नहीं लगता कि ओपी वैसे भी टूलचिन के मिश्रण के बारे में पूछ रहा है।
मोनिका के साथ लाइटनेस दौड़

2

आप कोड लिंक नहीं करते हैं, आप संकलित ऑब्जेक्ट फ़ाइलों को लिंक करते हैं।

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

कंटेनर या अपवाद जैसी विशेषताएं समान इंटरफ़ेस प्रदान करती हैं लेकिन, एक बाइनरी स्तर पर, कई अलग-अलग, असंगत तरीकों से लागू किया जा सकता है।

पूरे कोड को संकलित करने के लिए एक अलग संकलक का उपयोग करना एक अलग मुद्दा है। विचार करने के लिए प्रश्न:

  • कोड किस प्लेटफ़ॉर्म / आर्किटेक्चर को लक्षित करता है?
  • यह किस मानक के लिए लिखा गया था?
  • क्या यह किसी भी गैर-मानक संकलक सुविधाओं का उपयोग करता है?
  • क्या कोड में हार्ड-कोडित प्लेटफ़ॉर्म विशिष्ट धारणाएँ हैं (जैसे कि हमेशा इस बात पर विचार करना कि 2 बाइट्स पर कब्जा है)?

यह जोखिम भी है कि कोड में ऐसे हिस्से हो सकते हैं जिनके परिणामस्वरूप अपरिभाषित व्यवहार होता है। ये एक संकलक का उपयोग करते समय ठीक काम करते हुए दिखाई दे सकते हैं लेकिन किसी भिन्न का उपयोग करते समय रहस्यमय तरीके से विफल होते हैं।


ओपी कोड बना रहा है, न कि वेंडर। ओपी पूछ रहा है कि बदलते पर्यावरण (cf. वेंडर) कैसे कोड पीढ़ी को समान कोडबेस को प्रभावित कर सकता है।
मोनिका

1

क्या यह आवश्यक है कि हम उसी संकलक और उसी संकलक संस्करण का उपयोग करें जिसका उपयोग खरीदे गए कोड को विकसित करने के लिए किया गया था?

खैर, संकलक स्विच करना, कुछ समस्याएं पैदा कर सकता है; वर्तमान में मेरी कंपनी में, हम क्लैंग और MSVC का उपयोग करते हैं, और हमारे पास एक कंपाइलर में त्रुटि है कि दूसरे को इस तरह चिह्नित नहीं किया जाता है।

क्या यह आवश्यक है कि हम खरीदे गए कोड के समान C ++ के संस्करण का उपयोग करें? यदि यह 2014 का उपयोग नहीं कर रहा है, तो हम इसकी कुछ विशेषताओं का उपयोग करना चाह सकते हैं, लेकिन यदि अलग-अलग संस्करणों को मिलाकर कुछ समस्याएं हो सकती हैं, तो नहीं।

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


बहुत सुंदर मेरी सोच। संकलक क्रियाओं के बारे में क्या है - यदि वे उदाहरण के लिए जीसीसी संस्करण x और नवीनतम x + 2 का उपयोग करते हैं?
मावग का कहना है कि मोनिका

1
यदि वे संकलक के पुराने संस्करण का उपयोग करते हैं, जिसका आप उपयोग करना चाहते हैं, तो कोई समस्या नहीं है, क्योंकि वहाँ कोई चीज नहीं है जैसे कि सामान को हटाना, समस्या उठ सकती है यदि वे आपके संकलक के नए संस्करण का उपयोग कर रहे थे।
लेबपोइप

पर कैसे? मैं भी वूडल पसंद नहीं करता। लेकिन क्या आप किसी भी प्रकार की समस्या से अवगत हैं जो हो सकती है?
मावग का कहना है कि मोनिका

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

1
थोड़ा परिशिष्ट, निश्चित रूप से समस्या अधिक हो जाती है अगर दूसरे कार्यालय से इस्तेमाल किया गया कंपाइलर एक प्रमुख नहीं था। ईजी को एक पुराना कंसोल कंपाइलर, या कुछ जो भाषा के सबसेट के साथ काम करता है।
लबोपी

1

कंपाइलर्स को बदलते समय एक बड़ी समस्या अपरिभाषित व्यवहार की है: यदि आप जिस कोड को अपरिभाषित व्यवहार प्राप्त करते हैं, तो कुछ भी संभव है - जिसमें कोड भी ठीक काम करता है और अपने कंपाइलर का उपयोग करते समय उनके सभी परीक्षण पास करता है, और आपके कंपाइलर के साथ बहुत गलत हो जाता है।

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


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