किसी अन्य प्रोग्रामिंग भाषा में अनुवाद करना आसान बनाने के लिए मैं किस प्रकार के पैटर्न को लागू कर सकता हूं? [बन्द है]


95

मैं एक साइड प्रोजेक्ट करने के लिए निकल रहा हूं, जिसमें एक प्रोग्रामिंग भाषा से दूसरे कोड को ट्रांसलेट करने का लक्ष्य है। मैं जिन भाषाओं के साथ शुरू कर रहा हूं, वे हैं PHP और Python (Python to PHP को शुरू करना आसान होना चाहिए), लेकिन आदर्श रूप से मैं अन्य भाषाओं को (सापेक्ष) आसानी से जोड़ पाऊंगा। योजना है:

  • यह वेब विकास की दिशा में सक्षम है। मूल और लक्ष्य कोड चौखटों के ऊपर बैठा होगा (जिसे मुझे भी लिखना होगा)। ये चौखटे एमवीसी डिजाइन पैटर्न को अपनाएंगे और सख्त कोडिंग सम्मेलनों का पालन करेंगे। इससे अनुवाद कुछ हद तक आसान हो जाना चाहिए।

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

  • मैं पायथन के पार्सर मॉड्यूल का उपयोग करूँगा , जो मुझे सार सिंटैक्स ट्री के साथ बेला देता है। जाहिरा तौर पर निकटतम मैं PHP के साथ मिल सकता है token_get_all () , जो एक शुरुआत है।

  • तब से मैं एएसटी, प्रतीक तालिकाओं और नियंत्रण प्रवाह का निर्माण कर सकता हूं।

फिर मुझे विश्वास है कि मैं कोड बनाना शुरू कर सकता हूं। मुझे एक सही अनुवाद की आवश्यकता नहीं है । मुझे अभी भी उत्पन्न कोड की समीक्षा करनी होगी और समस्याओं को ठीक करना होगा। आदर्श रूप से अनुवादक को समस्याग्रस्त अनुवादों को चिह्नित करना चाहिए।

इससे पहले कि आप पूछें "यह क्या बात है?" जवाब है ... यह एक दिलचस्प सीखने का अनुभव होगा। यदि आपके पास इसे कम चुनौतीपूर्ण बनाने के बारे में कोई अंतर्दृष्टि है, तो कृपया मुझे बताएं।


संपादित करें:

मुझे यह जानने में अधिक दिलचस्पी है कि मैं किस प्रकार के पैटर्न को लागू कर सकता हूं ताकि अनुवाद को आसान बनाने के लिए कोड (यानी: Io, SOA?) कोड को अनुवाद करने के तरीके से आसान बनाया जा सके।


6
क्या आपने .NET CLR या Perl6 के तोते जैसे सिस्टम को देखा है? वे एक मध्यवर्ती प्रतिनिधित्व के लिए नीचे भाषाओं का एक सेट संकलित करते हैं जो एक सामान्य दुभाषिया द्वारा चलाया जा सकता है। यदि आप मध्यवर्ती प्रतिनिधित्व से किसी भाषा में वापस जा सकते हैं, तो आपको एक अनुवादक मिल गया है।
बोरेलिड

1
@Borealid AFAIK नेट सीआईएल (अपेक्षाकृत) आसान संकलित करने के लिए है में , लेकिन सौभाग्य से पठनीय कोड वापस पाने। अब तोता देख रहा हूं।
NullUserException 5

अन्य भाषाओं के लिए समान परियोजनाएं हैं; मुझे यकीन नहीं है कि उनके लेखक कितने समृद्ध हैं। और मैं वास्तव में खुद को यहां बहुत रोक रहा हूं, एक रूपरेखा की आवश्यकता है और सख्त कोडिंग सम्मेलनों का पालन कर रहा हूं।
NullUserException

2
मैं कोई विशिष्ट ज्ञान नहीं जोड़ सकता, लेकिन क्या आपने पजामा ( pyjs.org ), विशेष रूप से अनुवादक पर ध्यान दिया है? यह जावास्क्रिप्ट कंपाइलर के लिए एक अजगर है।
Stephan

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

जवाबों:


122

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

इस कुएं को करने के लिए आपको कितनी मात्रा में मशीनरी की आवश्यकता है, यह बहुत बड़ा है (विशेषकर यदि आप सामान्य तरीके से कई भाषाओं के लिए ऐसा करना चाहते हैं), और फिर आपको अविश्वसनीय परिभाषा वाली भाषाओं के लिए विश्वसनीय पार्सर की आवश्यकता है (PHP इसका सही उदाहरण है )।

भाषा-से-अनुवादक बनाने या इसे आज़माने के बारे में आपके विचार में कुछ भी गलत नहीं है, लेकिन मुझे लगता है कि आपको अपनी अपेक्षा से कहीं अधिक वास्तविक भाषाओं के लिए यह एक बड़ा काम लगेगा। हमारे पास कुछ 100 मानव-वर्ष सिर्फ डीएमएस में निवेश किए गए हैं, और प्रत्येक "विश्वसनीय" भाषा की परिभाषा में 6-12 महीने (एक जिसे हम दर्द से PHP के लिए बनाया गया है) सहित, सी ++ जैसी गंदी भाषाओं के लिए बहुत अधिक है। यह "एक सीखने के अनुभव का नरक" होगा; यह हमारे लिए है। (आप उस सीख को शुरू करने के लिए दिलचस्प वेबसाइट उपरोक्त तकनीकी वेबसाइट पर पा सकते हैं)।

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

मूल रूप से डीएमएस का निर्माण शुरू करने का कारण ऐसी नींवों का निर्माण करना था, जिनमें ऐसी बहुत कम धारणाएँ थीं। इसमें कुछ ऐसे हैं जो हमें सिरदर्द देते हैं। अब तक, कोई ब्लैक होल नहीं। (पिछले 15 वर्षों में मेरी नौकरी का सबसे कठिन हिस्सा ऐसी धारणाओं को रेंगने से रोकने की कोशिश करना है)।

बहुत से लोग यह मानने की गलती भी करते हैं कि अगर वे पार्स कर सकते हैं (और शायद एएसटी प्राप्त करते हैं), तो वे कुछ जटिल करने के रास्ते पर अच्छी तरह से हैं। कठिन पाठों में से एक यह है कि अच्छे कार्यक्रम विश्लेषण या परिवर्तन करने के लिए आपको प्रतीक तालिकाओं और प्रवाह विश्लेषण की आवश्यकता होती है। एएसटी आवश्यक हैं लेकिन पर्याप्त नहीं हैं। यही कारण है कि Aho & Ullman की संकलक पुस्तक अध्याय 2 पर नहीं रुकती है (ओपी के पास यह अधिकार है कि वह एएसटी से परे अतिरिक्त मशीनरी बनाने की योजना बना रहा है)। इस विषय पर अधिक जानकारी के लिए, लाइफ आफ्टर पार्सिंग देखें ।

"मुझे सही अनुवाद की आवश्यकता नहीं है" के बारे में टिप्पणी परेशानी वाली है। कमजोर अनुवादक जो करते हैं वह "आसान" 80% कोड में परिवर्तित हो जाता है, और कठोर 20% को हाथ से छोड़ देता है। यदि आप जिस एप्लिकेशन को कनवर्ट करने का इरादा रखते हैं वह बहुत छोटा है, और आप केवल इसे एक बार अच्छी तरह से बदलने का इरादा रखते हैं, तो वह 20% ठीक है। यदि आप कई अनुप्रयोगों (या यहां तक ​​कि समय के साथ मामूली बदलाव के साथ एक ही) को परिवर्तित करना चाहते हैं, तो यह अच्छा नहीं है। यदि आप 100K SLOC को बदलने का प्रयास करते हैं तो 20% कोड की 20,000 मूल लाइनें हैं जो अनुवादित प्रोग्राम के अन्य 80,000 लाइनों के संदर्भ में अनुवाद करना, समझना और संशोधित करना कठिन हैं जिन्हें आप पहले से नहीं समझते हैं। यह एक बड़ी राशि लेता है। मिलियन लाइन स्तर पर, यह केवल अभ्यास में असंभव है।कठिन और वे सामान्य रूप से लंबे समय की देरी, उच्च लागत और अक्सर एकमुश्त विफलता के साथ दर्द का पता लगाते हैं।)

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

एक अन्य महत्वपूर्ण विचार अनुवाद किए जाने वाले कोड का आकार है। एक काम करने वाला, मजबूत अनुवादक, यहां तक ​​कि अच्छे उपकरण बनाने में भी बहुत ऊर्जा लगती है। हालांकि यह छोटे रूपांतरण के लिए बस कोड मैनुअल (जैसे, हमारे अनुभव में लगभग 100K SLOC तक) के लिए ट्रांसलेटर बनाने के लिए सेक्सी और कूल लगता है, इकोनॉमिक्स बस इसे सही नहीं ठहराती है। किसी को भी यह जवाब पसंद नहीं है, लेकिन अगर आपको वास्तव में सिर्फ 10K SLOC कोड का अनुवाद करना है, तो आप शायद बुलेट को काटने और इसे करने से बेहतर हैं। और हाँ, यह दर्दनाक है।

मुझे लगता है कि हमारे उपकरण बहुत अच्छे हैं (लेकिन फिर, मैं बहुत पक्षपाती हूं)। और एक अच्छे अनुवादक का निर्माण करना अभी भी बहुत कठिन है; हमें लगभग 1.5-2 साल लगते हैं और हम जानते हैं कि हमें अपने उपकरणों का उपयोग कैसे करना है। अंतर यह है कि इस मशीनरी के साथ, हम असफल होने की तुलना में अधिक बार सफल होते हैं।


8
क्या आपने कभी भी अपने "दर्द से निर्मित" PHP परिभाषा को बड़े पैमाने पर PHP समुदाय में योगदान देने पर विचार किया है, या उस संभव बनाने के लिए अपने स्वयं के राजस्व स्ट्रीम के साथ बहुत निकटता से जुड़ा हुआ है?
TML

53
मुझे बहुत से ऐसे लोगों द्वारा "ओपन सोर्स" करने के लिए कहा गया है जो बहुत से ऐसे लोग हैं जो एक राजस्व स्ट्रीम में योगदान नहीं करना चाहते थे, और उनके पास काम करने के लिए ऊर्जा नहीं थी और इसे स्वयं स्रोत खोलें। यदि आप केवल एक बहुत बड़ी परियोजना के लिए एक छोटा सा हिस्सा योगदान करते हैं, और / या आपके पास आय का एक और स्रोत है, तो "खुला स्रोत" ठीक लगता है। यदि आपने स्वयं और इसके अपने आय के एकमात्र स्रोत के लिए सभी कार्य किए हैं, तो यह बहुत कम आकर्षक है। [मैं "मुफ्त सॉफ्टवेयर" दर्शन के सापेक्ष गुणों के बारे में चर्चा में नहीं आना चाहता, इसलिए मैं इस पंक्ति के साथ किसी भी टिप्पणी में भाग नहीं लूंगा]
इरा बैक्सटर

9
आपने जो कहा, मैं उससे सहमत हूं, यही कारण है कि मैंने इस प्रश्न को फिर से बनाया जैसा मैंने किया था। मुझे लगता है कि हम उस प्रतिक्रिया से परिचित होना चाहते हैं जो आपको लगता है कि यह आपके राजस्व से बहुत निकटता से जुड़ा हुआ है, और इसके साथ कुछ भी गलत नहीं है - मैंने सोचा कि यह पूछने लायक है।
TML

3
@IraBaxter आप सिर्फ कंप्यूटर से संबंधित प्रैटिस के बारे में सामान्य मुहावरों को कहते हैं जिन्हें बहुत सारे अन्य प्रैटिक्स पर लागू किया जा सकता है। आपके द्वारा लिखे गए सभी चीज़ों में अंतर केवल semanticdesigns.com (जो आपकी कंपनी का होता है) के लिंक हैं
amirouche

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

13

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

संक्षेप में: पार्सर मॉड्यूल का उपयोग न करें, एक आसान तरीका है।

astक्योंकि यह आप के साथ काम करने के लिए एक पहले से तैयार एएसटी देता है मॉड्यूल, अजगर 2.6 के बाद से उपलब्ध अपनी आवश्यकताओं के लिए और अधिक उपयुक्त है,। मैंने इस पर पिछले साल एक लेख लिखा है , लेकिन संक्षेप में, पायथन स्रोत कोड को एएसटी में पार्स करने की parseविधि का उपयोग करें astparserमॉड्यूल आप एक पार्स पेड़, न कि एक एएसटी दे देंगे। अंतर से सावधान रहें

अब, चूंकि पाइथन के एएसटी काफी विस्तृत हैं, इसलिए एएसटी को फ्रंट-एंड काम बहुत मुश्किल नहीं है। मुझे लगता है कि आपके पास कार्यक्षमता के कुछ हिस्सों के लिए एक सरल प्रोटोटाइप हो सकता है जो काफी जल्दी तैयार हो जाता है। हालाँकि, एक पूर्ण समाधान प्राप्त करने में अधिक समय लगेगा, मुख्यतः क्योंकि भाषाओं के शब्दार्थ अलग-अलग हैं। भाषा का एक सरल सबसेट (कार्य, बुनियादी प्रकार और इतने पर) आसानी से अनुवादित किया जा सकता है, लेकिन एक बार जब आप अधिक जटिल परतों में पहुंच जाते हैं, तो आपको एक भाषा के मूल का दूसरे में अनुकरण करने के लिए भारी मशीनरी की आवश्यकता होगी। उदाहरण के लिए, पायथन के जनरेटर और सूची समझ पर विचार करें जो PHP में मौजूद नहीं हैं (मेरे सर्वश्रेष्ठ ज्ञान के लिए, जो PHP में शामिल होने पर यह वास्तव में खराब है)।

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


Weeeell। 2to3सिर्फ एएसटी से एएसटी है। यह astमॉड्यूल की क्षमताओं से परे जाने वाले कुछ भी करने का समर्थन नहीं करता है । ध्यान दें कि सभी अनुवाद मेजबान पायथन प्रक्रिया द्वारा समर्थित वाक्यविन्यास से जाते हैं जो होस्ट पायथन प्रक्रिया द्वारा समर्थित वाक्यविन्यास के लिए है। कोई भी अनुवादक नहीं है जो फ़ंक्शन एनोटेशन को जोड़ता है, कहता है, क्योंकि 2.6 इसका समर्थन नहीं करता है।
१०:३० बजे

... और ओपी का सवाल फंसाया जा सकता है, अल्पावधि, पायथन 2.6 एएसटी से कैसे प्राप्त करें ... PHP में कुछ। मूल मॉड्यूल संभवतः PHP सिंटैक्स का अच्छी तरह से प्रतिनिधित्व नहीं करना चाहेगा, इसलिए इसका न होना भी आश्चर्यजनक नहीं है।
इरा बैक्सटर

2
@ एरॉन: 2to3से उत्पन्न एएसटी का उपयोग करने के एक उदाहरण के रूप में देखा जा सकता है ast
एली बेंडरस्की

AFAIK, 2to3 निश्चित रूप से पायथन से पीएचपी की तुलना में एक आसान अनुवाद है (आखिरकार, इसका पायथन पायथन से, दाईं ओर) है? और यहां तक ​​कि यह विशेष रूप से अच्छी तरह से काम नहीं करता है। पायथन 2.6 की बड़ी मात्रा पर ध्यान दें, जो कि 2to3 के माध्यम से अभी तक छायांकित नहीं किया गया है ... क्योंकि इसमें पोस्ट ट्रांसलेशन हैंड पैचिंग का एक गुच्छा है जो अभी भी किया जाना है। यदि 100% स्वचालित थे, तो अजगर 2.6 मर जाएगा।
ईरा बाक्सटर

5

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

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

उदाहरण के लिए:

word = 'This is not a word'
print word[::-2]

डुप्लिकेट करने के लिए बहुत सी सी + + कोड लेता है (ठीक है, अच्छी तरह से आप इसे कुछ लूपिंग निर्माणों के साथ काफी कम कर सकते हैं, लेकिन फिर भी)।

मुझे लगता है कि थोड़ा अलग है।

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

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

लेकिन अगर आप इसे इस तरह करते हैं तो आप शायद आउटपुट को ऑप्टिमाइज़ करने के तरीकों का पता लगा पाएंगे। संक्षेप में:

  • उपलब्ध व्याकरण पढ़ें
  • इंटरमीडिएट में संकलित कार्यक्रम (लेकिन ट्यूरिंग भी पूर्ण) सिंटैक्स
  • अंतिम भाषा में संकलित मध्यवर्ती कार्यक्रम (उपलब्ध व्याकरण पर आधारित)
  • ...?
  • फायदा!(?)

* शक्तिशाली से मेरा मतलब है कि यह 4 लाइनें लेता है:

myinput = raw_input("Enter something: ")
print myinput.replace('a', 'A')
print sum(ord(c) for c in myinput)
print myinput[::-1]

मुझे एक और भाषा दिखाएं जो 4 लाइनों में ऐसा कुछ कर सकती है, और मैं आपको एक ऐसी भाषा दिखाऊंगा जो पायथन की तरह शक्तिशाली है।


"क्या आपने कभी भाषा व्याकरण के आधार पर एक टोकन / पार्सर लिखा है?" मैंने इसे जावासीसी का उपयोग करके किया है।
NullUserException

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

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

@WayneWerner इस रिकॉर्ड के लिए, C # जैसी भाषाओं को बिल्कुल भी नई सुर्खियों की आवश्यकता नहीं है। (कम से कम, एकल-पंक्ति टिप्पणियों को छीन लेने के बाद नहीं।) तो आप किसी भी # प्रोग्राम को एक पंक्ति में लिख सकते हैं। लेकिन निश्चित रूप से मैं समझता हूं कि आप क्या कर रहे हैं।
लेविथानबर्गर

@ उपर्युक्त: मुझे नहीं लगता कि यह सही है। यदि आप प्रीप्रोसेसर शर्तों को अस्वीकार करते हैं, तो आप सही हो सकते हैं।
इरा बैक्सटर

3

आपको परेशान न करने के लिए एक दो जवाब दिए जा रहे हैं। खैर, यह कितना सहायक है? तुम सीखना चाहते हो? आप सीख सकते हैं। यह संकलन है। यह सिर्फ इतना होता है कि आपकी लक्षित भाषा मशीन कोड नहीं है, लेकिन एक अन्य उच्च-स्तरीय भाषा है। यह हर समय किया जाता है।

आरंभ करने का एक अपेक्षाकृत आसान तरीका है। सबसे पहले, http://sourceforge.net/projects/lime-php/ (यदि आप PHP में काम करना चाहते हैं) या कुछ इस तरह से जाएं और उदाहरण कोड के माध्यम से जाएं। इसके बाद, आप एक लेक्सिकल एनालाइज़र लिख सकते हैं, जो रेगुलर एक्सप्रेशन के अनुक्रम का उपयोग करता है और आपके द्वारा बनाए गए पार्सर को टोकन खिलाता है। आपकी शब्दार्थ क्रियाएँ या तो सीधे किसी अन्य भाषा में कोड का उत्पादन कर सकती हैं या कुछ डेटा संरचना (विचार ऑब्जेक्ट्स, मैन) का निर्माण कर सकती हैं, जिसे आप आउटपुट कोड उत्पन्न करने के लिए मालिश कर सकते हैं।

आप PHP और पायथन के साथ भाग्यशाली हैं क्योंकि कई मामलों में वे एक-दूसरे के समान भाषा हैं, लेकिन अलग-अलग वाक्यविन्यास के साथ। कठिन हिस्सा व्याकरण रूपों और डेटा संरचनाओं के बीच शब्दार्थ अंतर पर हो रहा है। उदाहरण के लिए, पायथन में सूचियाँ और शब्दकोष हैं, जबकि PHP में केवल ऐक्रोस ऐरे हैं।

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

ओह, और चूंकि आपके पास पायथन में स्थिर प्रकार नहीं हैं, इसलिए "python_add" जैसे PHP कार्यों को लिखना और उन पर भरोसा करना सबसे अच्छा हो सकता है, जो कि पायथन के करने के तरीके के अनुसार संख्या, तार या ऑब्जेक्ट जोड़ता है।

जाहिर है, अगर आप इसे करने देते हैं तो यह बहुत बड़ा हो सकता है।


3
वास्तव में, मैंने यह नहीं कहा "परेशान मत करो"। मैंने जो कहा था, "भाषाओं का सामान्य तरीके से अनुवाद करना बहुत कठिन है"। यदि ओपी पीएचपी को आजमाने और उत्पन्न करने के लिए पायथन पेड़ों के उपयोग के अपने मूल मार्ग से आगे बढ़ता है, तो वह बहुत कुछ सीख लेगा और मैं सीखने के अनुभव के पक्ष में हूं; मैंने वहां भी शुरुआत की। वह आसानी से नई भाषाएँ नहीं जोड़ पाएंगे।
इरा बैक्सटर

@IraBaxter मैं आपके कथन का समर्थन नहीं कर सकता, पायथन-> PHP और PHP-> जावास्क्रिप्ट करना आसान होगा। सीएफ जवाब के बीच में stackoverflow.com/a/22850139/140837 का अंतिम भाग मैं आपके "तर्क" से भी निपटता हूं
amirouche

2

मैं parser के बजाय ast.parse (जिसके बारे में मुझे पहले नहीं पता था) के उपयोग के संबंध में दूसरा @EliBendersky दृष्टिकोण है। मैं आपको उनके ब्लॉग की समीक्षा करने के लिए भी गर्मजोशी से सलाह देता हूं। मैंने पायथन-> जावास्क्रिप्ट अनुवादक (@ https://bitbucket.org/amirouche/pythonium ) करने के लिए ast.parse का उपयोग किया । मैं पायथनियम डिजाइन के साथ आया हूं, कुछ अन्य कार्यान्वयन की समीक्षा करके और उन्हें अपने दम पर आजमा रहा हूं। मैंने https://github.com/PythonJS/PythonJS जो मैंने भी शुरू किया था, से पायथनियम को फोर्क किया, यह वास्तव में एक पूर्ण पुनर्लेखन है। समग्र डिजाइन PyPy और http://www.hpl.hp.com/techreports/Compaq-DEC/WRL-89-1.pdf पेपर से प्रेरित है ।

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

  • प्रोटोटाइप वंशानुक्रम का उपयोग करके प्लेन ओल्ड जावास्क्रिप्ट में पायथन सिमेंटिक को लागू करें: AFAIK जेएस प्रोटोटाइप ऑब्जेक्ट सिस्टम का उपयोग करके पायथन मल्टीपल इनहेरिटेंस को लागू करना असंभव है। मैंने बाद में अन्य तरकीबों का उपयोग करके इसे करने की कोशिश की (cf. getattribute)। जहां तक ​​मुझे पता है कि जावास्क्रिप्ट में पायथन मल्टीपल इनहेरिटेंस का कार्यान्वयन नहीं है, तो जो सबसे अच्छा मौजूद है वह सिंगल इनहर्टेंस + मिक्सिन्स है और मुझे यकीन नहीं है कि वे हीरे की विरासत को संभाल रहे हैं। स्कल्प्चर के समान लेकिन गूगल क्लोजर के बिना।

  • मैंने Google clojure के साथ कोशिश की, जैसे कि वास्तव में Skulpt कोड #fail पढ़ने के बजाय Skulpt (कंपाइलर)। वैसे भी जेएस प्रोटोटाइप आधारित वस्तु प्रणाली अभी भी असंभव है। बाइंडिंग बनाना बहुत मुश्किल था, आपको जावास्क्रिप्ट और बहुत सारे बॉयलरप्लेट कोड लिखने की ज़रूरत है (cf. https://github.com/skulpt/sk रौशनी / कैंची / ५० जहाँ मैं भूत हूँ)। उस समय बिल्ड सिस्टम में बाइंडिंग को एकीकृत करने का कोई स्पष्ट तरीका नहीं था। मुझे लगता है कि मूर्तिकला एक पुस्तकालय है और आपको HTML में अपनी .py फ़ाइलों को निष्पादित करने के लिए शामिल करना होगा, डेवलपर द्वारा किए जाने के लिए कोई संकलन चरण की आवश्यकता नहीं है।

  • पाइयोडो (संकलक) की कोशिश की, लेकिन बाइंडिंग बनाना (पायथन कोड से जावास्क्रिप्ट कोड को कॉल करना) बहुत मुश्किल था, हर बार बनाने के लिए बहुत अधिक बॉयलरप्लेट कोड था। अब मुझे लगता है कि पायथोनियम वही है जो पायथनियम के पास है। pyjaco को Python (ast.parse) में लिखा गया है, लेकिन बहुत कुछ जावास्क्रिप्ट में लिखा गया है और यह प्रोटोटाइप इनहेरिटेंस का उपयोग करता है।

मैं वास्तव में पजामा # फेल चलाने में कभी सफल नहीं हुआ और कभी भी कोड # फेल को पढ़ने की कोशिश नहीं की। लेकिन मेरे दिमाग में पजामा एपीआई-> एपीआई ट्रांसलेशन (या फ्रेमवर्क टू फ्रेमवर्क) कर रहा था न कि पायथन से जावास्क्रिप्ट अनुवाद। जावास्क्रिप्ट फ्रेमवर्क उस डेटा का उपभोग करता है जो पहले से ही सर्वर से पेज या डेटा में है। पायथन कोड केवल "प्लंबिंग" है। उसके बाद मुझे पता चला कि पजामा वास्तव में एक असली अजगर था-> जेएस अनुवादक।

फिर भी मुझे लगता है कि एपीआई- (एपीआई) (या फ्रेमवर्क-> फ्रेमवर्क) अनुवाद करना संभव है और यह मूल रूप से मैं पायथोनियम में करता हूं, लेकिन निचले स्तर पर। संभवतः पजामा पायथनियम के समान एल्गोरिथ्म का उपयोग करते हैं ...

तब मुझे पता चला कि ब्रायसन पूरी तरह से स्कैल्प की तरह जावास्क्रिप्ट में लिखे गए हैं, संकलन की आवश्यकता नहीं है और बहुत सारे फुलाना ... लेकिन जावास्क्रिप्ट में लिखा है।

इस परियोजना के दौरान लिखी गई प्रारंभिक पंक्ति के बाद से, मैं PyPy के बारे में जानता था, यहां तक ​​कि PyPy के लिए जावास्क्रिप्ट बैकएंड भी। हां, यदि आप इसे पा सकते हैं, तो सीधे PyPy से जावास्क्रिप्ट में Python दुभाषिया उत्पन्न करें। लोग कहते हैं, यह एक आपदा थी। मैंने पढ़ा क्यों नहीं लेकिन मुझे लगता है कि इसका कारण यह है कि इंटरप्रेटर, आरपीथॉन को लागू करने के लिए वे जिस मध्यवर्ती भाषा का उपयोग करते हैं, वह पायथन का एक उपसमूह है, जिसे C (और शायद asm) में अनुवादित किया जाएगा। इरा बाक्सटर का कहना है कि आप हमेशा कुछ बनाते समय धारणा बनाते हैं और संभवत: आप इसे ठीक करते हैं कि यह PyPy: Python-> C अनुवाद के मामले में सबसे अच्छा है। उन मान्यताओं को एक और संदर्भ में प्रासंगिक नहीं माना जा सकता है कि वे खराब हो सकते हैं अन्यथा वे कह सकते हैं कि प्रत्यक्ष अनुवाद सबसे अधिक संभावना हमेशा बेहतर होगा।

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

मैंने पायथन की शुरुआत पायथन के एक सबसेट को एक साथ रखने के विचार से की थी जिसे मैं आसानी से जावास्क्रिप्ट में अनुवाद कर सकता था। पहले तो मैंने पिछले अनुभव के कारण OO प्रणाली को लागू करने की जहमत नहीं उठाई। पायथन का सबसे बड़ा हिस्सा जो मैंने जावास्क्रिप्ट का अनुवाद करने के लिए हासिल किया है:

  • पूर्ण मापदंडों के साथ फ़ंक्शन परिभाषा और कॉलिंग दोनों में शब्दार्थ। यह वह हिस्सा है जिस पर मुझे सबसे अधिक गर्व है।
  • जबकि / अगर / elif / बाकी
  • अजगर के प्रकार जावास्क्रिप्ट प्रकार में बदल दिए गए (किसी भी प्रकार का अजगर प्रकार नहीं है)
  • केवल जावास्क्रिप्ट सरणियों पर पुनरावृति के लिए (सरणी में)
  • जावास्क्रिप्ट तक पारदर्शी पहुँच: यदि आप पायथन कोड में ऐरे लिखते हैं तो इसे जावास्क्रिप्ट में ऐरे में अनुवाद किया जाएगा। यह अपने प्रतिस्पर्धियों पर प्रयोज्य के संदर्भ में सबसे बड़ी उपलब्धि है।
  • आप जावास्क्रिप्ट कार्यों के लिए पायथन स्रोत में परिभाषित फ़ंक्शन पास कर सकते हैं। डिफ़ॉल्ट तर्कों को ध्यान में रखा जाएगा।
  • इसने विशेष फ़ंक्शन को नया कहा है जिसे जावास्क्रिप्ट नए में अनुवादित किया गया है जैसे: नया (पायथन) (1, 2, स्पैम, "अंडा") का अनुवाद "नया पायथन (1, 2, स्पैम," अंडा ") किया गया है।
  • "var" स्वचालित रूप से अनुवादक द्वारा नियंत्रित किया जाता है। (ब्रेट से बहुत अच्छी खोज (PythonJS अंशदाता)।
  • वैश्विक कीवर्ड
  • बंद
  • lambdas
  • सूची की समझ
  • आवश्यकता के माध्यम से आयात का समर्थन किया जाता है
  • classyjs के माध्यम से एकल वर्ग वंशानुक्रम + मिक्सिन

यह पायथन के पूर्ण विकसित शब्दार्थ की तुलना में बहुत लेकिन वास्तव में बहुत संकीर्ण लगता है। यह वास्तव में एक पायथन सिंटैक्स के साथ जावास्क्रिप्ट है।

उत्पन्न जेएस एकदम सही है। ओवरहेड नहीं है, इसे आगे संपादित करके प्रदर्शन के मामले में सुधार नहीं किया जा सकता है। यदि आप उत्पन्न कोड में सुधार कर सकते हैं, तो आप इसे पायथन स्रोत फ़ाइल से भी कर सकते हैं। इसके अलावा, कंपाइलर ने किसी भी जेएस ट्रिक्स पर भरोसा नहीं किया, जिसे आप http://superherojs.com/ द्वारा लिखित .js में पा सकते हैं , इसलिए यह बहुत पठनीय है।

PythonJS के इस हिस्से का सीधा वंशज Pythonium Veloce मोड है। पूर्ण क्रियान्वयन @ https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pyloonium/veloce/veloce.py?at=master 793 SLOC + के साथ साझा किए गए अन्य कोड के 100 SLOC के साथ साझा किया जा सकता है ।

वेलोसस मोड cf में pystones.py का एक अनुकूलित संस्करण अनुवादित किया जा सकता है। https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pystone/?at=master

बेसिक पायथन-> जावास्क्रिप्ट अनुवाद होने के बाद मैंने पूर्ण पायथन का जावास्क्रिप्ट में अनुवाद करने के लिए एक और रास्ता चुना। लक्ष्य भाषा को छोड़कर ऑब्जेक्ट ओरिएंटेड क्लास आधारित कोड को glib करने का तरीका JS है इसलिए आपके पास सरणियों, मानचित्र जैसी वस्तुओं और कई अन्य ट्रिक्स की पहुंच है और यह सब उस भाग को Python में लिखा गया था। IIRC पायथनियम अनुवादक द्वारा लिखित कोई जावास्क्रिप्ट कोड नहीं है। एकल वंशानुक्रम प्राप्त करना मुश्किल नहीं है, पायथन के साथ पायथनियम को पूरी तरह से बनाने वाले कठिन भाग हैं:

  • spam.eggपायथन में हमेशा अनुवाद किया जाता है getattribute(spam, "egg")मैंने इसे विशेष रूप से प्रोफाइल नहीं किया था लेकिन मुझे लगता है कि जहां यह बहुत समय ढीला है और मुझे यकीन नहीं है कि मैं इस पर asm.js या कुछ और के साथ सुधार कर सकता हूं।
  • विधि रिज़ॉल्यूशन ऑर्डर: यहां तक ​​कि पायथन में लिखे एल्गोरिथम के साथ, इसे पायथन वेलोस के संगत कोड में अनुवाद करना एक बड़ा प्रयास था।
  • getattributre : वास्तविक गेटअटेयर रिज़ॉल्यूशन एल्गोरिथ्म एक तरह से मुश्किल है और यह अभी भी डेटा डिस्क्रिप्टर का समर्थन नहीं करता है
  • मेटाक्लास क्लास आधारित: मुझे पता है कि कोड को कहां प्लग करना है, लेकिन फिर भी ...
  • last bu not कम से कम: some_callable (...) को हमेशा "call (some_callable)" में बदल दिया जाता है। AFAIK ट्रांसलेटर का उपयोग बिल्कुल भी नहीं करता है, इसलिए हर बार जब आप कॉल करते हैं तो आपको यह जांचने की आवश्यकता होती है कि यह किस तरह की वस्तु है, इसे कॉल करने के लिए वे इसे कहते हैं।

यह हिस्सा https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pythium/compliant/runtime.py?at=master में फैक्टर है, यह पायथन वेलोइस के साथ संगत पायथन में लिखा गया है।

वास्तविक अनुपालन अनुवादक https://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pyplonium/compliant/compliant.py?at=master सीधे जावास्क्रिप्ट कोड उत्पन्न नहीं करता है और सबसे महत्वपूर्ण बात यह आश्चर्यजनक नहीं करता है-> । मैंने ast-> ast चीज़ और ast की कोशिश की, भले ही cst की तुलना में अच्छे के साथ काम करना अच्छा न हो ।NodeTransformer और इससे भी महत्वपूर्ण बात यह है कि मुझे ast-> ast की ज़रूरत नहीं है।

उदाहरण के लिए, इससे जुड़े कोड को जनरेट करने से पहले मैं किसी समय किसी ब्लॉक की सामग्री का निरीक्षण करता हूं, तो कम से कम मेरे मामले में अजगर का एस्टीम मेरे मामले में प्रदर्शन में सुधार होगा।

  • var / Global: कुछ ऐसा करने में सक्षम होने के लिए मुझे पता होना चाहिए कि मुझे क्या चाहिए और var को नहीं। ब्लॉक ट्रैकिंग उत्पन्न करने के बजाय, जो दिए गए ब्लॉक में चर बनाए जाते हैं और इसे उत्पन्न फ़ंक्शन ब्लॉक के शीर्ष पर सम्मिलित करते हैं, मैं सिर्फ रेवलेंट चर असाइनमेंट की तलाश करता हूं, जब मैं संबंधित कोड को उत्पन्न करने के लिए वास्तव में बच्चे के नोड पर जाने से पहले ब्लॉक में प्रवेश करता हूं।
  • पैदावार, जनरेटर, अभी तक, जेएस में एक विशेष वाक्यविन्यास है, इसलिए मुझे यह जानना होगा कि पायथन फ़ंक्शन एक जनरेटर है जब मैं "var my_generator = function" लिखना चाहता हूं

इसलिए मैं अनुवाद के प्रत्येक चरण के लिए एक बार प्रत्येक नोड पर नहीं जाता।

समग्र प्रक्रिया के रूप में वर्णित किया जा सकता है:

Python source code -> Python ast -> Python source code compatible with Veloce mode -> Python ast -> JavaScript source code

पायथन बिल्डरों को पायथन कोड (!) में लिखा गया है, IIRC बूटस्ट्रैपिंग प्रकारों से संबंधित कुछ प्रतिबंध हैं, लेकिन आपके पास हर उस चीज तक पहुंच है, जो अनुरूप मोड में पायथनियम का अनुवाद कर सकती है। अच्छी तरह से देखिएHttps://bitbucket.org/amirouche/pythonium/src/33898da731ee2d768ced392f1c369afd746c25d7/pythonium-compliant/builtins/?at=master

पाइथोनियम कंप्लेंट से उत्पन्न जेएस कोड को पढ़ना समझा जा सकता है लेकिन सोर्स मैप्स से काफी मदद मिलेगी।

इस अनुभव के आलोक में मैं आपको जो मूल्यवान सलाह दे सकता हूं, वह है पुराने किस्म के फार्ट्स:

  • साहित्य और मौजूदा परियोजनाओं दोनों में स्रोत या मुक्त विषय की बड़े पैमाने पर समीक्षा करें। जब मैंने विभिन्न मौजूदा परियोजनाओं की समीक्षा की तो मुझे इसे और अधिक समय और प्रेरणा देना चाहिए।
  • सवाल पूछो! अगर मुझे पहले से पता था कि C / Javascript शब्दार्थ बेमेल के कारण ओवरपीड की वजह से PyPy बैकेंड बेकार था। मैं शायद 6 महीने पहले शायद 3 साल पहले पायथनियम विचार तरीका था।
  • पता है कि आप क्या करना चाहते हैं, एक लक्ष्य है। इस परियोजना के लिए मेरे पास अलग-अलग उद्देश्य थे: थोड़ा सा जावास्क्रिप्ट टाइप करें, पाइथन के बारे में अधिक जानें और पाइथन कोड लिखने में सक्षम हों जो ब्राउज़र में चलेगा (अधिक और नीचे)।
  • असफलता अनुभव है
  • एक छोटा कदम एक कदम है
  • छोटा शुरू करो
  • बङा सोचो
  • डेमो करते हैं
  • पुनरावृति

केवल पायथन वेलोस मोड के साथ, मैं बहुत खुश हूँ! लेकिन जिस तरह से मुझे पता चला कि जो मैं वास्तव में खोज रहा था वह मुझे और अन्य लोगों को जावास्क्रिप्ट से मुक्त कर रहा था, लेकिन अधिक महत्वपूर्ण बात यह है कि एक आरामदायक तरीके से बनाने में सक्षम है । यह मुझे स्कीम, डीएसएल, मॉडल और अंततः डोमेन विशिष्ट मॉडल की ओर ले जाता है (cf. http://dsmforum.org/ ) की ओर ले जाता है।

इरा बैक्सटर की प्रतिक्रिया के बारे में क्या:

अनुमान बिल्कुल भी मददगार नहीं हैं। मुझे पाइथनज और पायथोनियम दोनों के लिए कम से कम 6 महीने का खाली समय मिला। इसलिए मैं पूरे 6 महीने से अधिक समय की उम्मीद कर सकता हूं। मुझे लगता है कि हम सभी जानते हैं कि एक उद्यम के संदर्भ में 100 आदमी-वर्ष का क्या मतलब हो सकता है और इसका मतलब बिल्कुल नहीं ...

जब कोई कहता है कि कुछ कठिन या अधिक बार असंभव है, तो मैं उत्तर देता हूं कि "यह केवल एक समस्या का समाधान खोजने में समय लेता है जो असंभव है" अन्यथा कहा कि कुछ भी असंभव नहीं है सिवाय इसके कि इस मामले में एक गणित प्रमाण असंभव साबित हो ...

यदि यह असंभव साबित नहीं होता है, तो यह कल्पना के लिए जगह छोड़ देता है:

  • एक प्रमाण खोजना यह साबित करना असंभव है

तथा

  • यदि यह असंभव है तो एक "हीन" समस्या हो सकती है जिसका समाधान हो सकता है।

या

  • अगर यह असंभव नहीं है, एक समाधान खोजना

यह सिर्फ आशावादी सोच नहीं है। जब मैंने पायथन शुरू किया-> जावास्क्रिप्ट हर कोई कह रहा था कि यह असंभव था। PyPy नामुमकिन। मेटाक्लासेस बहुत कठिन हैं। आदि ... मुझे लगता है कि एकमात्र क्रांति जो योजना के ऊपर PyPy लाती है-> C पेपर (जो 25 वर्ष पुराना है) कुछ स्वचालित JIT पीढ़ी है (आरपीथॉन दुभाषिया में लिखे गए संकेत के आधार पर मुझे लगता है)।

अधिकांश लोग जो कहते हैं कि एक चीज़ "कठिन" है या "असंभव" कारण प्रदान नहीं करते हैं। C ++ को पार्स करना मुश्किल है? मुझे पता है कि, अभी भी वे (मुक्त) C ++ पार्सर हैं। ईविल विस्तार में है? मुझे पता है। यह कहना कि यह असंभव है केवल सहायक नहीं है, यह "मददगार नहीं" से भी बदतर है यह हतोत्साहित करने वाला है, और कुछ लोगों का अर्थ दूसरों को हतोत्साहित करना है। मैंने इस सवाल के बारे में /programming/22621164/how-to-automatically-generate-a-parser-code-to-code-translator-from-a-corpus के माध्यम से सुना ।

आपके लिए पूर्णता क्या होगी ? इस तरह आप अगले लक्ष्य को परिभाषित करते हैं और शायद समग्र लक्ष्य तक पहुँचते हैं।

मुझे यह जानने में अधिक दिलचस्पी है कि मैं किस प्रकार के पैटर्न को लागू कर सकता हूं ताकि अनुवाद को आसान बनाने के लिए कोड (यानी: Io, SOA?) कोड को अनुवाद करने के तरीके से आसान बनाया जा सके।

मैं ऐसा कोई पैटर्न नहीं देखता, जिसे एक भाषा से दूसरी भाषा में अनुवाद न किया जा सके, कम से कम सही तरीके से। चूंकि भाषा से भाषा में अनुवाद संभव है, इसलिए आप इसके लिए पहले से बेहतर लक्ष्य रखेंगे। चूंकि, मुझे लगता है कि http://en.wikipedia.org/wiki/Graph_isomorphism_problem के अनुसार , दो कंप्यूटर भाषाओं के बीच अनुवाद एक पेड़ या DAG isomorphism है। यहां तक ​​कि अगर हम पहले से ही जानते हैं कि वे दोनों पूरा कर रहे हैं, तो ...

फ्रेमवर्क-> फ्रेमवर्क जिसे मैं एपीआई-> एपीआई अनुवाद के रूप में बेहतर रूप से देखता हूं, फिर भी कुछ ऐसा हो सकता है जिसे आप उत्पन्न कोड को बेहतर बनाने के तरीके के रूप में ध्यान में रख सकते हैं। उदाहरण: बहुत विशिष्ट वाक्यविन्यास के रूप में प्रोग्लॉग करें, लेकिन फिर भी आप पायथन में एक ही ग्राफ का वर्णन करके अभिकलन की तरह प्रोग्लॉग कर सकते हैं ... अगर मुझे पायथन अनुवादक के लिए एक प्रोलॉग लागू करना था तो मैं पायथन में एकीकरण लागू नहीं करूंगा लेकिन एक सी लाइब्रेरी में आ सकता हूं। एक "पायथन सिंटैक्स" के साथ जो एक पायथन के लिए बहुत पठनीय है। अंत में, सिंटैक्स केवल "पेंटिंग" है जिसके लिए हम एक अर्थ देते हैं (यही कारण है कि मैंने योजना शुरू की है)। बुराई भाषा के विस्तार में है और मैं वाक्य रचना के बारे में बात नहीं कर रहा हूँ। भाषा में जिन अवधारणाओं का उपयोग किया जाता है मिलती हैंहुक (आप इसके बिना रह सकते हैं) लेकिन पूंछ की पुनरावृत्ति अनुकूलन जैसी वीएम सुविधाओं के साथ सौदा करना मुश्किल हो सकता है। आप परवाह नहीं करते हैं यदि प्रारंभिक कार्यक्रम पूंछ पुनरावृत्ति का उपयोग नहीं करता है और भले ही लक्ष्य भाषा में कोई पूंछ पुनरावृत्ति न हो तो आप इसे ग्रीनलेट्स / इवेंट लूप का उपयोग करके अनुकरण कर सकते हैं।

लक्ष्य और स्रोत भाषाओं के लिए, देखें:

  • बड़े और विशिष्ट विचार
  • छोटे और सामान्य साझा विचार

इससे यह सामने आएगा:

  • जिन चीजों का अनुवाद करना आसान है
  • जिन चीजों का अनुवाद करना मुश्किल है

आप शायद यह भी जान पाएंगे कि तेज और धीमे कोड में क्या अनुवाद किया जाएगा।

स्टैडलिब या किसी लाइब्रेरी का भी सवाल है लेकिन कोई स्पष्ट उत्तर नहीं है, यह आपके लक्ष्यों पर निर्भर करता है।

मुहावरेदार कोड या पठनीय उत्पन्न कोड भी समाधान है ...

PHP जैसे प्लेटफ़ॉर्म को लक्षित करना ब्राउज़रों को लक्षित करने की तुलना में बहुत आसान है क्योंकि आप धीमे और / या महत्वपूर्ण पथ का सी-कार्यान्वयन प्रदान कर सकते हैं।

यह देखते हुए कि आप पहली परियोजना में पायथन का PHP में अनुवाद कर रहे हैं, कम से कम PHP3 सबसेट के लिए जो मुझे पता है, veloce.py को अनुकूलित करना आपका सबसे अच्छा दांव है। यदि आप PHP के लिए veloce.py को कार्यान्वित कर सकते हैं तो शायद आप आज्ञाकारी मोड को चलाने में सक्षम होंगे ... इसके अलावा यदि आप PHP को PHP के सबसेट में अनुवाद कर सकते हैं तो आप php_veloce.py के साथ उत्पन्न कर सकते हैं इसका मतलब है कि आप PHP का अनुवाद कर सकते हैं पायथन का सबसेट जो कि veloce.py का उपभोग कर सकता है, जिसका अर्थ है कि आप PHP को जावास्क्रिप्ट में अनुवाद कर सकते हैं। बस केह रहा हू...

आप उन पुस्तकालयों पर भी नज़र डाल सकते हैं:

आप इस ब्लॉग पोस्ट (और टिप्पणियों) से भी रूचि ले सकते हैं: https://www.rfk.id.au/blog/entry/pypy-js-poc-jit/


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

मैं डेटा प्रकारों के बारे में अन्य उत्तर देता हूं। पायथोनियम में, मैं भी बिना सही तरीके के कंप्लेंट मोड में एक पूर्णांक और फ्लोट प्रकार का समर्थन करने की योजना नहीं बना रहा था।
अमीरो

ठीक है, इसलिए यदि मैं आपको 100K SLOC का पायथन पैकेज देता हूं, और आप इसे अपने "अनुवादक" के माध्यम से चलाते हैं, तो क्या मुझे काम करने का कार्यक्रम मिलेगा? इसे ठीक करने में हाथ से अनुवाद करने के बाद कितना काम आता है? आपने यहां जो कहा था, "पायथन के लिए पहले से ही मौजूद अच्छा पार्सर दिया गया है जो एएसटीएस बनाता है, मैं 6 महीने में आंशिक अनुवादक बना सकता हूं"। किसी को आश्चर्य नहीं हुआ। 6 महीने ज्यादातर लोगों के मानकों "आसान" (आपकी अन्य टिप्पणियों से उद्धृत) द्वारा नहीं है। शेष समस्याओं को हल करने के लिए अधिक प्रयास की आवश्यकता होगी। मेरे उत्तर में कहा गया है, मूल रूप से "ऐसा करना आसान नहीं है", और "इसे सामान्य तरीके से करना कठिन है"।
इरा बैक्सटर

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

मैं असहमत हूं, खासकर जब आप जानते हैं कि आप क्या कर रहे हैं, तो यह आसान है और जो कुछ भी मुश्किल है वह मुश्किल नहीं है। मुझे यकीन नहीं है कि आप प्रश्न से संबंधित किसी भी चीज़ से संबंधित हैं। आप 4 या 5 पैराग्राफ में कह रहे हैं कि आपकी कंपनी ऐसा करती है, और यह कठिन है। लेकिन अन्यथा आप विषय के बारे में FUD का प्रसार कर रहे हैं, जबकि आप जैसे थोड़े-से विषय वाले हैं, जैसे stackoverflow.com/questions/22621164/… में हैं । पूरे 6 महीने में मैंने एक पूरा अनुवादक लिखा होगा।
अमीरोचे

0

आप Vala संकलक पर एक नज़र डाल सकते हैं , जो Vala (C # जैसी भाषा) का C में अनुवाद करता है।


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