कंपाइलर आम तौर पर केवल उस प्लेटफ़ॉर्म के लिए निष्पादनयोग्य उत्पन्न करते हैं, जिस पर वे स्थापित हैं?


10

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

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


5
कई क्रॉस-कंपाइलर हैं: मुझे यकीन नहीं है कि आपको क्यों लगता है कि क्रॉस-संकलन असामान्य है। विजुअल C ++ समझ में आता है कि Microsoft विंडोज लॉक-इन चाहता है, लेकिन वे VS2017 में एंड्रॉइड कंपाइलर टूल भी प्रदान करते हैं।

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

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

... न्यूनतम परिवर्तन के साथ कई लक्ष्य प्लेटफार्मों के लिए कोड संकलन के लिए। इस तरह की चीजें एक हालिया नवाचार और बहुत अधिक जटिल हैं।
जूल्स

जवाबों:


18

क्या यह कहना मुश्किल है कि लिनक्स पर दृश्य सी ++ संकलक एक लिनक्स बाइनरी निष्पादन योग्य फ़ाइल उत्पन्न करने के लिए?

Microsoft की ओर से ऐसा करने की अनिच्छा के अलावा, बिल्कुल कुछ भी नहीं। बाधाएं तकनीकी नहीं हैं।

डेवलपमेंट टूलचाइन्स केवल प्रोग्राम हैं जो इनपुट लेते हैं और आउटपुट उत्पन्न करते हैं। विजुअल C ++ x86 असेंबली का उत्पादन करता है और फिर एक कोडर ऑब्जेक्ट फ़ाइल में परिवर्तित करने के लिए एक असेंबलर का उपयोग करता है। अगर Microsoft इसके बजाय ELF उत्पन्न करना चाहता था, तो यह सिर्फ कोड है: असेंबली में आता है, ELF बाहर जाता है। ऑब्जेक्ट फ़ाइलों या पुस्तकालयों के बारे में कुछ भी जादू नहीं है; वे केवल एक अच्छी तरह से समझे गए प्रारूप में डेटा की बूँदें हैं।

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

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

जैसे-जैसे कंपाइलरों का आर्किटेक्चर विकसित होता गया, वैसे-वैसे प्रोडक्ट के साथ सभी कोड जेनरेटर्स को शामिल करना और उनका निर्माण करना सुविधाजनक हो गया और जो एक रनटाइम में उपयोग हो जाता है। Clang / LLVM ऐसा करता है, और मुझे यकीन है कि अन्य लोग भी हैं।

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


यह अब सबसे अच्छा, सबसे अधिक गहन उत्तर है। मुझे लगता है कि इतिहास वास्तव में संदर्भ को समझने में मदद करता है।
जेसन

3
@ जेसन कभी-कभी यह पुराने होने का भुगतान करता है। :-)
ब्लरफेल

4
"Microsoft की ओर से ऐसा करने की अनिच्छा के अलावा, बिल्कुल कुछ भी नहीं।" - मैं इसे "अनिच्छा" नहीं कहूंगा। Microsoft एक सार्वजनिक-व्यापार-लाभ-आधारित व्यवसाय है; उनके पास अपने शेयरधारकों और हितधारकों के लिए कुछ जिम्मेदारियां हैं। वे किराया करने की आवश्यकता होगी, ट्रेन, और भुगतान डेवलपर्स लिनक्स बैकएंड के लिए, वे किराया करने की आवश्यकता होगी, ट्रेन, और भुगतान लिनक्स बैकएंड के लिए परीक्षकों, वे किराया करने की आवश्यकता होगी, ट्रेन, और भुगतान सहयोगी स्टाफ लिनक्स बैकएंड से परिचित, कोड को डिज़ाइन करने, विकसित करने, बनाए रखने, समर्थन करने और उसका विस्तार करने की आवश्यकता होगी, सभी एक मंच के लिए है ...
Jörg W Mittag

… उनके मूल व्यवसाय के बाहर। और वह सब सिर्फ पहले से मौजूद n संकलक में एक n + 1th संकलक जोड़ने के लिए जिसे आप बस उपयोग कर सकते हैं। Microsoft के लिए GCC, Clang, ICC (Intel), xlc (IBM), Digital Mars, tcc, pcc, TenDRA, Metrowerks, PathScale, के साथ प्रतिस्पर्धा करने के लिए व्यावसायिक लाभ क्या होगा ? व्यक्तिगत रूप से, मुझे नहीं लगता कि कोई है।
जोर्ग डब्ल्यू मित्तग

3
@ JörgWMittag What would be the business benefit ... I don't think there is any.- ऐसा लगता है कि ऐसा करने के लिए अनिच्छा होने का एक अच्छा कारण है।
ब्लरफेल

8

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

वहाँ दो समस्याएं हैं जो फसल होती हैं:

  1. लोग इस पर ध्यान केंद्रित नहीं करते क्योंकि यह एक कम सामान्य परिदृश्य है। अक्सर केवल एक चीज जिसे आप संकलित करते हैं, वह एक संकलक है, ताकि आप तब पार संकलन रोक सकें। कम फोकस का मतलब है खराब समर्थन।
  2. गैर-तुच्छ कार्यक्रमों को केवल कोड से अधिक की आवश्यकता होती है। जब आप जिस प्लेटफ़ॉर्म पर चल रहे होते हैं, उसके लिए लाइब्रेरी मिल जाने पर लाइब्रेरी इंक्लूज़न / लिंकेज से निपटना थोड़ा आसान हो जाता है। वे एक प्रसिद्ध स्थान में, एक प्रसिद्ध कूटबन्धन में होंगे।

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


समझा। स्पष्टीकरण के लिए धन्यवाद। निश्चित रूप से अब मेरे लिए अधिक समझ में आता है।
जेसन

मैं इसे अंतरंगता पर दोष देता हूं।
जेफ ओ

2

मैं आपके आधार से असहमत हूं। लाखों Android और iOS डेवलपर हैं। और वे सभी विंडोज या मैक पर चलने वाले कंपाइलरों का उपयोग करते हैं, एक पूरी तरह से अलग कंप्यूटर के लिए कोड का निर्माण करते हैं।

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

तो Microsoft कितना पैसा कमाएगा अगर उनके कंपाइलर लिनक्स के लिए भी बनेंगे? लगभग $ 0। विंडोज के लिए और कितना सॉफ्टवेयर बनाया जाएगा? कोई नहीं। कितना और लिनक्स सॉफ्टवेयर बनाया जाएगा? कोई विचार नहीं है, लेकिन यह ऐसा कुछ नहीं है जिसकी Microsoft को परवाह है। लागत क्या होगी? काफी। कंपाइलर बग मुक्त होना चाहिए। उनका परीक्षण होना चाहिए।

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


"लाखों एंड्रॉइड और आईओएस डेवलपर्स हैं। और वे सभी विंडोज या मैक पर चलने वाले कंपाइलरों का उपयोग करते हैं, जो पूरी तरह से अलग कंप्यूटर के लिए कोड का निर्माण करते हैं।" उम नहीं, वे नहीं। कई, कई Android डेवलपर्स लिनक्स का उपयोग करते हैं, और वास्तव में यह StackExchange के स्वयं के सर्वेक्षण के अनुसार डेवलपर्स के लिए सबसे लोकप्रिय मंच है।
माइल्स राउत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.