উভয় বাস্তবায়নের মধ্যে অনেক মিল রয়েছে (এবং আমার মতে: হ্যাঁ, তারা উভয়ই "ভার্চুয়াল মেশিন")।
একটি জিনিস, তারা উভয় স্ট্যাক-ভিত্তিক ভিএম এর, "রেজিস্টারগুলি" যেমন আমরা x86 বা পাওয়ারপিসির মতো একটি আধুনিক সিপিইউতে দেখতে অভ্যস্ত নই ion সমস্ত অভিব্যক্তির মূল্যায়ন ((1 + 1) / 2) অপারেন্ডগুলিকে "স্ট্যাক" এর দিকে ঠেলা দিয়ে এবং পরে যখন কোনও নির্দেশ (অ্যাড, বিভাজন ইত্যাদি) প্রয়োজন হয় তখন সেই অপারেন্ডগুলি গ্রাস করতে হবে those প্রতিটি নির্দেশ তার ফলাফলগুলি স্ট্যাকের দিকে ঠেলে দেয়।
এটি ভার্চুয়াল মেশিন বাস্তবায়নের একটি সুবিধাজনক উপায়, কারণ বিশ্বের প্রতিটি সিপিইউতে স্ট্যাক থাকে তবে রেজিস্টরের সংখ্যা প্রায়শই আলাদা হয় (এবং কয়েকটি রেজিস্ট্রির বিশেষ উদ্দেশ্য হয়, এবং প্রতিটি নির্দেশিকা বিভিন্ন রেজিস্টারে ইত্যাদির অপারেশনগুলি প্রত্যাশা করে etc )।
সুতরাং, আপনি যদি কোনও বিমূর্ত মেশিনকে মডেল করতে চলেছেন তবে খাঁটি স্ট্যাক-ভিত্তিক মডেলটি যাওয়ার বেশ ভাল উপায়।
অবশ্যই, আসল মেশিনগুলি সেভাবে কাজ করে না। সুতরাং জেআইটি সংকলক বাইটকোড ক্রিয়াকলাপগুলির "নিবন্ধকরণ" সম্পাদনের জন্য দায়বদ্ধ, মূলত আসল সিপিইউ রেজিস্ট্রারগুলিকে অপারেশনগুলি এবং ফলাফলগুলি যখনই সম্ভব ফলাফলগুলি নির্ধারণের জন্য নির্ধারিত করে।
সুতরাং, আমি মনে করি এটি সিএলআর এবং জেভিএম-এর মধ্যে সবচেয়ে বড় সাধারণতা।
মতভেদ হিসাবে ...
দুটি বাস্তবায়নের মধ্যে একটি আকর্ষণীয় পার্থক্য হ'ল সিএলআর জেনেরিক প্রকার তৈরির জন্য নির্দেশাবলী অন্তর্ভুক্ত করে এবং তারপরে সেই ধরণেরগুলিতে প্যারামেট্রিক বিশেষত্ব প্রয়োগের জন্য। সুতরাং, রানটাইমের সময়, সিএলআর একটি তালিকা <তালিকা> একটি তালিকা <স্ট্রিং> থেকে সম্পূর্ণ ভিন্ন ধরণের হিসাবে বিবেচনা করে।
কভারগুলির অধীনে, এটি সমস্ত রেফারেন্স-ধরণের বিশেষায়নের জন্য একই এমএসআইএল ব্যবহার করে (সুতরাং একটি তালিকা <স্ট্রিং> এপিআই সীমানায় বিভিন্ন টাইপ-কাস্ট সহ একটি তালিকা <অবজেক্ট> হিসাবে একই প্রয়োগ ব্যবহার করে), তবে প্রতিটি মান-প্রকারের ব্যবহার করে এর নিজস্ব অনন্য বাস্তবায়ন (তালিকা <দন্ত> তালিকা <ডাবল> থেকে সম্পূর্ণ আলাদা কোড উত্পন্ন করে)।
জাভাতে, জেনেরিক প্রকারগুলি সম্পূর্ণরূপে একটি সংকলক কৌশল। কোন ক্লাসে টাইপ-আর্গুমেন্ট রয়েছে সে সম্পর্কে জেভিএমের ধারণা নেই এবং এটি রানটাইমে প্যারামেট্রিক বিশেষায়িতকরণ করতে অক্ষম।
ব্যবহারিক দৃষ্টিকোণ থেকে, এর অর্থ আপনি জেনেরিক ধরণের ক্ষেত্রে জাভা পদ্ধতিগুলি ওভারলোড করতে পারবেন না। আপনার কাছে একই নামের সাথে দুটি আলাদা পদ্ধতি থাকতে পারে না কেবল তারা তালিকা <স্ট্রিং> বা একটি তালিকা <তারিখ> গ্রহণ করে কিনা তা নিয়ে ভিন্ন ering অবশ্যই, যেহেতু সিএলআর প্যারামিমেট্রিক প্রকার সম্পর্কে জানে, জেনেরিক ধরণের বিশেষায়নের উপর ওভারলোড হওয়া কোনও সমস্যা নেই methods
প্রতিদিনের ভিত্তিতে, এই পার্থক্যটি আমি সিএলআর এবং জেভিএমের মধ্যে সবচেয়ে বেশি লক্ষ্য করি notice
অন্যান্য গুরুত্বপূর্ণ পার্থক্যগুলির মধ্যে রয়েছে:
সিএলআর-এর ক্লোজার রয়েছে (সি # প্রতিনিধি হিসাবে প্রয়োগ করা হয়েছে)। জেভিএম কেবল জাভা 8 এর পরে ক্লোজার সমর্থন করে।
সিএলআরতে কর্টাইন রয়েছে (সি # 'ফলন' কীওয়ার্ড দিয়ে প্রয়োগ করা হয়েছে)। জেভিএম তা করে না।
সিএলআর ব্যবহারকারী কোডকে নতুন মান ধরণের (স্ট্রাক্ট) সংজ্ঞায়িত করার অনুমতি দেয়, যেখানে জেভিএম মান ধরণের (বাইট, সংক্ষিপ্ত, দীর্ঘ, ভাসা, ডাবল, চর, বুলিয়ান) একটি নির্দিষ্ট সংগ্রহ সরবরাহ করে এবং ব্যবহারকারীদের কেবল নতুন রেফারেন্স- সংজ্ঞায়িত করতে দেয় প্রকার (ক্লাস)।
সিএলআর পয়েন্টারগুলি ঘোষিত ও পরিচালনা করার জন্য সহায়তা সরবরাহ করে। এটি বিশেষত আকর্ষণীয় কারণ জেভিএম এবং সিএলআর উভয়ই তাদের স্মৃতি-পরিচালনার কৌশল হিসাবে কঠোর প্রজন্মের সংযোগকারী আবর্জনা সংগ্রহকারী বাস্তবায়নকে নিয়োগ করে। সাধারণ পরিস্থিতিতে, একটি কঠোর সংযোগকারী জিসি পয়েন্টারগুলির সাথে সত্যিই কঠিন সময় দেয় কারণ আপনি যখন একটি মানের অবস্থান থেকে অন্য মেমরিতে স্থানান্তর করেন তখন সমস্ত পয়েন্টার (এবং পয়েন্টারগুলিতে পয়েন্টার) অবৈধ হয়ে যায়। তবে সিএলআর একটি "পিনিং" প্রক্রিয়া সরবরাহ করে যাতে বিকাশকারীরা কোডের একটি ব্লক ঘোষণা করতে পারে যার মধ্যে সিএলআরকে নির্দিষ্ট পয়েন্টার স্থানান্তরিত করার অনুমতি দেওয়া হয় না। এটা খুব সুবিধাজনক।
জেভিএমের কোডের বৃহত্তম ইউনিটটি হয় 'প্যাকেজ' যা 'সুরক্ষিত' কীওয়ার্ড দ্বারা প্রমাণিত হয় বা তর্কিতভাবে একটি জেআর (অর্থাত্ জাভা আর্কাইভ) শ্রেণিপথে একটি জার নির্দিষ্ট করে রাখতে সক্ষম হয় এবং এটি ফোল্ডারের মতো আচরণ করে কোডের। সিএলআর-তে ক্লাসগুলি 'অ্যাসেমব্লিগুলিতে' একত্রিত হয় এবং সিএলআর অ্যাসেমব্লিগুলি সম্পর্কে বিতর্ক ও পরিচালনা করার জন্য যুক্তি সরবরাহ করে (যা "অ্যাপডোমাইনস" এ লোড করা হয়, মেমরি বরাদ্দকরণ এবং কোড প্রয়োগের জন্য সাব-অ্যাপ্লিকেশন-স্তরের স্যান্ডবক্স সরবরাহ করে)।
সিএলআর বাইটকোড ফর্ম্যাট (এমএসআইএল নির্দেশাবলী এবং মেটাডেটা সমন্বিত) তে জেভিএমের চেয়ে কম নির্দেশের ধরণ রয়েছে। জেভিএম-এ, প্রতিটি অনন্য ক্রিয়াকলাপের (দুটি int মান যোগ করুন, দুটি ভাসমান মান যুক্ত করুন ইত্যাদি) এর নিজস্ব অনন্য নির্দেশ রয়েছে। সিএলআর-তে, সমস্ত এমএসআইএল নির্দেশাবলী বহুমুখী (দুটি মান যুক্ত করুন) এবং জেআইটি সংকলক অপারেটরগুলির ধরণ নির্ধারণ এবং উপযুক্ত মেশিন কোড তৈরি করার জন্য দায়বদ্ধ। তবে আমি জানি না কোনটি পছন্দনীয় কৌশল strategy দুজনেরই বাণিজ্য রয়েছে। হটস্পট জেআইটি সংকলক, জেভিএম এর জন্য, একটি সহজ কোড-প্রজন্মের পদ্ধতি ব্যবহার করতে পারে (এটি অপারেণ্ডের ধরণগুলি নির্ধারণ করার প্রয়োজন হয় না, কারণ তারা ইতিমধ্যে নির্দেশে এনকোডেড রয়েছে), তবে এর অর্থ এটি আরও জটিল বাইকোড ফর্ম্যাটের প্রয়োজন, আরও নির্দেশের ধরণের সাথে।
আমি প্রায় দশ বছর ধরে জাভা ব্যবহার করছি (এবং জেভিএমকে প্রশংসা করছি)।
তবে, আমার মতে, সিএলআর এখন প্রায় প্রতিটি ক্ষেত্রেই উচ্চতর বাস্তবায়ন।