সংক্ষিপ্ত বিবরণ
একটি অনুবাদক ভাষার জন্য এক্স একটি প্রোগ্রাম (বা একটি মেশিন, বা শুধু সাধারণ প্রক্রিয়া কোন ধরণের) যে কোনও প্রোগ্রাম executes হয় পি ভাষায় লেখা এক্স যেমন যে এটিকে প্রভাব সঞ্চালন করে এবং হিসেবে স্পেসিফিকেশন দ্বারা নির্ধারিত ফলাফল মূল্যায়ন এক্স । সিপিইউগুলি সাধারণত তাদের নিজ নিজ নির্দেশাবলীর সেটগুলির জন্য দোভাষী হয় যদিও আধুনিক উচ্চ-পারফরম্যান্স ওয়ার্কস্টেশন সিপিইউগুলি আসলে এর চেয়ে জটিল complex তাদের প্রকৃতপক্ষে একটি অন্তর্নিহিত মালিকানাধীন ব্যক্তিগত নির্দেশ সেট থাকতে পারে এবং হয় অনুবাদ (সংকলন) বা বহিরাগতভাবে দৃশ্যমান পাবলিক নির্দেশাবলী সেটটি ব্যাখ্যা করতে পারে।
একটি কম্পাইলার থেকে এক্স থেকে ওয়াই একটি প্রোগ্রাম (বা একটি মেশিন, বা শুধু সাধারণ প্রক্রিয়া কোন ধরণের) যে কোনও প্রোগ্রাম অনুবাদ হয় পি কিছু ভাষা থেকে এক্স একটি শব্দার্থগতভাবে সমতুল্য প্রোগ্রামে P ' কিছু ভাষায় ওয়াই এমনভাবে যে শব্দার্থবিদ্যা প্রোগ্রামটির সংরক্ষণ করা হয়, অর্থাত্ হ'ল পি pre এর জন্য দোভাষী দ্বারা ওয়াই এর জন্য একই ফলাফল পাওয়া যাবে এবং এক্স এর জন্য একজন দোভাষীর সাথে পি এর ব্যাখ্যা করার মতোই প্রভাব ফেলবে । (দ্রষ্টব্য যে এক্স এবং ওয়াই একই ভাষা হতে পারে))
পদ এগিয়ে অফ টাইম (AOT) এবং জাস্ট-ইন-টাইম (জে আই টি JIT) পড়ুন যখন সংকলন সঞ্চালিত: "সময়" ঐ পদ উল্লেখ করা "রানটাইম", হয় অর্থাত একটি JIT কম্পাইলার প্রোগ্রাম প্রনয়ন হিসাবে এটা চলমান , একটি এওটি সংকলক চলমান হওয়ার আগে প্রোগ্রামটি সংকলন করে । নোট করুন যে এর জন্য প্রয়োজন যে কোনও জেআইটি X থেকে ভাষা Y এর সংকলককে অবশ্যই কোনওভাবে Y ভাষার জন্য অনুবাদকের সাথে একসাথে কাজ করতে হবে, অন্যথায় প্রোগ্রাম চালানোর কোনও উপায় থাকত না। (সুতরাং, উদাহরণস্বরূপ, একটি জেআইটি সংকলক যা জাভাস্ক্রিপ্টকে x86 মেশিন কোডে সংকলন করে এটি একটি x86 সিপিইউ ব্যতীত কোনও অর্থবোধ করে না; এটি চলমান সময় প্রোগ্রামটি সংকলন করে, তবে x86 সিপিইউ ছাড়া প্রোগ্রামটি চলবে না))
নোট করুন যে এই পার্থক্য দোভাষীদের জন্য অর্থবোধ করে না: একটি দোভাষী প্রোগ্রামটি চালান। এওটি ইন্টারপ্রেটারের ধারণা যা কোনও প্রোগ্রাম চালুর আগেই চালায় বা জেআইটি ইন্টারপ্রেটার যা কোনও প্রোগ্রাম চলাকালীন চালিত হয় তা অযৌক্তিক।
তাহলে আমাদের আছে:
- এওটি সংকলক: চলার আগে সংকলন করে
- জেআইটি সংকলক: চলমান চলাকালীন সংকলন করে
- দোভাষী: রান
জেআইটি সংকলক
জেআইটি সংকলকগুলির পরিবারের মধ্যে, তারা ঠিক কখন সংকলন করেন, কত ঘন ঘন এবং কী গ্রানুলারিটি হয় তার বিষয়ে এখনও অনেকগুলি পার্থক্য রয়েছে ।
মাইক্রোসফ্টের সিএলআর জেআইটি সংকলক উদাহরণস্বরূপ কেবল একবার কোড সংকলন করে (যখন এটি লোড করা হয়) এবং একবারে পুরো সমাবেশটি সংকলন করে। অন্যান্য সংকলকগণ প্রোগ্রামটি চলাকালীন তথ্য সংগ্রহ করতে পারে এবং নতুন তথ্য উপলব্ধ হওয়ার সাথে সাথে কোডটি পুনরায় সংশোধন করতে পারে যা তাদের এটি আরও ভাল করে তুলতে দেয়। কিছু জেআইটি সংকলক এমনকি কোড ডি-অপ্টিমাইজ করতে সক্ষম । এখন, আপনি নিজেকে জিজ্ঞাসা করতে পারেন যে কেন কেউ কখনও এটি করতে চায়? ডি-অপ্টিমাইজিং আপনাকে খুব আক্রমণাত্মক অপ্টিমাইজেশানগুলি সম্পাদন করতে দেয় যা সম্ভবত অনিরাপদ হতে পারে: যদি এটি প্রমাণিত হয় যে আপনি খুব আক্রমণাত্মক হয়েছিলেন তবে আপনি আবার ফিরে আসতে পারেন, অন্যদিকে, একটি জেআইটি সংকলক যা অপ্টিমাইজ করতে পারে না, আপনি চালাতে পারবেন না প্রথম স্থানে আক্রমণাত্মক অপ্টিমাইজেশন।
জেআইটি সংকলকরা হয় হয় এক সাথে কোডের কিছু স্ট্যাটিক ইউনিট সংকলন করতে পারে (একটি মডিউল, একটি শ্রেণি, একটি ফাংশন, একটি পদ্ধতি,…; এগুলিকে সাধারণত মেথড-এ-এ-টাইম জেআইটি বলা হয় ) উদাহরণস্বরূপ, তারা ডায়নামিকের সন্ধান করতে পারে গতিশীল ট্রেস (সাধারণত লুপগুলি) অনুসন্ধান করার জন্য কোড কার্যকর করা যা তারা পরে সংকলন করবে (এগুলিকে ট্রেসিং জেআইটি বলা হয় )।
দোভাষী এবং সংকলক সংমিশ্রণ
দোভাষী এবং সংকলক একটি একক ভাষা নির্বাহ ইঞ্জিনে একত্রিত হতে পারে। দুটি সাধারণ পরিস্থিতি যেখানে এটি করা হয়।
থেকে একটি AOT কম্পাইলার মিশ্রন এক্স থেকে ওয়াই জন্য একজন দোভাষী সঙ্গে ওয়াই । এখানে সাধারণত X হ'ল কিছু উচ্চ-স্তরের ভাষা মানুষের দ্বারা পাঠযোগ্যতার জন্য অনুকূলিত, যেখানে Yএকটি কমপ্যাক্ট ভাষা (প্রায়শই একধরনের বাইটকোড) মেশিনগুলির দ্বারা ব্যাখ্যার জন্য অনুকূলিত। উদাহরণস্বরূপ, সিপথন পাইথন এক্সিকিউশন ইঞ্জিনে একটি এওটি সংকলক রয়েছে যা পাইথন বাইককোডে পাইথন উত্সকোড এবং সিপিথন বাইটকোডকে ব্যাখ্যা করে এমন একটি দোভাষীকে সংকলন করে। তেমনিভাবে, ইএআরভি রুবি এক্সিকিউশন ইঞ্জিনে একটি এওটি সংকলক রয়েছে যা রুবি সোর্সকোডকে ইএআরভি বাইটকোড এবং একটি ইন্টারপ্রেটার সংকলন করে যা ইএআরভি বাইটকোডকে ব্যাখ্যা করে। আপনি এটি কেন করতে চান? রুবি এবং পাইথন উভয়ই অত্যন্ত উচ্চ-স্তরের এবং কিছুটা জটিল ভাষা, তাই আমরা প্রথমে এগুলিকে এমন একটি ভাষায় সংকলন করি যা পার্স করা সহজ এবং ব্যাখ্যা করতে সহজ, এবং তারপরে সেই ভাষার ব্যাখ্যা করি ।
একটি দোভাষী এবং সংকলক একত্রিত করার অন্য উপায় হ'ল একটি মিশ্র-মোড এক্সিকিউশন ইঞ্জিন। এখানে আমরা একই ভাষা প্রয়োগের "দুটি" মোড " একসাথে, অর্থাৎ এক্স এর জন্য একজন অনুবাদক এবং X থেকে Y পর্যন্ত একটি JIT সংকলক । (সুতরাং, এখানে পার্থক্যটি হ'ল উপরের ক্ষেত্রে, আমাদের একাধিক "পর্যায়ে" প্রোগ্রামটি সংকলন করে প্রোগ্রামটি সংকলন করে তারপরে ফলাফলটি অনুবাদককে খাওয়ানো হয়েছিল, এখানে আমরা একই ভাষায় দু'জন পাশাপাশি কাজ করছি) । ) একটি সংকলক দ্বারা সংকলিত কোডটি একজন দোভাষী দ্বারা নির্বাহ করা কোডের চেয়ে দ্রুত চালিত হয়, তবে আসলে কোডটি সংকলন করতে প্রথমে সময় লাগে (এবং বিশেষত আপনি যদি কোডটি ভারীভাবে চালিত করতে চান তবেসত্যিই দ্রুত, এটি অনেক সময় নেয় )। সুতরাং, এবার ব্রিজ করার জন্য যেখানে জেআইটি সংকলক কোড সংকলনে ব্যস্ত, সেখানে দোভাষী ইতিমধ্যে কোডটি চালানো শুরু করতে পারেন এবং জেআইটি সংকলন শেষ হয়ে গেলে, আমরা এক্সিকিউশনটিকে সংকলিত কোডে স্যুইচ করতে পারি। এর অর্থ হ'ল আমরা সংকলিত কোডের সর্বোত্তম সম্ভাব্য পারফরম্যান্স দুটিই পেয়েছি, তবে সংকলনটি শেষ হওয়ার জন্য আমাদের অপেক্ষা করতে হবে না এবং আমাদের অ্যাপ্লিকেশনটি সরাসরি চলতে শুরু করে (যদিও যতটা দ্রুত করা যায় তত দ্রুত নয়)।
এটি আসলে একটি মিশ্র-মোড এক্সিকিউশন ইঞ্জিনের কেবলমাত্র সহজতম অ্যাপ্লিকেশন। আরও আকর্ষণীয় সম্ভাবনাগুলি উদাহরণস্বরূপ, এখনই সংকলন শুরু না করা, তবে দোভাষীকে কিছুটা চালিয়ে দেওয়া, এবং পরিসংখ্যান সংগ্রহ, তথ্য সম্পর্কিত তথ্য, টাইপ তথ্য, নির্দিষ্ট শর্তাধীন শাখা গ্রহণের সম্ভাবনা সম্পর্কে তথ্য, কোন পদ্ধতিগুলি বলা হয় প্রায়শই ইত্যাদি এবং তারপরে এই গতিশীল তথ্যটি সংকলককে ফিড করুন যাতে এটি আরও অনুকূলিত কোড তৈরি করতে পারে। আমি উপরে উল্লিখিত ডি-অপ্টিমাইজেশন বাস্তবায়নেরও এটি একটি উপায়: যদি এটি প্রমাণিত হয় যে আপনি অনুকূলিতকরণের ক্ষেত্রে খুব আগ্রাসী ছিলেন, আপনি কোডটি ফেলে দিতে পারেন এবং ব্যাখ্যাতে ফিরে যেতে পারেন। হটস্পট জেভিএম উদাহরণস্বরূপ এটি করে। এটিতে জেভিএম বাইটকোডের জন্য দু'জন অনুবাদক পাশাপাশি জেভিএম বাইটকোডের সংকলক রয়েছে। (আসলে,দুটি সংকলক!)
এই দুটি পদ্ধতির একত্রিত করাও সম্ভব এবং বাস্তবে প্রচলিত: দুটি পর্যায় প্রথমটি একটি এওটি সংকলক যা X থেকে Y এর সংকলন করে এবং দ্বিতীয় পর্বটি একটি মিশ্র-মোড ইঞ্জিন যা উভয়ই Y এর ব্যাখ্যা করে এবং Y কে Z তে সংকলন করে । রুবিনিয়াস রুবি এক্সিকিউশন ইঞ্জিনটি এইভাবে কাজ করে, উদাহরণস্বরূপ: এটিতে একটি এওটি সংকলক রয়েছে যা রুবি সোর্সকোডকে রুবিনিয়াস বাইটকোড এবং একটি মিশ্র-মোড ইঞ্জিন সংকলন করে যা প্রথমে রুবিনিয়াস বাইটকোডকে ব্যাখ্যা করে এবং একবার কিছু তথ্য সংগ্রহ করার পরে এটি প্রায়শই বলা হয়ে থাকে পদ্ধতিগুলিকে দেশীয় ভাষায় সংকলন করে মেশিন কোড.
দ্রষ্টব্য যে মিক্সড-মোড এক্সিকিউশন ইঞ্জিনের ক্ষেত্রে দোভাষী যে ভূমিকা পালন করে, যেমন দ্রুত প্রারম্ভিক সরবরাহ সরবরাহ করে এবং সম্ভাব্যভাবে তথ্য সংগ্রহ এবং ফ্যালব্যাকের ক্ষমতা সরবরাহের ক্ষেত্রে বিকল্প হিসাবে দ্বিতীয় জেআইটি সংকলকও অভিনয় করতে পারে। উদাহরণস্বরূপ, ভি 8 এইভাবে কাজ করে। ভি 8 কখনই ব্যাখ্যা করে না, এটি সর্বদা সংকলন করে। প্রথম সংকলকটি খুব দ্রুত, খুব স্লিম সংকলক যা খুব দ্রুত শুরু হয়। যদিও এটি উত্পন্ন কোডটি খুব দ্রুত নয়। এই সংকলকটি উত্পাদন করে এমন কোডের মধ্যেও প্রোফাইলিং কোডটি ইনজেক্ট করে। অন্য সংকলকটি ধীর এবং আরও মেমরি ব্যবহার করে তবে আরও দ্রুত কোড তৈরি করে এবং এটি প্রথম সংকলক দ্বারা সংকলিত কোড চালিয়ে সংগ্রহ করা প্রোফাইলিং তথ্য ব্যবহার করতে পারে।