এখানে কমপক্ষে দুটি পৃথক সম্ভাব্য প্রশ্ন রয়েছে বলে মনে হয়। একটি সাধারণভাবে সংকলক সম্পর্কে আসলে জাভা মূলত জেনারটির একটি উদাহরণ। অন্যটি জাভা সম্পর্কিত নির্দিষ্ট বাইট কোডগুলি ব্যবহার করে তা আরও নির্দিষ্ট।
সাধারণভাবে সংকলকগণ
আসুন প্রথমে সাধারণ প্রশ্নটি বিবেচনা করা যাক: কেন একটি সংকলক কিছু নির্দিষ্ট প্রসেসরের উপর চালানোর জন্য উত্স কোড সংকলনের প্রক্রিয়ায় কিছু মধ্যবর্তী উপস্থাপনা ব্যবহার করবে?
জটিলতা হ্রাস
এর একটি উত্তর মোটামুটি সহজ: এটি একটি ও (এন * এম) সমস্যাটিকে ও (এন + এম) সমস্যায় রূপান্তর করে।
যদি আমাদের এন উত্স ভাষা এবং এম লক্ষ্যগুলি দেওয়া হয় এবং প্রতিটি সংকলক সম্পূর্ণ স্বতন্ত্র হয় তবে আমাদের সেই সমস্ত উত্স ভাষাগুলিকে সমস্ত লক্ষ্যগুলিতে অনুবাদ করার জন্য এন * এম সংকলকগুলির প্রয়োজন (যেখানে "টার্গেট" একটি সংমিশ্রণের মতো কিছু is প্রসেসর এবং ওএস)।
তবে, যদি এই সমস্ত সংকলক একটি সাধারণ মধ্যবর্তী উপস্থাপনার সাথে একমত হন তবে আমাদের সাথে N সংকলকটি প্রান্ত হতে পারে যা উত্সের ভাষাগুলি অন্তর্বর্তী উপস্থাপনায় অনুবাদ করে এবং এম সংকলকটির শেষে প্রান্তিক প্রতিনিধিত্বকে একটি নির্দিষ্ট লক্ষ্যের জন্য উপযুক্ত কিছুতে অনুবাদ করে।
সমস্যা বিভাজন
আরও ভাল, এটি সমস্যাটি আরও দুটি বা কম এক্সক্লুসিভ ডোমেনে পৃথক করে। ভাষার ডিজাইন, পার্সিং এবং এর মতো বিষয়গুলি সম্পর্কে যারা জানেন / জানেন তারা সংকলক সম্মুখের প্রান্তে মনোনিবেশ করতে পারেন, অন্যদিকে যারা নির্দেশিকা সেট, প্রসেসরের নকশা এবং এর মতো জিনিসগুলি জানেন তারা পিছনের প্রান্তে মনোনিবেশ করতে পারেন।
সুতরাং, উদাহরণস্বরূপ, এলএলভিএম এর মতো কিছু দেওয়া, আমাদের বিভিন্ন বিভিন্ন ভাষার জন্য প্রচুর সম্মুখ প্রান্ত রয়েছে। আমাদের প্রচুর প্রসেসরের প্রচুর ব্যাক-এন্ড রয়েছে। কোনও ভাষার লোক তার ভাষার জন্য একটি নতুন ফ্রন্ট-এন্ড লিখতে পারে এবং দ্রুত প্রচুর লক্ষ্যগুলি সমর্থন করে। একজন প্রসেসর লোক ভাষা নকশা, পার্সিং ইত্যাদি ব্যবহার না করেই তার টার্গেটের জন্য একটি নতুন ব্যাক-এন্ড লিখতে পারে guy
দু'জনের মধ্যে যোগাযোগের জন্য একটি মধ্যবর্তী প্রতিনিধিত্ব করে একটি সামনের প্রান্ত এবং পিছনের প্রান্তে সংকলকগুলি পৃথক করা জাভা দিয়ে আসল নয়। এটি দীর্ঘকাল ধরে বেশ সাধারণ অভ্যাস ছিল (যেহেতু জাভা বরাবর আসার আগে, যাইহোক)।
বিতরণ মডেল
এই ক্ষেত্রে জাভা যে পরিমাণে নতুন কিছু যুক্ত করেছিল, তা ছিল বিতরণ মডেলটিতে। বিশেষত, যদিও সংকলকগুলি দীর্ঘ সময়ের জন্য অভ্যন্তরীণভাবে সম্মুখ-প্রান্ত এবং ব্যাক-এন্ড টুকরাগুলিতে পৃথক করা হয়েছে, সেগুলি সাধারণত একক পণ্য হিসাবে বিতরণ করা হয়েছিল। উদাহরণস্বরূপ, আপনি যদি একটি মাইক্রোসফ্ট সি সংকলক কিনে থাকেন তবে অভ্যন্তরীণভাবে এটিতে একটি "সি 1" এবং একটি "সি 2" ছিল যা যথাক্রমে সম্মুখ-প্রান্ত এবং ব্যাক-এন্ড ছিল - তবে আপনি যা কিনেছিলেন তা কেবল "মাইক্রোসফ্ট সি" ছিল যার মধ্যে উভয়ই অন্তর্ভুক্ত ছিল টুকরা (একটি "সংকলক ড্রাইভার" যা উভয়ের মধ্যে ক্রিয়াকলাপ সমন্বিত করে) যদিও সংকলকটি দুটি টুকরোতে নির্মিত হয়েছিল, একটি সাধারণ বিকাশকারীকে এই সংকলকটি ব্যবহার করে এটি কেবলমাত্র একক জিনিস যা উত্স কোড থেকে অবজেক্ট কোডে অনুবাদ করেছিল, যার মধ্যে কিছুই দৃশ্যমান ছিল না।
জাভা পরিবর্তে জাভা ডেভেলপমেন্ট কিটে ফ্রন্ট-এন্ড এবং জাভা ভার্চুয়াল মেশিনে ব্যাক-এন্ড বিতরণ করেছে। প্রতিটি জাভা ব্যবহারকারীর কাছে তিনি যে কোনও সিস্টেম ব্যবহার করছেন তা লক্ষ্য করতে একটি সংকলক ছিল। জাভা বিকাশকারীরা মধ্যবর্তী ফর্ম্যাটে কোড বিতরণ করেছিলেন, সুতরাং যখন কোনও ব্যবহারকারী এটি লোড করেন, তখন জেভিএম তাদের নির্দিষ্ট মেশিনে এটি কার্যকর করার জন্য যা প্রয়োজন তা করেছিল did
প্রিসিডেন্ট
নোট করুন যে এই বিতরণ মডেলটি সম্পূর্ণ নতুন ছিল না। শুধু উদাহরণস্বরূপ, UCSD পি-সিস্টেম একভাবে কাজ: কম্পাইলার সামনে প্রান্ত উত্পাদিত পি-কোড, এবং পি-ব্যবস্থার প্রতিটি কপি একটি ভার্চুয়াল মেশিনের যে করেনি কি সেই বিশেষ লক্ষ্যে P- কোড চালানো প্রয়োজন ছিল অন্তর্ভুক্ত 1 ।
জাভা বাইট-কোড
জাভা বাইট কোড পি-কোডের সাথে বেশ মিল। এটি মূলত মোটামুটি সহজ মেশিনের জন্য নির্দেশাবলী । এই মেশিনটি বিদ্যমান মেশিনগুলির বিমূর্ততা হিসাবে চিহ্নিত, সুতরাং প্রায় কোনও নির্দিষ্ট লক্ষ্যে দ্রুত অনুবাদ করা মোটামুটি সহজ। অনুবাদের সহজলভ্যতা প্রথম দিকে গুরুত্বপূর্ণ ছিল কারণ মূল উদ্দেশ্যটি ছিল বাইট কোডগুলি ব্যাখ্যা করা, অনেকটা পি-সিস্টেম যেমন করেছিল (এবং, হ্যাঁ, প্রথম দিকের বাস্তবায়নগুলি ঠিক এভাবেই কাজ করেছিল)।
শক্তি
কম্পাইলার ফ্রন্ট-এন্ড উত্পাদন করতে জাভা বাইট কোড সহজ। যদি (উদাহরণস্বরূপ) আপনার কাছে একটি অভিব্যক্তি উপস্থাপন করার জন্য মোটামুটি সাধারণ গাছ থাকে তবে সাধারণত গাছটি পেরিয়ে যাওয়া বেশ সহজ এবং আপনি প্রতিটি নোডে যা খুঁজে পান তার থেকে মোটামুটি কোড উত্পন্ন করে।
জাভা বাইট কোডগুলি বেশ কমপ্যাক্ট - বেশিরভাগ ক্ষেত্রে সর্বাধিক সাধারণ প্রসেসরের জন্য সোর্স কোড বা মেশিন কোডের চেয়ে অনেক বেশি কমপ্যাক্ট (এবং বিশেষত বেশিরভাগ আরআইএসসি প্রসেসরের ক্ষেত্রে যেমন সান যখন জাভা ডিজাইনের সময় বিক্রি করেছিল স্পার)। এটি সেই সময়ে বিশেষভাবে গুরুত্বপূর্ণ ছিল, কারণ জাভার একটি প্রধান উদ্দেশ্যটি অ্যাপলেটগুলি সমর্থন করেছিল - ওয়েব পৃষ্ঠাগুলিতে এমবেডেড কোড যা মৃত্যুর আগেই ডাউনলোড করা হত - এমন সময়ে যখন বেশিরভাগ লোক ফোন লাইনের মাধ্যমে মডেমের মাধ্যমে প্রায় 28.8 এ প্রবেশ করেছিল। প্রতি সেকেন্ডে কিলোবাইট (যদিও, এখনও বয়স্ক, ধীর মোডেম ব্যবহার করে এমন বেশ কিছু লোক ছিল)।
দুর্বলতা
জাভা বাইট কোডগুলির প্রধান দুর্বলতা হ'ল তারা বিশেষভাবে ভাবপ্রবণ নয়। যদিও তারা জাভাতে উপস্থিত ধারণাগুলি বেশ ভালভাবে প্রকাশ করতে পারে তবে জাভা অংশ নয় এমন ধারণাগুলি প্রকাশের জন্য তারা প্রায় এতটা ভাল কাজ করে না। তেমনিভাবে, বেশিরভাগ মেশিনে বাইট কোডগুলি কার্যকর করা সহজ, যে কোনও নির্দিষ্ট মেশিনের পুরো সুবিধা নেয় এমনভাবে এটি করা আরও শক্ত।
উদাহরণস্বরূপ, এটি অত্যন্ত নিয়মিত যে আপনি যদি সত্যিই জাভা বাইট কোডগুলি অপ্টিমাইজ করতে চান তবে আপনি মূলত কোনও মেশিন-কোড থেকে উপস্থাপনের মতো পিছন দিকে অনুবাদ করার জন্য কিছু বিপরীত প্রকৌশল করেন এবং তাদের এসএসএ নির্দেশাবলী (বা অনুরূপ কিছু) 2 এ ফিরিয়ে দেন । তারপরে আপনি আপনার অপ্টিমাইজেশানটি করার জন্য এসএসএ নির্দেশিকাগুলি ম্যানিপুলেট করেন, তারপরে সেখান থেকে এমন কোনও জায়গায় অনুবাদ করুন যা আপনার প্রকৃত যত্ন নেওয়া আর্কিটেকচারকে লক্ষ্য করে। এমনকি এটি বরং জটিল প্রক্রিয়া সহ, জাভা বিদেশী কিছু ধারণা যে বেশিরভাগ সাধারণ মেশিনে সর্বোত্তমভাবে চলমান (এমনকি কাছাকাছি) মেশিন কোডে কিছু উত্স ভাষাগুলি থেকে অনুবাদ করা মুশকিল যে যথেষ্ট কঠিন তা প্রকাশ করা বেশ কঠিন।
সারাংশ
আপনি যদি সাধারণভাবে মধ্যবর্তী উপস্থাপনাগুলি কেন ব্যবহার করতে চান তবে দুটি প্রধান কারণ হ'ল:
- একটি ও (এন * এম) সমস্যা একটি ও (এন + এম) সমস্যা হ্রাস করুন, এবং
- সমস্যাটিকে আরও পরিচালনাযোগ্য টুকরো টুকরো করুন।
আপনি যদি জাভা বাইট কোডের বিশদ সম্পর্কে জিজ্ঞাসা করছেন এবং কেন তারা অন্য কোনওটির পরিবর্তে এই নির্দিষ্ট প্রতিনিধিত্বকে বেছে নিয়েছে, তবে আমি বলব যে উত্তরটি মূলত তাদের মূল উদ্দেশ্য এবং ওয়েবে সীমাবদ্ধতার দিকে ফিরে আসে , নিম্নলিখিত অগ্রাধিকার অগ্রণী:
- কমপ্যাক্ট উপস্থাপনা।
- দ্রুত এবং ডিকোড করা এবং কার্যকর করা সহজ।
- বেশিরভাগ সাধারণ মেশিনে দ্রুত এবং কার্যকর করা সহজ।
বিভিন্ন ভাষার প্রতিনিধিত্ব করতে বা বিভিন্ন লক্ষ্যে সর্বোত্তমভাবে সম্পাদন করতে সক্ষম হওয়াই ছিল অনেক কম অগ্রাধিকার (যদি সেগুলিকে অগ্রাধিকার হিসাবে বিবেচনা করা হত)।
- তাহলে পি-সিস্টেম কেন বেশিরভাগই ভুলে যায়? বেশিরভাগ মূল্যের পরিস্থিতি। অ্যাপল দ্বিতীয়, কমোডর সুপারপেটস ইত্যাদিতে পি-সিস্টেমটি বেশ শালীনভাবে বিক্রি হয়েছিল, যখন আইবিএম পিসি বেরিয়েছে, পি-সিস্টেমটি একটি সমর্থিত ওএস ছিল, তবে এমএস-ডস ব্যয় কম (বেশিরভাগ লোকের দৃষ্টিকোণ থেকে, মূলত ফ্রিতে ফেলে দেওয়া হয়েছিল) এবং মাইক্রোসফ্ট এবং আইবিএম (অন্যদের মধ্যে) যা লিখেছিল তাড়াতাড়িই আরও প্রোগ্রাম উপলব্ধ ছিল।
- উদাহরণস্বরূপ, সোট এভাবে কাজ করে।