ब्रायनन बनाम ट्रांसक्रिप्ट (जुलाई 2016 से कुछ जानकारी यहां दी गई है, क्योंकि ट्रांसक्रिप्ट को ओपी द्वारा इस सवाल पर एक विकल्प के रूप में जोड़ा गया था), कुछ महीने पहले ब्रायथन के साथ एक परियोजना शुरू करके और ट्रांसक्रिप्ट (पिछले सप्ताह पूरा हुआ) में स्थानांतरित होकर चमक गया था। मुझे ब्रायथन और ट्रांसक्रिप्ट पसंद है और उन दोनों के लिए उपयोग देख सकते हैं।
ऐसे लोगों के लिए जो नए हैं, ब्रायथन और ट्रांसक्रिप्ट 'दोनों' पाइथन इनपुट टू जावास्क्रिप्ट दोनों को पायथन 3 सिंटैक्स की आवश्यकता होती है। ब्रायथन में पाइथन मानक पुस्तकालयों की पर्याप्त संख्या शामिल है और इनमें से कुछ वेब से संबंधित चीजों से निपटने के लिए स्वयं के हैं, जबकि ट्रांसक्रिप्ट अधिकांश भाग के लिए इससे बचता है और इसके बजाय जावास्क्रिप्ट पुस्तकालयों का उपयोग करने का सुझाव देता है।
Brython ( Github) ब्राउज़र में रूपांतरण कर सकते हैं। इसलिए आप अजगर में लिखते हैं और brython.js इंजन पेज लोड होने पर इसे मक्खी पर जावास्क्रिप्ट में बदल देता है। यह वास्तव में सुविधाजनक है, और जितना आप सोच सकते हैं उससे कहीं अधिक तेज है। हालाँकि, brython.js इंजन जिसे आपको अपने पृष्ठों में शामिल करने की आवश्यकता है, लगभग 500Kb है। इसके अलावा, मानक पुस्तकालयों के आयात की बात है, जिसे ब्रायथन अलग-अलग .js फ़ाइलों के साथ एक्सएचआर अनुरोधों के साथ संभालती है। कुछ लिबर्ट पहले से ही brython.js में संकलित हैं, इसलिए हर आयात नई फ़ाइलों में नहीं खींचेगा, लेकिन यदि आप कई आयातों का उपयोग करते हैं, तो चीजें धीमी हो सकती हैं। हालाँकि, इसके आसपास तरीके हैं। मैंने ब्राउज़र डे टूल में नेटवर्क टैब की जांच करने के लिए क्या किया था, यह देखने के लिए कि पेज लोड होने पर क्या फाइलें खींची जा रही थीं, फिर मेरे द्वारा ब्रायटन src फ़ोल्डर की एक कॉपी में उपयोग की जा रही सभी फाइलों को हटा दें। और ब्रायथन के साथ शामिल स्क्रिप्ट को चलाएं (मुझे लगता है कि यह ब्राइथॉन / www / स्क्रिप्ट / मेक_वीएफएसडीएम पर है) जो पीआई_ वीएफएस.जज नामक एक फ़ाइल में सभी उपलब्ध परिवादों को संकलित करती है, जिसे आपको अपने एचटीएमएल से भी लिंक करना होगा। आम तौर पर, यह एक बहुत बड़ा 2MB + फ़ाइल बना देगा, लेकिन यदि आप उन चीजों को हटा देते हैं जो आप उपयोग नहीं कर रहे हैं, तो यह काफी छोटा हो सकता है। इसे इस तरह से करने का मतलब है कि आपको केवल brython.js, py_VFS.js और अपने अजगर कोड में खींचने की आवश्यकता है, और अतिरिक्त XHR अनुरोधों की आवश्यकता नहीं होगी।
Transcrypt ( Github ) दूसरी तरफ, एक के रूप में वितरित किया जाता है अजगर 3 पैकेजआप अपने टूलकिन में मैन्युअल रूप से या हुक का उपयोग कर सकते हैं, पहले से ही पिरामिड को जावास्क्रिप्ट में संकलित करने के लिए। इसलिए ट्रांसक्रिप्ट के साथ, आप अजगर में लिखते हैं, अजगर के खिलाफ ट्रांसक्रिप्ट को चलाते हैं और यह जावास्क्रिप्ट को बाहर निकालता है जिसे आप अपने प्रोजेक्ट में लिंक कर सकते हैं। यह एक पारंपरिक संकलक की तरह अधिक है कि यह आउटपुट पर कुछ नियंत्रण प्रदान करता है। उदाहरण के लिए, आप ES6 या ES5 को संकलित करने के लिए चुन सकते हैं, या इसे आउटपुट सोर्समैप्स से पूछ सकते हैं (कि डिबगिंग के दौरान ब्राउज़र सीधे आपको संबंधित अजगर कोड पर ले जाता है, जेनरेट किए गए जावास्क्रिप्ट कोड के इनसाइड।) ट्रांसक्रीप्ट की जावास्क्रिप्ट आउटपुट काफ़ी ट्रिक है ( या एक और तरीका है, यह सुंदर है और बहुत ही कठिन)। मेरे मामले में अजगर का 150kB अघोषित ES5 जावास्क्रिप्ट के 165kB में बदल जाता है। तुलना के माध्यम से, मेरी परियोजना के ब्रायथन संस्करण ने रूपांतरण के बाद लगभग 800Kb का उपयोग किया।
हालाँकि, Transcrypts terseness के लाभ प्राप्त करना, डॉक्स को थोड़ा पढ़ना (वास्तव में बस थोड़ा सा) की आवश्यकता होती है। उदाहरण के लिए, ट्रांसक्रिप्ट के साथ, पाइथॉन की 'सत्यता' जैसी डेटा संरचनाओं के लिए तानाशाही, सेट और सूची डिफ़ॉल्ट रूप से सक्षम नहीं है और विश्व स्तर पर यह सक्षम है कि टाइपकास्टिंग से संबंधित संभावित प्रदर्शन मुद्दों के कारण इसे हतोत्साहित किया जाए। स्पष्टता के लिए: सीपीथॉन के तहत, एक खाली तानाशाही, सेट या सूची में सत्य मूल्य गलत है, जबकि जावास्क्रिप्ट में इसे 'सत्य' माना जाता है .. उदाहरण:
myList = []
if myList:
इसे संबोधित करने के कम से कम तीन तरीके हैं:
- अजगर को जावास्क्रिप्ट में कनवर्ट करते समय -t फ्लैग का उपयोग करें उदाहरण: $ transcrypt -t python.py (अनुशंसित नहीं है, लेकिन संभवतः कोई समस्या नहीं है जब तक कि आप प्रदर्शन संवेदनशील कोड के आंतरिक छोरों में कई बार सत्यता की जांच नहीं करते ..)
- अपने कोड का उपयोग करें
__pragma__(tconv)
या __pragma__(notconv)
स्थानीय रूप से सत्य जैसे मानों के लिए स्वचालित रूपांतरण पर स्विच करने के लिए ट्रांसक्रिप्ट क्रॉलर को बताने के लिए।
- सत्य मूल्य की जाँच करने के बजाय, समस्या को पूरी तरह से जाँचने से बचें len (myList)> 0 ... हो सकता है कि ज्यादातर स्थितियों के लिए ठीक हो, मेरे हल्के उपयोग के लिए काम करता है।
ठीक है, इसलिए मेरा प्रोजेक्ट बड़ा हो रहा था और मैं एक प्रदर्शन लाभ के लिए पूर्व-संकलन करना चाहता था, लेकिन ब्रायथन के साथ ऐसा करना कठिन पाया (हालांकि यह तकनीकी रूप से संभव है, ऑनलाइन संपादक का उपयोग करने के लिए एक आसान तरीका और जावास्क्रिप्ट बटन देखने के लिए क्लिक करें उत्पादन)। मैंने ऐसा किया और प्रोजेक्ट.html से उत्पन्न जावास्क्रिप्ट से जुड़ा लेकिन यह किसी कारण से काम नहीं आया। इसके अलावा, मुझे ब्रायथन के त्रुटि संदेशों को समझना कठिन लगता है, इसलिए मुझे नहीं पता था कि इस कदम के असफल होने के बाद कहां से शुरू करना है। इसके अलावा, आउटपुट कोड का बड़ा आकार और ब्राइटन इंजन का आकार मुझे बग करने लगा था। इसलिए मैंने ट्रांसक्रिप्ट पर करीब से नज़र रखने का फैसला किया, जो पहले उच्च स्तर का था, क्योंकि मैं नीचे दिए गए निर्देशों को पसंद करता हूं, जो मुझे बताते हैं कि कैसे तुरंत शुरू किया जाए (ये तब से जोड़े गए हैं)।
पायथन 3.5 को स्थापित करने के बाद इसे स्थापित करने की मुख्य बात यह थी:
- एक python3.5 प्रोजेक्ट फ़ोल्डर (बस प्रकार: python3.5 -m venv foldername - सेट करने के लिए 3.5 के लिए पैकेज मुद्दों के साथ समाधान) )। यह अन्य चीजों के बीच एक बिन सबफ़ोल्डर के साथ 'foldername' बनाता है।
- पाइप ('फ़ोल्डरनाम / बिन / पाइप स्थापित ट्रांसक्रिप्ट') के साथ ट्रांसक्रिप्ट पाइथन पैकेज स्थापित करें जो इसे फ़ोल्डरनाम / लिब / पाइथन 3.5 / साइट-पैकेज / ट्रांसक्रिप्ट के लिए स्थापित करता है।
activate
यदि आप हर बार फ़ोल्डरनाम / बिन / python3.5 के लिए पूर्ण पथ टाइप नहीं करना चाहते हैं तो वर्तमान टर्मिनल। टाइप करके सक्रिय करें: 'source foldername / bin / activate'
- कोड लिखना शुरू करें और इसे परीक्षण के लिए जावास्क्रिप्ट में संकलित करें। उस फ़ोल्डर के भीतर से संकलित करें जिसमें आप अपना कोड लिखते हैं। उदाहरण के लिए, मैंने फ़ोल्डरनाम / www / प्रोजेक्ट का उपयोग किया है। तो उस फ़ोल्डर में सीडी डालें और चलाएँ: 'transcrypt -b your_python_script.py'। यह आउटपुट को सबफ़ोल्डर में रखता है जिसे कहा जाता है
__javascript__
। फिर आप अपने HTML से आउटपुट जावास्क्रिप्ट से लिंक कर सकते हैं।
मुख्य मुद्दों को पार करते हुए
मुझे साधारण आवश्यकताएं हैं, इसलिए आपका लाभ भिन्न हो सकता है।
आपको जावास्क्रिप्ट या लिबर्टन मानक लिबास को जावास्क्रिप्ट लिबास के साथ बदलने की आवश्यकता है। इसलिए उदाहरण के लिए 'इंपोर्ट जोंस' ब्रायथन द्वारा प्रदान किया गया है, लेकिन ट्रांसक्रिप्ट के तहत आप एक जावास्क्रिप्ट लिब का उपयोग कर सकते हैं या सिर्फ सीधे अपने पायथन कोड में JSON.parse / JSON.stringify का उपयोग कर सकते हैं। अपने कोड में सीधे जावास्क्रिप्ट कोड का एक छोटा संस्करण शामिल करने के लिए इस प्रारूप का उपयोग करें (ट्रिपल उद्धरण नोट करें):
__pragma__ ('js', '{}', '''
// javascript code
''')
ब्रायटन के html विशिष्ट कार्य स्पष्ट रूप से ट्रांसक्रिप्ट के साथ काम नहीं करते हैं। बस सामान्य जावास्क्रिप्ट तरीके का उपयोग करें। उदाहरण: 1) ब्रायथन के तहत, आपने 'दस्तावेज़ [' आईडी '] का उपयोग करते हुए एक विशिष्ट HTML टैग का उल्लेख किया हो सकता है, लेकिन ट्रांसक्रिप्ट के साथ आप' document.getElementById '(' id ') का उपयोग करेंगे (जो कि आपके द्वारा किया जाता है) यह जावास्क्रिप्ट से)। 2) आप 'डेल नोडनेम' के साथ एक नोड नहीं हटा सकते हैं (bcs जो एक ब्रिथॉन फ़ंक्शन है)। 'Node.parentNode.removeChild (नोड)' जैसे कुछ का उपयोग करें। 3) जावास्क्रिप्ट विकल्प के साथ ब्राइटन के डोम कार्यों के सभी को बदलें। उदा। class_name = className; text = textContent; html = भीतर का HTML; जनक = parentNode; बच्चों = चाइल्डकोड आदि से मुझे लगता है कि अगर आपको किसी ऐसी चीज की जरूरत है जिसमें कुछ पुराने ब्राउजर्स के लिए जरूरी विकल्प हैं तो उसके लिए जावास्क्रिप्ट लाइब्रेरी हैं। 4) ब्रायटन के सेट_टाइम को javascripts के साथ बदल दिया जाता है। 5) ब्रायटन के html टैग जैसे BR () को सामान्य जावास्क्रिप्ट तरीके का उपयोग करने के साथ-साथ आपके द्वारा उपयोग किए जाने वाले किसी भी स्थान को पुनः लोड करने की आवश्यकता है <= dom मैनिपुलेशन सिंटैक्स। या तो सादे टेक्स्ट मार्कअप को इनर HTML के रूप में इंजेक्ट करें या जावास्क्रिप्ट सिंटैक्स का उपयोग करके तत्व बनाएं और फिर उन्हें सामान्य जावास्क्रिप्ट डोम सिंटैक्स का उपयोग करके संलग्न करें। मैंने यह भी देखा कि चेकबॉक्स के लिए ब्रायथॉन "यदि चेकबॉक्स = 'चेक किया गया':" का उपयोग करता है, लेकिन ट्रांसक्रिप्ट "चेकबॉक्स:" के साथ खुश है। या तो सादे टेक्स्ट मार्कअप को इनर HTML के रूप में इंजेक्ट करें या जावास्क्रिप्ट सिंटैक्स का उपयोग करके तत्व बनाएं और फिर उन्हें सामान्य जावास्क्रिप्ट डोम सिंटैक्स का उपयोग करके संलग्न करें। मैंने यह भी देखा कि चेकबॉक्स के लिए ब्रायथॉन "यदि चेकबॉक्स = 'चेक किया गया':" का उपयोग करता है, लेकिन ट्रांसक्रिप्ट "चेकबॉक्स:" के साथ खुश है। या तो सादे टेक्स्ट मार्कअप को इनर HTML के रूप में इंजेक्ट करें या जावास्क्रिप्ट सिंटैक्स का उपयोग करके तत्व बनाएं और फिर उन्हें सामान्य जावास्क्रिप्ट डोम सिंटैक्स का उपयोग करके संलग्न करें। मैंने यह भी देखा कि चेकबॉक्स के लिए ब्रायथॉन "यदि चेकबॉक्स = 'चेक किया गया':" का उपयोग करता है, लेकिन ट्रांसक्रिप्ट "चेकबॉक्स:" के साथ खुश है।
मैंने पिछले सप्ताह एक 2700 लाइन परियोजना को आगे बढ़ाया, जिस समय ट्रांसक्रिप्ट में कुछ मामूली चीजों के लिए समर्थन नहीं था (हालांकि वे भराव के साथ बदलने के लिए पर्याप्त आसान थे), ये 1 थे) str.lower, str.split (str। विभाजन मौजूद है, लेकिन ऐसा लगता है कि जावास्क्रिप्ट विभाजन, जो अजगर संस्करण के लिए अलग तरह से काम करता है, जिसके व्यवहार पर मैं भरोसा कर रहा था), 2) गोल (यह अब देव संस्करण में समर्थित प्रतीत होता है) और 3)। 'str, int और float पर t काम, केवल तानाशाही, सूची और सेट पर। 4) ब्रायटन का एक और अंतर मैंने देखा है कि अगर मैं एक ताना के JSON प्रतिनिधित्व में खींचता हूं, तो मुझे 'myDict = dict (डेटा)' का उपयोग करके ऐसा करने की आवश्यकता है, जबकि ब्रिथॉन 'myDict = data' से खुश था। लेकिन यह ब्रेटन के json.loads में कुछ से संबंधित हो सकता है, जिसे मैंने सीधे JSON.parse से बदल दिया था।__pragma__('opov')
स्थानीय के लिए), आप ओवरलोड प्रारूप का उपयोग करके सेट ऑपरेशन जैसी चीजें नहीं कर सकते हैं, लेकिन संबंधित कार्यों का उपयोग करने की आवश्यकता है। उदाहरण के लिए
a = set([1, 2, 3])
b = set([3, 4, 5])
a.difference(b)
a.union(b)
a.intersection(b)
a.symmetric_difference(b)
6) इसके अलावा, आप (cmd लाइन -i को सक्षम किए बिना) डिफ़ॉल्ट रूप से 'i में मैं के लिए:' का उपयोग करके इसे ड्यूरेट नहीं कर सकते __pragma__('iconv')
, लेकिन आप इसे केवल कुंजियों () सदस्य का उपयोग करके सक्षम करने से बच सकते हैं:
for key, value in dict.items():
संक्षेपित करते हुए
मुझे ब्रायथन पसंद है क्योंकि इसके साथ जाना और अपने कोड (बस F5) का परीक्षण करना आसान है। यह सच अजगर के करीब है क्योंकि अधिकांश मानक लीब है। मुझे ट्रांसप्लीकेशन इंजन को शामिल करना पसंद नहीं है (संपादित करें: या ब्राउज़र में एक अजगर वीएम के रूप में देख सकता है) और बड़े आउटपुट जावास्क्रिप्ट आकार। अगर मुझे चीजों को करना था (लेकिन अभी भी ब्रायथन का उपयोग कर रहे हैं), तो मैंने जावास्क्रिप्ट तरीकों का उपयोग किया होगा ब्रीथॉन से डोम को हेरफेर करने के लिए (जो आप कर सकते हैं ..), ब्रीथोन विधियों पर इतना झुकाव के बजाय, जो समय बर्बाद कर रहा है जब मेरी जरूरत बदली तो एक और ट्रांसपिलर को।
मुझे ट्रांसक्रिप्ट पसंद है क्योंकि आउटपुटेड जावास्क्रिप्ट वास्तव में 'दुबला और क्षुद्र' है और क्योंकि केवल एक चीज जिसे आप ब्राउज़र साइड लोड करते हैं वह है आपका उत्पन्न जावास्क्रिप्ट कोड जो आपके अजगर कोड के आकार जैसा है। इसलिए भी क्योंकि यह sourcemaps का समर्थन करता है और क्योंकि यह मुझे आउटपुट जावास्क्रिप्ट पर नियंत्रण का एक उपाय देता है। और इसका उपयोग करके मुझे अनुकूलन के बारे में बहुत कुछ सिखाया गया।
आशा है कि किसी को यह देखने में मदद करता है कि इनमें से कौन सा अपने विशेष प्रोजेक्ट के लिए अच्छा हो सकता है।