ব্রাইথন বনাম ট্রান্সক্রিপ্ট সম্পর্কে কিছু তথ্য এখানে (জুলাই ২০১ 2016, যেহেতু ট্রান্সক্রিপ্টকে ওপি কর্তৃক এই প্রশ্নের বিকল্প হিসাবে যুক্ত করা হয়েছিল), কয়েকমাস আগে ব্রাইথনের সাথে একটি প্রকল্প শুরু করে ট্রান্সক্রিপ্টে চলে গিয়েছিল (গত সপ্তাহে সরানো শেষ হয়েছিল)। আমি ব্রাইথন এবং ট্রান্সক্রিপ্ট পছন্দ করি এবং তাদের উভয়ের ব্যবহার দেখতে পাচ্ছি।
যে সমস্ত ক্ষেত্রে এটি নতুন, ব্রাইথন এবং ট্রান্সক্রিপ্ট উভয় জাভাস্ক্রিপ্টে 'ট্রান্সপাইল' পাইথন ইনপুট (সম্পাদনা: সম্ভবত ব্রাইথনকে 'ব্রাউজারের জন্য পাইথন বাস্তবায়ন' হিসাবে দেখাই ভাল কারণ এটি একক জাভাস্ক্রিপ্ট তৈরি করে না)। উভয়ের জন্য পাইথন 3 সিনট্যাক্স প্রয়োজন। ব্রাইথনের মধ্যে পাইথন স্ট্যান্ডার্ড লাইব্রেরিগুলির একটি প্রচুর পরিমাণ রয়েছে এবং এটি ওয়েবের সাথে সম্পর্কিত বিষয়গুলির জন্য নিজস্ব কিছু রয়েছে, যেখানে ট্রান্সক্রিপট বেশিরভাগ অংশের জন্য এড়িয়ে চলে এবং পরিবর্তে জাভাস্ক্রিপ্ট লাইব্রেরি ব্যবহার করার পরামর্শ দেয়।
ব্রাইথন ( গিথুব)) ব্রাউজারে রূপান্তর করতে পারে। সুতরাং আপনি পাইথনে লিখুন এবং পৃষ্ঠাটি লোড হওয়ার পরে ব্রাইথন.জেএস ইঞ্জিন এটিকে ফ্লাইয়ের জাভাস্ক্রিপ্টে রূপান্তরিত করে। এটি সত্যিই সুবিধাজনক, এবং আপনি যা ভাবেন তার চেয়ে অনেক দ্রুত। তবে, আপনার পৃষ্ঠাগুলিতে আপনাকে যে ব্রাইথন.জেএস ইঞ্জিনটি অন্তর্ভুক্ত করতে হবে তা প্রায় 500Kb। এছাড়াও, স্ট্যান্ডার্ড লাইব্রেরিগুলি আমদানির বিষয়টি রয়েছে, যা ব্রাইথন এক্সএইচআর অনুরোধের সাথে পৃথক .js ফাইল আনার দ্বারা পরিচালনা করে। কিছু লিবস ইতিমধ্যে brython.js তে সংকলিত হয়েছে, তাই প্রতিটি আমদানি নতুন ফাইলগুলিতে টানবে না, তবে আপনি যদি অনেকগুলি আমদানি ব্যবহার করেন তবে জিনিসগুলি ধীর হতে পারে। তবে এর চারপাশে উপায় আছে। আমি যা করেছি তা ছিল পৃষ্ঠাটি লোড হওয়ার সময় কোন ফাইলগুলি টানানো হচ্ছে তা দেখার জন্য ব্রাউজার ডেভ সরঞ্জামগুলিতে নেটওয়ার্ক ট্যাবটি পরীক্ষা করা, তারপরে ব্রাইথন এসসিআর ফোল্ডারের একটি অনুলিপিতে আমার প্রকল্পটি যে ফাইলগুলি ব্যবহার করছে না সেগুলি মুছুন, এবং ব্রাইথনের সাথে অন্তর্ভুক্ত স্ক্রিপ্টটি চালান (আমার মনে হয় এটি ব্রাইথন / www / স্ক্রিপ্ট / মেক_ভিএফএস.পি) রয়েছে যা উপলব্ধ লিবগুলি সমস্তকে একটি ফাইলের মধ্যে py_VFS.js সংকলন করে যা আপনাকে আপনার এইচটিএমএল থেকেও লিঙ্ক করতে হবে। সাধারণত, এটি একটি বিশাল 2MB + ফাইল তৈরি করবে, তবে আপনি যে জিনিসগুলি ব্যবহার করছেন না তা মুছে ফেললে এটি বেশ ছোট হতে পারে। এইভাবে এটি করা, এর অর্থ আপনাকে কেবল brython.js, py_VFS.js এবং আপনার পাইথন কোডটি টানতে হবে এবং কোনও অতিরিক্ত এক্সএইচআর অনুরোধের প্রয়োজন হবে না।
ট্রান্সক্রিপ্ট ( গিটহাব ) অন্য দিকে, হিসেবে বিতরণ করা হয় পাইথন 3 প্যাকেজআগাম জাভাস্ক্রিপ্টে অজগরটি সংকলন করতে আপনি ম্যানুয়ালি বা আপনার সরঞ্জামচেনে হুক ব্যবহার করতে পারেন। ট্রান্সক্রিপ্টের সাহায্যে আপনি অজগরে লেখেন, অজগরটির বিরুদ্ধে ট্রান্সক্রিপ্ট চালান এবং এটি জাভাস্ক্রিপ্টকে ছাড়িয়ে যায় যা আপনি আপনার প্রকল্পে লিঙ্ক করতে পারেন। এটি আরও একটি traditionalতিহ্যবাহী সংকলকের মতো যা এতে আউটপুট উপর কিছু নিয়ন্ত্রণ সরবরাহ করে। উদাহরণস্বরূপ, আপনি ES6 বা ES5 তে সংকলন চয়ন করতে পারেন, বা আউটপুট সোর্স ম্যাপগুলিতে বলতে পারেন (যে ডিবাগিংয়ের সময় ব্রাউজারটি আপনাকে সরাসরি উত্সাহিত জাভাস্ক্রিপ্ট কোডের অজগর পাইথন কোডে নিয়ে যায়।) ট্রান্সক্রিপ্টের জাভাস্ক্রিপ্ট আউটপুটটি বেশ সংক্ষিপ্ত আকারের ( বা অন্য কোনও উপায়ে বলা যায়, এটি সুন্দর এবং প্রসারিত)। আমার ক্ষেত্রে অজগর 150kB 165kB অবিহীন ES5 জাভাস্ক্রিপ্ট রূপান্তরিত হয়। তুলনা করার মাধ্যমে, আমার প্রকল্পের ব্রাইথন সংস্করণ রূপান্তরের পরে প্রায় 800Kb ব্যবহার করেছে।
যাইহোক, ট্রান্সক্রিপ্টস ক্ষুদ্রতার সুবিধা পেতে ডক্সটি কিছুটা পড়তে হবে (সত্যিই কিছুটা হলেও)। উদাহরণস্বরূপ, ট্রান্সক্রিপ্টের সাথে ডাইক, সেট এবং তালিকার মতো ডেটা স্ট্রাকচারের জন্য পাইথনের 'সত্যতা' ডিফল্টরূপে সক্ষম হয় না এবং টাইপচেকিং সম্পর্কিত সম্ভাব্য পারফরম্যান্স সমস্যার কারণে এটি নিরুত্সাহিত হয়। স্পষ্টতার জন্য: সিপিথনের অধীনে, একটি খালি ডিক, সেট বা তালিকার সত্যের মূল্য মিথ্যা রয়েছে, যেখানে জাভাস্ক্রিপ্টে এটি 'সত্য' হিসাবে বিবেচিত হয়েছে .. উদাহরণ:
myList = []
if myList:
এটি সম্বোধনের জন্য কমপক্ষে তিনটি উপায় রয়েছে:
- অজগরটিকে জাভাস্ক্রিপ্টে রূপান্তর করার সময়-টি পতাকা ব্যবহার করুন যেমন: c ট্রান্সক্রিপট-টি পাইথন.পি (প্রস্তাবিত নয়, তবে সম্ভবত কোনও সমস্যা নয় যদি আপনি পারফরমেন্স সংবেদনশীল কোডের অভ্যন্তরীণ লুপগুলিতে বহুবার সত্যতা পরীক্ষা না করেন ..)
- ব্যবহার করুন
__pragma__(tconv)
বা__pragma__(notconv)
স্থানীয়ভাবে পাইথনের মতো সত্যের মানগুলিতে স্বয়ংক্রিয় রূপান্তর করতে ট্রান্সক্রিপ্ট সংকলকটি বলতে আপনার কোডের মধ্যে মধ্যে ।
- সত্য মানটি পরীক্ষা করার পরিবর্তে, কেবল লেন (মাইলিস্ট)> 0 পরীক্ষা করে সমস্যাটি পুরোপুরি এড়িয়ে চলুন ... সম্ভবত এটি বেশিরভাগ পরিস্থিতিতেই ঠিক থাকবে, আমার হালকা ব্যবহারের জন্য কাজটি কি কাজ করে।
ঠিক আছে, তাই আমার প্রকল্পটি বৃহত্তর হয়ে উঠছিল এবং আমি একটি পারফরম্যান্স লাভের জন্য প্রাক-সংকলন করতে চেয়েছিলাম তবে ব্রাইথনের সাথে এটি করা কঠিন ছিল (যদিও এটি প্রযুক্তিগতভাবে সম্ভব, একটি সহজ উপায় হ'ল অনলাইন সম্পাদক ব্যবহার করা এবং জাভাস্ক্রিপ্ট বোতামটি দেখার জন্য ক্লিক করুন) আউটপুট). আমি এটি করেছি এবং প্রজেক্ট এইচটিএমএল থেকে উত্পন্ন জাভাস্ক্রিপ্টের সাথে লিঙ্ক করেছি তবে এটি কোনও কারণে কার্যকর হয়নি। এছাড়াও, ব্রাইথনের ত্রুটি বার্তাগুলি বুঝতে আমার পক্ষে অসুবিধা হচ্ছে তাই এই পদক্ষেপ ব্যর্থ হওয়ার পরে কোথায় শুরু করব তা আমি জানতাম না। এছাড়াও, আউটপুটযুক্ত কোডের বড় আকার এবং ব্রাইথন ইঞ্জিনের আকারটি আমাকে বাগ করতে শুরু করেছিল। তাই আমি ট্রান্সক্রিপটকে আরও ঘনিষ্ঠভাবে দেখার সিদ্ধান্ত নিয়েছি, যা প্রথমে উচ্চতর গ্রেড বলে মনে হয়েছিল কারণ আমি বোবা নির্দেশগুলি পছন্দ করি যা আমাকে কীভাবে তাত্ক্ষণিকভাবে শুরু করতে হয় তা বলতে (এটি পরে যুক্ত করা হয়েছে)।
পাইথন 3.5 ইনস্টল করার পরে এটি সেট আপ করার মূল বিষয়টি হ'ল:
- পাইথন ৩.৫ প্রকল্প ফোল্ডার স্থাপনের জন্য ভেনু (এটি ভার্চুয়ালেনভের নতুন বিল্ট-ইন সংস্করণের মতো যা প্রতিটি প্রকল্পের জন্য কম জায়গা ব্যবহার করে) (কেবল টাইপ করুন: পাইথন ৩.৫-মি ভেনভ ফোল্ডারনাম - ৩.৫ এর জন্য প্যাকেজ সমস্যাযুক্ত উবুন্টুর জন্য কাজ করুন) )। এটি অন্যান্য জিনিসের মধ্যে একটি বিন সাবফোল্ডার দিয়ে 'ফোল্ডারনাম' তৈরি করে।
- পাইপের সাথে ট্রান্সক্রিপ্ট পাইথন প্যাকেজ ইনস্টল করুন ('ফোল্ডারনাম / বিন / পিপ ইনস্টল ট্রান্সক্রিপ্ট') যা এটি ফোল্ডারনেম / lib / পাইথন 3.5 / সাইট-প্যাকেজ / ট্রান্সক্রিপ্টে ইনস্টল করে।
activate
বর্তমান টার্মিনালটি যদি আপনি প্রতিবার ফোল্ডারনাম / বিন / পাইথন 3.5 এ পুরো পথটি টাইপ করতে না চান। টাইপ করে সক্রিয় করুন: 'উত্স ফোল্ডারনাম / বিন / অ্যাক্টিভেট'
- কোড লিখতে এবং পরীক্ষার জন্য জাভাস্ক্রিপ্টে সংকলন শুরু করুন। আপনি যে ফোল্ডারে নিজের কোডটি লিখেছেন তার মধ্যে থেকেই সংকলন করুন উদাহরণস্বরূপ, আমি ফোল্ডারনাম / www / প্রকল্প ব্যবহার করেছি। সুতরাং সেই ফোল্ডারে সিডি করুন এবং চালান: 'ট্রান্সক্রিপ্ট-বি আপনার_পিথন_স্ক্রিপ্ট.পি'। এটি একটি সাবফোল্ডার নামক আউটপুট রাখে
__javascript__
। তারপরে আপনি আপনার এইচটিএমএল থেকে আউটপুটযুক্ত জাভাস্ক্রিপ্ট লিঙ্ক করতে পারেন।
মূল সমস্যাগুলি জুড়ে চলেছে
আমার বরং সাধারণ প্রয়োজন রয়েছে, তাই আপনার মাইলেজটি আলাদা হতে পারে।
আপনাকে ব্রাইথন বা পাইথন স্ট্যান্ডার্ড ল্যাবকে জাভাস্ক্রিপ্টের সাহায্যে প্রতিস্থাপন করতে হবে। সুতরাং উদাহরণস্বরূপ, 'আমদানি জসন' ব্রাইথন সরবরাহ করেছেন তবে ট্রান্সক্রিপ্টের অধীনে আপনি একটি জাভাস্ক্রিপ্ট লাইব ব্যবহার করতে পারেন বা সরাসরি আপনার পাইথন কোডে JSON.parse / JSON.stringify ব্যবহার করতে পারেন। আপনার অজগর কোডটিতে জাভাস্ক্রিপ্ট লাইব্রেরির একটি সংক্ষিপ্ত সংস্করণ সরাসরি অন্তর্ভুক্ত করতে এই ফর্ম্যাটটি ব্যবহার করুন (ট্রিপল কোটগুলি নোট করুন):
__pragma__ ('js', '{}', '''
// javascript code
''')
ব্রাইথনের এইচটিএমএল নির্দিষ্ট ফাংশন স্পষ্টভাবে ট্রান্সক্রিপ্টের সাথে কাজ করে না। কেবলমাত্র জাভাস্ক্রিপ্টের সাধারণ উপায়গুলি ব্যবহার করুন। উদাহরণস্বরূপ: 1) ব্রাইথনের অধীনে, আপনি 'ডকুমেন্ট [' আইডি ']' ব্যবহার করে কোনও নির্দিষ্ট এইচটিএমএল ট্যাগটি উল্লেখ করতে পারেন, তবে ট্রান্সক্রিপ্টের সাহায্যে আপনি 'ডকুমেন্ট.সেটমেন্টবাইআইডি (' আইডি ') ব্যবহার করবেন (যা আপনি একই পদ্ধতিতে করেন এটি জাভাস্ক্রিপ্ট থেকে)। 2) আপনি 'ডেল নোডনাম' (কোনও বিসিটি যা ব্রাইথন ফাংশন) সহ কোনও নোড মুছতে পারবেন না। 'নোড.প্যারেন্টনোড.রেমভচিল্ড (নোড)' এর মতো কিছু ব্যবহার করুন। 3) জাভাস্ক্রিপ্ট বিকল্পগুলির সাথে ব্রাইথনের সমস্ত ডম ফাংশন প্রতিস্থাপন করুন। যেমন শ্রেণি_নাম = শ্রেণীর নাম; পাঠ্য = পাঠ্য সামগ্রী; এইচটিএমএল = অভ্যন্তরীণ এইচটিএমএল; অভিভাবক = পিতা-মাতা; বাচ্চাদের = চাইল্ডনোড ইত্যাদি I আমি অনুমান করি যে আপনার যদি এমন কিছু প্রয়োজন হয় যা কিছু পুরানো ব্রাউজারগুলির দ্বারা প্রয়োজনীয় বিকল্পগুলি ধারণ করে তবে তার জন্য এখানে জাভাস্ক্রিপ্ট লাইব্রেরি রয়েছে। ৪) ব্রাইথনের সেট_টাইমআউটটি জাভাস্ক্রিপ্টস সেট টাইমআউটের সাথে প্রতিস্থাপিত হয় 5) বিআর () এর মতো ব্রাইথনের এইচটিএমএল ট্যাগগুলির পরিবর্তে আপনার ব্যবহৃত স্থানগুলিকে <= ডোম ম্যানিপুলেশন সিনট্যাক্স ব্যবহার করে পুনরায় করা দরকার। হয় অভ্যন্তরীণ এইচটিএমএল হিসাবে সরল পাঠ্য মার্কআপ ইনজেকশন করুন বা জাভাস্ক্রিপ্ট সিনট্যাক্স ব্যবহার করে উপাদানগুলি তৈরি করুন এবং তারপরে সাধারণ জাভাস্ক্রিপ্ট ডিওএম সিনট্যাক্স ব্যবহার করে এগুলি সংযুক্ত করুন। আমি আরও লক্ষ্য করেছি যে চেকবাক্সগুলির জন্য ব্রাইথন "যদি চেকবক্স = 'চেকড':" ব্যবহার করে তবে ট্রান্সক্রিপট "যদি চেকবক্স:" দিয়ে খুশি হয় .. হয় অভ্যন্তরীণ এইচটিএমএল হিসাবে সরল পাঠ্য মার্কআপ ইনজেকশন করুন বা জাভাস্ক্রিপ্ট সিনট্যাক্স ব্যবহার করে উপাদানগুলি তৈরি করুন এবং তারপরে সাধারণ জাভাস্ক্রিপ্ট ডিওএম সিনট্যাক্স ব্যবহার করে এগুলি সংযুক্ত করুন। আমি আরও লক্ষ্য করেছি যে চেকবাক্সগুলির জন্য ব্রাইথন "যদি চেকবক্স = 'চেকড':" ব্যবহার করে তবে ট্রান্সক্রিপট "যদি চেকবক্স:" দিয়ে খুশি হয় .. হয় অভ্যন্তরীণ এইচটিএমএল হিসাবে সরল পাঠ্য মার্কআপ ইনজেকশন করুন বা জাভাস্ক্রিপ্ট সিনট্যাক্স ব্যবহার করে উপাদানগুলি তৈরি করুন এবং তারপরে সাধারণ জাভাস্ক্রিপ্ট ডিওএম সিনট্যাক্স ব্যবহার করে এগুলি সংযুক্ত করুন। আমি আরও লক্ষ্য করেছি যে চেকবাক্সগুলির জন্য ব্রাইথন "যদি চেকবক্স = 'চেকড':" ব্যবহার করে তবে ট্রান্সক্রিপট "যদি চেকবক্স:" দিয়ে খুশি হয় ..
আমি গত সপ্তাহে একটি 2700 লাইনের প্রকল্পটি সরিয়ে নিয়েছি, এমন সময়ে ট্রান্সক্রিপ্টের কয়েকটি ছোটখাটো জিনিসের সমর্থন ছিল না (যদিও তারা ফিলারগুলির সাথে প্রতিস্থাপনের পক্ষে যথেষ্ট সহজ ছিল), এটি ছিল 1) স্ট্রাইয়ার ব্লুয়ার, স্ট্রিংস্প্লিট (স্ট্রিম)। বিভাজনটি উপস্থিত রয়েছে, তবে মনে হচ্ছে জাভাস্ক্রিপ্ট বিভক্ত, যা পাইথন সংস্করণটির সাথে আলাদাভাবে কাজ করে, আমি যে আচরণের উপর নির্ভর করছিলাম), ২) রাউন্ড (এটি এখন দেব সংস্করণে সমর্থিত বলে মনে হচ্ছে) এবং ৩) আইসনস্ট্যান্স করেনি আরআর, ইনট এবং ফ্লোটে কাজ করবেন না, কেবল ডিক, তালিকা এবং সেট-এ set ৪) ব্রাইথন থেকে আমি অন্য একটি পার্থক্য লক্ষ্য করেছি যে আমি যদি কোনও ডিকের জেএসওএন উপস্থাপনায় টান দিই, আমার 'মাইডিক্ট = ডিক (ডেটা)' ব্যবহার করে এটি করা দরকার, যখন ব্রাইথন 'মাইডিক্ট = ডেটা' দিয়ে খুশি হয়েছিল। তবে এটি ব্রাইথনের 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)
)) এছাড়াও, আপনি 'আই ইন ইন ডিক:' ব্যবহার করে ডিফল্টরূপে ডিক্টগুলি পুনরাবৃত্তি করতে পারবেন না, এটি (সেন্টিমিড লাইন -i বা __pragma__('iconv')
সক্রিয় না করে) তবে আপনি কীগুলি () সদস্য ব্যবহার করে এটি সক্ষম করা এড়াতে পারবেন যেমন:
for key, value in dict.items():
সংক্ষেপ
আমি ব্রাইথন পছন্দ করি কারণ এটির সাথে যাওয়া এবং আপনার কোড পরীক্ষা করা (কেবল F5) সহজ। এটি সত্য পাইথনের কাছাকাছি কারণ বেশিরভাগ মানক লাইব রয়েছে। প্রতিস্থাপন ইঞ্জিন (সম্পাদনা: বা কেউ এটি পাইথন ভিএম হিসাবে দেখতে পাবে) ব্রাউজারে এবং বৃহত আউটপুটযুক্ত জাভাস্ক্রিপ্ট আকারে অন্তর্ভুক্ত করা পছন্দ করি না। যদি আমাকে কিছু করতে হয় (তবে এখনও ব্রাইথন ব্যবহার করে), ব্রাইথন (যা আপনি করতে পারেন ..) থেকে ডিওএমকে হেরফের করার জন্য আমি জাভাস্ক্রিপ্ট পদ্ধতি ব্যবহার করতাম, বরং ব্রাইথন পদ্ধতিগুলিতে এত ঝুঁকির পরিবর্তে কারণ সময়টি অতিক্রম করার সময় নষ্ট হয় আমার প্রয়োজন পরিবর্তন হলে অন্য ট্রান্সপ্লায়ারে।
আমি ট্রান্সক্রিপ্ট পছন্দ করি কারণ আউটপুটযুক্ত জাভাস্ক্রিপ্টটি সত্যই 'পাতলা এবং গড়' এবং কারণ আপনি ব্রাউজারের পক্ষে যে জিনিসটি লোড করেন তা হ'ল আপনার উত্পন্ন জাভাস্ক্রিপ্ট কোড যা আপনার অজগর কোডের মতো আকারের। এটি উত্সম্যাপগুলি সমর্থন করে এবং কারণ এটি আমাকে আউটপুটযুক্ত জাভাস্ক্রিপ্টের উপর নিয়ন্ত্রণের একটি পরিমাপ দেয়। এবং এটি ব্যবহার করে আমাকে অপটিমাইজেশন সম্পর্কে বেশ কিছুটা শিখিয়েছে।
আশা করি এটি কাউকে তাদের বিশেষ প্রকল্পের জন্য ভাল হতে পারে তা দেখতে সহায়তা করে।