সংক্ষিপ্ত উত্তরটি হ'ল: আপনি আপনার সন্দেহের প্রতি ঠিকই আছেন, আপনার সর্বদা এক্সে লেখা অন্য অনুবাদক বা ওয়াই থেকে অন্য কোনও ভাষায় একটি সংকলক প্রয়োজন যার জন্য আপনার ইতিমধ্যে একটি দোভাষী রয়েছে। দোভাষী অনুবাদকগণ মৃত্যুদন্ড কার্যকর করে, সংকলকরা কেবলমাত্র একটি ভাষা থেকে অন্য ভাষায় অনুবাদ করে, আপনার সিস্টেমে কোনও পর্যায়ে, একজন দোভাষী থাকতে হবে… এমনকি এটি কেবল সিপিইউ।
আপনি Y ভাষাতে কতগুলি নতুন অনুবাদক লিখেন তা না কেন , আপনি সর্বদা এক্সে লিখিত প্রথম দোভাষীকে পরবর্তী দোভাষীদের ব্যাখ্যার জন্য ব্যবহার করতে যাবেন । এটি কেবল দোভাষীদের প্রকৃতির কারণে সমস্যা বলে মনে হচ্ছে।
সঠিক। আপনি যা করতে পারেন তা হ'ল Y থেকে X (বা অন্য কোনও ভাষা যার জন্য আপনার একজন দোভাষী আছে) লিখুন, এবং আপনি এমনকি ওয়াইতে এটি করতে পারেন । তারপর আপনি আপনার চালাতে পারেন ওয়াই কম্পাইলার লেখা ওয়াই উপর ওয়াই অনুবাদক লেখা এক্স (বা ওয়াই অনুবাদক লেখা ওয়াই চলমান ওয়াই অনুবাদক লেখা এক্স , বা ওয়াই অনুবাদক লেখা ওয়াই চলমান ওয়াই অনুবাদক লেখা ওয়াই চলমান ওয়াইলেখা অনুবাদক এক্স , অথবা ... সীমাহীনভাবে) আপনার কম্পাইল করার ওয়াই অনুবাদক লেখা ওয়াই থেকে এক্স , যাতে আপনি তারপর তে এটি নির্বাহ করতে পারেন এক্স অনুবাদক। এইভাবে, আপনি এক্সে লেখা আপনার ওয়াই ইন্টারপ্রেটারকে ছাড়িয়ে গেছেন , তবে এখন আপনার এক্স এক্স ইন্টারপ্রিটারের প্রয়োজন (আমরা জানি যে ইতিমধ্যে আমাদের একজন রয়েছে, যদিও অন্যথায় আমরা Y তে লেখা এক্স ইন্টারপ্রেটার চালাতে পারিনি ), এবং আপনি প্রথমে একটি ওয়াই- টু- এক্স- কম্পাইলার লিখতে হয়েছিল ।
যাইহোক , উল্টানো দিক থেকে, দোভাষীদের উইকিপিডিয়া নিবন্ধটি আসলে স্ব-হোস্টিং দোভাষীদের নিয়ে কথা বলে। এখানে একটি ছোট অংশ যা প্রাসঙ্গিক:
একজন স্ব-দোভাষী একজন প্রোগ্রামিং ভাষার অনুবাদক যা একটি প্রোগ্রামিং ভাষায় রচিত যা নিজের ব্যাখ্যা করতে পারে; একটি উদাহরণ বেসিক লিখিত একটি বেসিক দোভাষী। স্ব-দোভাষীরা স্ব-হোস্টিং সংকলকগুলির সাথে সম্পর্কিত।
ভাষার ব্যাখ্যা দেওয়ার জন্য যদি কোনও সংকলক উপস্থিত না থাকে তবে একটি স্ব-অনুবাদক তৈরি করার জন্য একটি হোস্ট ভাষায় ভাষার প্রয়োগকরণ প্রয়োজন (যা অন্য কোনও প্রোগ্রামিং ভাষা বা এসেইম্বার হতে পারে)। এর মতো প্রথম দোভাষী থাকার মাধ্যমে, সিস্টেমটি বুটস্ট্র্যাপ করা হয় এবং অনুবাদকের নতুন সংস্করণ ভাষাতেই তৈরি করা যায়
এটি ঠিক কীভাবে করা হবে তা এখনও আমার কাছে পরিষ্কার নয়। দেখে মনে হচ্ছে যে যাই হোক না কেন, আপনি সর্বদা হোস্ট ভাষায় লিখিত আপনার দোভাষীর প্রথম সংস্করণটি ব্যবহার করতে বাধ্য হবেন।
সঠিক। নোট করুন যে উইকিপিডিয়া নিবন্ধটি স্পষ্টতই বলেছে যে আপনার নিজের ভাষার দ্বিতীয় বাস্তবায়ন প্রয়োজন , এবং এটি প্রথমটি থেকে মুক্তি পেতে পারে না তা বলে।
এখন উপরে উল্লিখিত নিবন্ধটি অন্য একটি নিবন্ধের লিঙ্কে উইকিপিডিয়াতে স্ব-হোস্টিং দোভাষী হিসাবে অনুমিত কিছু উদাহরণ দেয়। যদিও কাছাকাছি পরিদর্শন করার পরে, এটি মনে হয় যে সেই স্ব-হোস্টিং দোভাষী (বিশেষত পিপি বা রুবিনিয়াসের মতো আরও কিছু সাধারণ) এর বেশিরভাগের মূল "দোভাষী" আসলে অন্যান্য ভাষা যেমন সি ++ বা সি-তে রচিত actually
আবার, সঠিক। সেগুলি সত্যই খারাপ উদাহরণ। উদাহরণস্বরূপ, রুবিনিয়াস নিন। হ্যাঁ, এটি সত্য যে রুবিনিয়াসের রুবি অংশটি স্ব-হোস্টেড, তবে এটি একটি সংকলক, কোনও অনুবাদক নয়: এটি রুবি সোর্স কোডটি রুবিনিয়াস বাইটকোডে সংকলন করে। দোভাষী অংশ OTOH স্ব-হোস্টেড নয়: এটি রুবিনিয়াস বাইটকোডকে ব্যাখ্যা করে তবে এটি সি ++ তে লেখা হয়। সুতরাং, Rubinius কলিং একটি "স্ব-হোস্ট করা ব্যাখ্যাকারী" ভুল হল: স্ব-হোস্ট করা অংশ একটি নয় ব্যাখ্যাকারী , এবং অনুবাদক অংশ নয় স্ব-হোস্ট করা ।
পাইপাই অনুরূপ, তবে আরও বেশি ভুল: এটি পাইথনে এমনকি প্রথম স্থানে লেখা হয় নি, এটি আরপিটাইনে লেখা হয়েছে, এটি একটি ভিন্ন ভাষা। এটি সিন্থেটিকভাবে পাইথনের অনুরূপ, শব্দার্থগতভাবে একটি "বর্ধিত উপসেট", তবে এটি জাভা হিসাবে একই বিমূর্ত স্তরে মোটামুটি একটি স্ট্যাটিকালি-টাইপড ভাষা এবং এর প্রয়োগটি একাধিক ব্যাকেন্ডের সাথে একটি সংকলক যা সি সোর্স কোড, ইসকামাস্ক্রিপ্টে আরপিথনকে সংকলিত করে উত্স কোড, সিআইএল বাইট কোড, জেভিএম বাইটকোড বা পাইথন উত্সকোড।
সুতরাং আমি কি উপরে বর্ণিত সম্ভব? কোনও স্ব-হোস্ট দোভাষী তার মূল হোস্টের থেকে আলাদা হতে পারে? যদি তা হয় তবে ঠিক কীভাবে এটি করা হত?
না, নিজে থেকে নয়। আপনাকে হয় মূল দোভাষী রাখতে হবে বা একটি সংকলক লিখতে হবে এবং আপনার স্ব-অনুবাদক সংকলন করতে হবে।
সেখানে হয় যেমন কিছু মেটা-বিজ্ঞপ্তি ভার্চুয়াল মেশিনের, ক্লেইন (লেখা স্বয়ং ) এবং Maxine থেকে (জাভা লেখা)। নোট, তবে, এখানে "মেটা-সার্কুলার" এর সংজ্ঞাটি এখনও অন্যরকম: এই ভিএমগুলি তাদের চালিত ভাষায় লেখা হয় না : ক্লেইন সেল্ফ বাইটকোড চালায় তবে সেল্ফে লেখা হয়, ম্যাক্সাইন জেভিএম বাইটকোড চালায় তবে জাভাতে লেখা হয়। যাইহোক, VM- র স্বয়ং / জাভা সোর্স কোড আসলে স্বয়ং / জেভিএম বাইটকোড করার কম্পাইল করা এবং তারপর VM- র দ্বারা সঞ্চালিত, তাই সময় দ্বারা VM- র মৃত্যুদন্ড কার্যকর করা, এটা হল ভাষাটি এটিকে executes হবে। ইসস।
এটিও লক্ষ করুন যে এটি ভিএমএস থেকে আলাদা যেমন সেকিয়াকভিএম এবং জাইকস আরভিএম । জিক্স জাভাতে লেখা হয় এবং স্কেয়াকভিএম স্ল্যাং-এ লেখা হয় (স্মলটালকের একটি স্ট্যাটিচালি টাইপড সিনট্যাকটিক এবং সিনমেটিক সাবসেট প্রায় উচ্চ স্তরের এসেমব্লারারের মতো একই বিমূর্ত স্তরের উপর), এবং উভয় স্টেটিকালি স্থানীয় কোডে চালিত হওয়ার আগে সংকলিত হয়ে যায়। তারা নিজের ভিতরে দৌড়ায় না। তবে আপনি এগুলি নিজের উপরের (বা অন্য একটি স্মলটাক ভিএম / জেভিএম শীর্ষে) চালাতে পারেন । তবে এটি এই অর্থে "মেটা-সার্কুলার" নয়।
ম্যাক্সাইন এবং ক্লিন, ওটিওএইচ করুনতাদের ভিতরে চালানো; তারা তাদের নিজস্ব বাস্তবায়ন ব্যবহার করে নিজস্ব বাইকোড কার্যকর করে। এটাই সত্যি মাইন্ডবেন্ডিং! এটি কিছু শীতল অপ্টিমাইজেশনের সুযোগ দেয়, উদাহরণস্বরূপ, যেহেতু ভিএম ব্যবহারকারী প্রোগ্রামের সাথে একত্রে নিজেকে সম্পাদন করে, এটি ব্যবহারকারী প্রোগ্রাম থেকে ভিএম এবং তার বিপরীতে কলগুলি ইনলাইন করতে পারে, যেমন আবর্জনা সংগ্রহকারীকে কল করতে বা মেমরি বরাদ্দকারীকে ব্যবহারকারীর মধ্যে অন্তর্ভুক্ত করা যেতে পারে কোড এবং ব্যবহারকারী কোডে প্রতিফলিত কলব্যাকগুলি ভিএম-তে অন্তর্ভুক্ত করা যেতে পারে। এছাড়াও, আধুনিক ভিএমগুলি যে সমস্ত চতুর অপ্টিমাইজেশন ট্রিকস ব্যবহার করে, যেখানে তারা এক্সিকিউটিভ প্রোগ্রামটি দেখে এবং প্রকৃত কাজের চাপ এবং ডেটার উপর নির্ভর করে এটি অনুকূলিত করে, ব্যবহারকারী প্রোগ্রামের সময় ব্যবহারকারী প্রোগ্রাম কার্যকর করার সময় ভিএম সেই একই কৌশলগুলি নিজেকে প্রয়োগ করতে পারে নির্দিষ্ট কাজের চাপ চালাচ্ছে। অন্য কথায়, VM- র অত্যন্ত জন্য নিজেই বিশেষ করেবিশেষ প্রোগ্রাম যে নির্দিষ্ট কাজের চাপ চলছে ।
তবে, লক্ষ্য করুন যে আমি উপরে "দোভাষী" শব্দের ব্যবহারকে ঘিরে ফেলেছি এবং সর্বদা "চালানো" ব্যবহার করি? ঠিক আছে, এই ভিএমগুলি দোভাষীদের চারপাশে নির্মিত নয়, তারা (জেআইটি) সংকলকগুলির চারপাশে নির্মিত are পরে ম্যাক্সিনে একজন দোভাষা যুক্ত হয়েছিল, তবে আপনার সর্বদা সংকলকটি দরকার: আপনাকে অন্য ভিএম এর শীর্ষে একবারে ভিএম চালাতে হবে (যেমন ম্যাক্সাইনের ক্ষেত্রে ওরাকল হটস্পট), যাতে ভিএম নিজেই সংকলন করতে পারে (জেআইটি)। ম্যাক্সিনের ক্ষেত্রে এটি জেআইটি তার নিজস্ব বুটআপ পর্বটি সংকলন করবে, তারপরে সেই বুটস্ট্র্যাপ ভিএম ইমেজে সংকলিত নেটিভ কোডটি সিরিয়াল করে দেবে এবং সামনে খুব সাধারণ বুটলোডারটি আটকে থাকবে (সি-তে লেখা ভিএমের একমাত্র উপাদান, যদিও এটি কেবল সুবিধার জন্য) , এটি জাভাতেও হতে পারে)। এখন আপনি নিজে এক্সিকিউট করতে ম্যাক্সাইন ব্যবহার করতে পারেন।