क्या ऐसे कार्यक्रम हैं जो किसी भी दो भाषाओं के बीच स्रोत कोड का 'अनुवाद' कर सकते हैं?


28

क्या ऐसे प्रोग्राम हैं जो किसी भी दो भाषाओं के बीच स्रोत कोड का 'अनुवाद' कर सकते हैं (यह मानते हुए कि अनुवादक के पास अपेक्षित पुस्तकालयों तक पहुंच है)?

यदि वहाँ हैं, तो वे कैसे काम करते हैं (तकनीक का उपयोग किया जाता है, ज्ञान की आवश्यकता होती है, आदि)? वे संभवत: निर्माण कैसे करेंगे?

यदि वे नहीं हैं, तो उनके विकास को रोकने वाले प्रतिबंध क्या हैं? क्या यह AI पूर्ण समस्या है (प्राकृतिक भाषा अनुवाद एक के रूप में सूचीबद्ध है)?

ईडीआईटी रूपांतरण केवल अपेक्षित है, जब भाषा में एक ही अभिव्यक्ति शक्ति होती है, एक ही तरह की समस्याओं को हल कर सकती है और परिवर्तित होने वाली कोड कोगंतव्य भाषा में व्यक्त किया जा सकता है। (MATLAB के लिए शेल स्क्रिप्ट से रूपांतरण अपेक्षित नहीं है)।



14
"किसी भी दो भाषाओं" से आपका क्या तात्पर्य है? निश्चित रूप से ऐसे कार्यक्रम हैं जो एक भाषा से दूसरी भाषा में अनुवाद कर सकते हैं। उन्हें "कंपाइलर" कहा जाता है। यह वस्तुतः संकलक की परिभाषा है: एक कार्यक्रम जो एक भाषा से दूसरी भाषा में कार्यक्रमों का अनुवाद करता है। लेकिन "कोई भी दो भाषाएँ"? मुझे नहीं लगता कि यह संभव है। अनुवादक को स्रोत और लक्ष्य भाषा दोनों को जानना होता है, और यह आमतौर पर भाषाओं की एक विशेष जोड़ी के लिए विशिष्ट होता है।
जोर्ज डब्ल्यू मित्तग

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

4
हां, उन्हें कंपाइलर कहा जाता है, वे कंपाइलर की तरह काम करते हैं और उनका निर्माण कंपाइलर की तरह किया जा सकता है।
user253751

1
यदि "किन्हीं दो भाषाओं" से आपका शाब्दिक अर्थ है कि (परिमित) प्रोग्राम को अनंत संख्या में इनपुट भाषाओं को पढ़ने और समझने में सक्षम होना चाहिए, तो इसका उत्तर नहीं है । हालाँकि, इनपुट भाषाओं का एक सीमित सेट लें और आप उन सभी भाषाओं के लिए एक कंपाइलर पा सकते हैं ..
बाकुरीउ

जवाबों:


57

TLDR; यह संभव है लेकिन व्यावहारिक नहीं है।

(मान लें कि अनुवादक के पास अपेक्षित पुस्तकालयों तक पहुंच है)?

यह मुश्किल सा हो रहा है, और क्यों इस तरह की चीजें अभ्यास में इस्तेमाल किया जा रहा अंत नहीं है का हिस्सा है।

  1. सभी संकलक अनुवादक हैं। एक भाषा से दूसरी भाषा में अनुवाद करना निश्चित रूप से संभव है, और यह वस्तुतः सभी संकलक कर रहे हैं। एक कंपाइलर जो भाषा आउटपुट के रूप में फैलता है, वह आम तौर पर मशीन कोड या असेंबली होता है, लेकिन यह सिर्फ एक और भाषा है, और इसमें कंपाइलर (कभी-कभी ट्रांसपाइलर या ट्रांसकंपलर भी) होते हैं जो दो भाषाओं के बीच अनुवाद करते हैं । उदाहरण के लिए, संकलन-से-जावास्क्रिप्ट भाषाओं की एक सरगम ​​है, जैसे प्यूरस्क्रिप्ट, एल्म, क्लोजुरस्क्रिप्ट, आदि।

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

    • एक अनुवाद जो एक ट्यूरिंग मशीन को इस भाषा में कोड करने के लिए परिवर्तित करता है
    • इस भाषा से ट्यूरिंग मशीन में अनुवाद

    इसलिए भाषा A से भाषा B में अनुवाद करने के लिए, आप A कोड को ट्यूरिंग मशीन में परिवर्तित करते हैं, फिर उस मशीन को B कोड में परिवर्तित करते हैं।

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

  3. इस अनुवाद को कुशलता से करना कठिन है । अलग-अलग भाषा अलग-अलग चीजों को प्राथमिकता देती है। उदाहरण के लिए, यदि आप C से पायथन में अनुवाद करते हैं, तो संभवतः आपको पायथन शब्दकोश के रूप में C की मेमोरी का अनुकरण करना होगा, ताकि आप सूचक अंकगणित कर सकें। इससे जुड़े ओवरहेड होंगे, क्योंकि अब आप नंगे धातु मेमोरी निर्देशों तक नहीं पहुंच रहे हैं।

    विभिन्न भाषाओं में अंतर प्रदर्शन प्राथमिकताएं होती हैं, इसलिए कुछ ऐसा होता है जो एक भाषा का अनुकूलन करता है (या बल्कि, एक भाषा का कार्यान्वयन अनुकूलन करता है) दूसरी भाषा में जल्दी से करना असंभव हो सकता है। यदि आप इसे उचित टेल कॉल के बिना भाषा में अनुवाद करते हैं, तो उचित टेल कॉल के साथ एक कार्यात्मक भाषा का अनुवाद करना मंदी होगा।

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

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

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

    लेकिन सामान्य तौर पर, यह बहुत व्यावहारिक बात नहीं है।


5
प्वाइंट 4 के लिए एक उदाहरण asm.js है । आज, जावास्क्रिप्ट स्रोत मैप्स और एलीमेंट इंस्पेक्टर का उपयोग करके इसे क्रमबद्ध रूप से पठनीय बनाना संभव है , लेकिन कोई भी ऐसा नहीं करना चाहेगा ...
इस्माइल मिगुएल

1
मॉडलिका किसी अन्य भाषा में संकलन के लिए डिज़ाइन की गई भाषा का एक और उदाहरण है (इस मामले में C)।
मोनिका

Web ++ से सी ++ से जावास्क्रिप्ट में अनुवाद करना।
सुर्त

X से Y तक के ट्रांसपॉयलर के कई उदाहरण हैं, लेकिन यह एक सार्वभौमिक चीज से कुछ भी कंपाइलर से अलग है। स्पष्ट रूप से ऐसे मामले हैं जहां ट्रांसप्लिंग का अर्थ है।
jmite

एक महत्वपूर्ण अपवाद लापता IMO: सी के लिए संकलन। कारण यह है कि कई असामान्य प्रणालियों में एक मौजूदा सी कंपाइलर है, जो आमतौर पर काफी उचित मशीन कोड का उत्सर्जन कर सकता है। इसलिए, C को एक भाषा संकलित करके, आपको उन दुर्लभ आर्किटेक्चर के लिए बैकएंड की आवश्यकता नहीं है।
MSalters 0

2

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

आप एक भाषा अनुवादक के उत्पादन की उम्मीद नहीं कर सकते हैं कि परिणाम एक मानव पाठक के लिए कोई मतलब है: कार्यक्रम का काम कोड लिखना है जिसके परिणामस्वरूप एक कार्यक्रम मूल कोड के समान होता है (जो मेरे अनुभव में हो सकता है या हो सकता है) काम नहीं, भाषा की किन विशेषताओं और किन बाहरी पुस्तकालयों का आप उपयोग कर रहे थे) पर निर्भर करता है। लेकिन जैसा कि यह पता नहीं है कि यह कार्य बाकी कार्यक्रम के लिए किया गया है, जिसका अर्थ काफी हद तक खो सकता है।


0

प्रत्यक्ष उत्तर नहीं है, लेकिन एक उपकरण कॉल है ILSpy , जो .Net फ्रेमवर्क के लिए लिखा गया था, और आपको .Net विधानसभा को C # या VB.Net में विघटित करने की अनुमति देता है।

यदि आपका .Net की प्रकृति से अपरिचित है, तो आप कई भाषाओं में .Net कोड लिख सकते हैं लेकिन मुख्य रूप से C # या VB.Net। जब कंपाइलर एप्लिकेशन को संकलित करता है, तो यह कोड को एक "इंटरमीडिएट भाषा" (या संक्षेप में IL) कोड में बदल देता है। यह कोड .Net बायनेरिज़ के लिए संकलित किया गया है।

चूंकि .Net अनुप्रयोग IL कोड से संकलित बायनेरिज़ हैं, ILSpy .Net अनुप्रयोग ले सकता है, इसे वापस IL कोड में ले जा सकता है और बाद में, इसे एक कदम आगे ले जा सकता है और इसे वापस C # या VB.Net पर वापस ला सकता है।

इस टूल का उपयोग करते हुए, आपको केवल एक एप्लिकेशन को संकलित करना है, और फिर आप संकलित फ़ाइलों को IL, C # या VB.Net कोड के रूप में ब्राउज़ कर सकते हैं। स्पष्ट होने के लिए, इससे कोई फर्क नहीं पड़ता कि कोड को शुरू में किस भाषा में लिखा गया था। इसलिए जब तक बाइनरी एक .Net विधानसभा है, यह संकलित फ़ाइलों को रिवर्स-इंजीनियर कर सकता है और इन तीन भाषाओं में से किसी भी सामग्री को आउटपुट कर सकता है।

मुझे पता है कि यह वास्तव में एक संकलक नहीं है, लेकिन यह एक उपकरण है जो आपके लिए देख रहे हैं के समान एक अंतिम-परिणाम प्रदान करता है और वास्तव में, मैंने इसका उपयोग VB.Net परियोजनाओं को थोड़ा-थोड़ा करने के लिए किया है। मेरे लिए और अधिक परिचित - सी #।


0

आपके उपयोग-मामले (टिप्पणियों के आधार पर) के लिए, ऐसा लगता है कि SWIG उपयोगी हो सकता है।

SWIG एक सॉफ्टवेयर डेवलपमेंट टूल है जो C और C ++ में लिखे प्रोग्राम्स को विभिन्न उच्च स्तरीय प्रोग्रामिंग भाषाओं के साथ जोड़ता है। SWIG का उपयोग विभिन्न प्रकार की लक्षित भाषाओं के साथ किया जाता है जिनमें सामान्य स्क्रिप्टिंग भाषाएं जैसे जावास्क्रिप्ट, पर्ल, PHP, पायथन, Tcl और रूबी शामिल हैं। समर्थित भाषाओं की सूची में सी #, कॉमन लिस्प (सीएलआईएसपी, एलेग्रो सीएल, सीएफएफआई, यूएफएफआई), डी, गो भाषा, जावा सहित एंड्रॉइड, लुआ, मोडुला -3, ओयूएसएल, ऑक्टेव, सिलाब और आर जैसी गैर-स्क्रिप्टिंग भाषाएं भी शामिल हैं। इसके अलावा कई व्याख्या की गई और संकलित योजना कार्यान्वयन (गुइले, मेज़केम / रैकेट, चिकन) का समर्थन किया जाता है।


0

मुझे आदरणीय f2c याद है , जो फोरट्रान 77 से सी से स्रोत-से-स्रोत अनुवाद करता है।

यह था (कभी-कभी ...) मुख्य रूप से दशकों से संख्यात्मक कोड का अनुवाद करने के लिए आपके फोरचैन में फोरट्रान कंपाइलर को एकीकृत किए बिना उपयोग किया जाता है।


0

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

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