क्या यह कहना मुश्किल है कि लिनक्स पर दृश्य सी ++ संकलक एक लिनक्स बाइनरी निष्पादन योग्य फ़ाइल उत्पन्न करने के लिए?
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 ऐसा करता है, और मुझे यकीन है कि अन्य लोग भी हैं।
एक बार जब आपके पास एक काम करने वाला टूलचैन (कंपाइलर, असेंबलर, लिंकर) होता है, तो लाइब्रेरी सूत्रों से बनती हैं और आखिरकार आपको किसी अन्य प्लेटफॉर्म के लिए एक निष्पादन योग्य फ़ाइल तैयार करने की आवश्यकता होती है।