यदि आपके पास एक मध्यवर्ती प्रारूप है, तो आप कुछ ऐसा भी लागू कर सकते हैं जो भाषा X में एक कार्यक्रम को उस प्रारूप में अनुवाद करता है, और उस प्रारूप से भाषा Y तक भी । उन सभी भाषाओं के लिए उन रूपांतरणों को लागू करें जिन्हें आप रुचि रखते हैं और आप कर रहे हैं, है ना?
वैसे आप जानते हैं क्या? ऐसा प्रारूप पहले से मौजूद है: असेंबली। कंपाइलर पहले से ही "लैंग्वेज एक्स टू असेंबली" रूपांतरण, और असेंबलर्स को "असेंबली टू लैंग्वेज वाई" कन्वर्सेशन करता है।
अब, असेंबली रिवर्स रूपांतरण करने के लिए एक महान भाषा नहीं है, लेकिन MSIL वास्तव में उतना बुरा नहीं है। रिफ्लेक्टर डाउनलोड करें और आप देखेंगे कि इसे .NET असेंबली को अलग-अलग भाषाओं के एक समूह (और प्लगइन्स और भी अधिक प्रदान करता है) को अलग करने के विकल्प मिले हैं। इसलिए सी # में एक कार्यक्रम लेना संभव है, इसे एक डीएलएल (यानी एमएसआईएल) के लिए संकलित करें, फिर इसे वीबी, सी ++ / सीएलआई, एफ #, और एक पूरे गुच्छा दूसरों में इकट्ठा करने के लिए रिफ्लेक्टर का उपयोग करें। बेशक, अन्य सभी रूपांतरण कार्य भी। एक F # फ़ाइल लें, एक DLL के लिए संकलित करें, इसे C # में बदलने के लिए परावर्तक का उपयोग करें।
बेशक, दो बड़ी समस्याएं जो आपको मिलेंगी वे हैं:
- कोड मूल रूप से अपठनीय है। MSIL (यहां तक कि डिबगिंग सूचना के साथ) मूल स्रोत से बहुत सारी जानकारी निकालता है, इसलिए अनुवादित संस्करण में 100% निष्ठा नहीं है (सैद्धांतिक रूप से C # -> MSIL-> C # रूपांतरण आपको मूल कोड वापस दे देना चाहिए, लेकिन यह नहीं होगा)।
- कई .NET भाषाओं की अपनी कस्टम लाइब्रेरी होती हैं (जैसे VB रनटाइम लाइब्रेरी, F # लाइब्रेरी और इसी तरह)। जब आप अपना रूपांतरण करते हैं तो इन्हें शामिल (या परिवर्तित) करना होगा।
# 2 के आसपास पाने के लिए वास्तव में कुछ भी नहीं है, लेकिन आप संभवतः MSIL में कुछ अतिरिक्त एनोटेशन (विशेषताओं के माध्यम से, शायद) के साथ # 1 के आसपास प्राप्त कर सकते हैं। यह अतिरिक्त काम होगा।