সংক্ষিপ্ত উত্তর : আপনি একটি সংকলিত, সংযুক্ত এক্সিকিউটেবল অনুবাদ করতে পারবেন না। প্রযুক্তিগতভাবে সম্ভব হলেও এটি সম্পাদন করা অত্যন্ত অসম্ভব (নীচে দেখুন)। তবে আপনার যদি সমাবেশের উত্স ফাইল থাকে (নির্দেশাবলী এবং লেবেলযুক্ত) তবে এটি করা খুব সম্ভব (যদিও আপনি যদি কোনওভাবে সমাবেশের উত্সটি অর্জন করেন তবে প্রোগ্রামটি যদি সমাবেশে না লেখা হয় তবে আপনার মূল প্রোগ্রামের উত্স কোড হিসাবে থাকা উচিত) ভাল, যাতে আপনি বিভিন্ন আর্কিটেকচারটি শুরু করার জন্য এটি সংকলন করা ভাল হন)।
দীর্ঘ উত্তর :
কিউইএমইউ এবং অন্যান্য ইমুলেটরগুলি উড়ানের নির্দেশাবলীটি অনুবাদ করতে পারে এবং তাই এটি কম্পিউটারে নির্বাহযোগ্য চালানো যায় যা এটি সঙ্কলন করা হয়নি। প্রক্রিয়াটি ত্বরান্বিত করার জন্য উড়ানের পরিবর্তে এই অনুবাদটি কেন আগে না?
আমি জানি এটি নীতিগতভাবে সহজ বলে মনে হতে পারে, তবে বাস্তবে এটি কয়েকটি প্রধান কারণে প্রায় অসম্ভব। শুরু করার জন্য, বিভিন্ন নির্দেশিকা সেটগুলিতে মূলত পৃথক অ্যাড্রেসিং মোড, বিভিন্ন অপকোড স্ট্রাকচার, বিভিন্ন শব্দের আকার এবং কিছুতে আপনার প্রয়োজনীয় নির্দেশিকাও নেই।
ধরা যাক আপনাকে XYZ
আরও দুটি নির্দেশাবলীর সাথে নির্দেশকে প্রতিস্থাপন করতে হবে ABC
এবং DEF
। এখন আপনি সেই কার্যকর অবস্থান থেকে সমস্ত প্রোগ্রামের সমস্ত আপেক্ষিক / অফসেটের ঠিকানাগুলি কার্যকরভাবে স্থানান্তরিত করেছেন, সুতরাং আপনাকে বিশ্লেষণ করে পুরো প্রোগ্রামটি দিয়ে যেতে হবে এবং অফসেটগুলি (পরিবর্তনের আগে এবং পরে উভয়ই) আপডেট করতে হবে। এখন, আসুন যাক অফসেটগুলির মধ্যে একটিতে উল্লেখযোগ্যভাবে পরিবর্তন ঘটে - এখন আপনাকে অ্যাড্রেসিং মোডগুলি পরিবর্তন করতে হবে, যা ঠিকানার আকার পরিবর্তন করতে পারে। এটি আপনাকে পুরো ফাইলটি পুনরায় স্ক্যান করতে এবং সমস্ত ঠিকানাগুলি পুনরায় গণনা করতে বাধ্য করবে এবং এরপরে এবং চতুর্থ।
আপনি যখন অ্যাসেম্বলি প্রোগ্রামগুলি লেখেন, আপনি লেবেলগুলি ব্যবহার করতে পারেন, তবে সিপিইউ করে না - যখন ফাইলটি একত্র করা হয়, সমস্ত লেবেল আপেক্ষিক, পরম বা অফসেটের লোকেশন হিসাবে গণনা করা হয়। আপনি দেখতে পাচ্ছেন কেন এটি দ্রুত তুচ্ছ কাজ হয়ে ওঠে এবং অসম্ভবের পরেও। একটি একক নির্দেশ প্রতিস্থাপনের জন্য আপনাকে এগিয়ে যাওয়ার আগে কয়েকবার পুরো প্রোগ্রামটি পেরিয়ে যেতে হবে।
আমার সমাবেশ সম্পর্কে কিছুটা সীমাবদ্ধ জ্ঞান থেকে, এমওভি, এডিডি এবং অন্যান্যগুলির মতো বেশিরভাগ নির্দেশাবলী আর্কিটেকচার জুড়ে বহনযোগ্য হওয়া উচিত।
হ্যাঁ, তবে আমি উপরে বর্ণিত বিষয়গুলি দেখুন। মেশিনের শব্দের আকার সম্পর্কে কী? ঠিকানার দৈর্ঘ্য? এটির কি একই ঠিকানা ঠিকানা রয়েছে? আবার, আপনি কেবল নির্দেশাবলী "সন্ধান এবং প্রতিস্থাপন" করতে পারবেন না। প্রোগ্রামের প্রতিটি বিভাগের একটি নির্দিষ্টভাবে সংজ্ঞায়িত ঠিকানা থাকে। যখন কোনও প্রোগ্রাম একত্রিত হয় তখন অন্যান্য লেবেলে জাম্পগুলি আক্ষরিক বা অফসেট মেমরি ঠিকানার সাথে প্রতিস্থাপন করা হয়।
সমস্ত মেশিন টুরিং সম্পূর্ণ হওয়ার কারণে যে কোনও কিছুতে সরাসরি ম্যাপিং নেই এমন কিছু নির্দেশাবলীর ম্যাপ করা যেতে পারে। এটি করা কি খুব জটিল হবে? আমি কি অপরিচিত এমন কোনও কারণে এটি কি কাজ করবে না? এটি কি কাজ করে তবে এমুলেটর ব্যবহারের চেয়ে ভাল ফল পাওয়া যায় না?
আপনি 100% সঠিক যে উভয়ই সম্ভব এবং এটি আরও দ্রুত হবে । যাইহোক, এটি সম্পাদন করার জন্য একটি প্রোগ্রাম লেখা অবিশ্বাস্যরূপে কঠিন এবং অত্যন্ত অসম্ভব, যদি আমি উপরে উল্লিখিত সমস্যাগুলি বাদ দিয়ে কিছু না করি।
আপনার যদি আসল সমাবেশের উত্স কোডটি থাকে তবে মেশিন কোডটি অন্য নির্দেশ সেট আর্কিটেকচারে অনুবাদ করা তুচ্ছ হবে। মেশিন কোড নিজেই, একত্রিত হয় , সুতরাং সমাবেশ উত্স ব্যতীত (যার মধ্যে মেমরির ঠিকানাগুলি গণনা করতে ব্যবহৃত বিভিন্ন লেবেল রয়েছে) এটি অবিশ্বাস্যরূপে শক্ত হয়ে যায়। আবার কোনও একক নির্দেশ পরিবর্তন করা পুরো প্রোগ্রামের মেমরি অফসেটগুলিকে পরিবর্তন করতে পারে এবং ঠিকানাগুলি পুনরায় গণনা করার জন্য কয়েকশো পাসের প্রয়োজন হয়।
কয়েক হাজার নির্দেশ সহ একটি প্রোগ্রামের জন্য এটি কয়েক লক্ষ পাসের ক্ষেত্রে না হলেও দশকের প্রয়োজন হবে। অপেক্ষাকৃত ছোট প্রোগ্রামগুলির জন্য, এটি সম্ভব হতে পারে তবে মনে রাখবেন যে প্রোগ্রামে মেশিনের নির্দেশের সংখ্যা সহ পাসের সংখ্যা তাত্পর্যপূর্ণভাবে বৃদ্ধি পাবে। পর্যাপ্ত আকারের কোনও প্রোগ্রামের জন্য এটি অসম্ভবের কাছাকাছি।