জাভা ভার্চুয়াল মেশিন এবং সিএলআর


140

এমএসআইএল এবং জাভা বাইটকোডের মধ্যে পার্থক্য নামক একটি প্রশ্ন অনুসরণ করে ? , জাভা ভার্চুয়াল মেশিন কীভাবে বনাম কাজ করে তার মধ্যে (প্রধান) পার্থক্য বা মিল কী.NET ফ্রেমওয়ার্ক প্রচলিত ভাষা রানটাইম (সিএলআর) কাজ করে?

এছাড়াও, হয় .NET ফ্রেমওয়ার্ক সিএলআর একটি "ভার্চুয়াল মেশিন" বা এটিতে কোনও ভার্চুয়াল মেশিনের বৈশিষ্ট্য নেই?


ঠিক আছে, আপনি যদি পছন্দ মতো এবং পছন্দ করেন তবে আপনার প্রশ্নটি ভিএম এবং সিএলআর (প্রচলিত ভাষা রানটাইম) এর মধ্যে পার্থক্য হিসাবে চিহ্নিত করা উচিত, যা ভিএম-এর সরাসরি অনুষঙ্গ।
ক্লিটাস

উত্তর:


278

উভয় বাস্তবায়নের মধ্যে অনেক মিল রয়েছে (এবং আমার মতে: হ্যাঁ, তারা উভয়ই "ভার্চুয়াল মেশিন")।

একটি জিনিস, তারা উভয় স্ট্যাক-ভিত্তিক ভিএম এর, "রেজিস্টারগুলি" যেমন আমরা x86 বা পাওয়ারপিসির মতো একটি আধুনিক সিপিইউতে দেখতে অভ্যস্ত নই ion সমস্ত অভিব্যক্তির মূল্যায়ন ((1 + 1) / 2) অপারেন্ডগুলিকে "স্ট্যাক" এর দিকে ঠেলা দিয়ে এবং পরে যখন কোনও নির্দেশ (অ্যাড, বিভাজন ইত্যাদি) প্রয়োজন হয় তখন সেই অপারেন্ডগুলি গ্রাস করতে হবে those প্রতিটি নির্দেশ তার ফলাফলগুলি স্ট্যাকের দিকে ঠেলে দেয়।

এটি ভার্চুয়াল মেশিন বাস্তবায়নের একটি সুবিধাজনক উপায়, কারণ বিশ্বের প্রতিটি সিপিইউতে স্ট্যাক থাকে তবে রেজিস্টরের সংখ্যা প্রায়শই আলাদা হয় (এবং কয়েকটি রেজিস্ট্রির বিশেষ উদ্দেশ্য হয়, এবং প্রতিটি নির্দেশিকা বিভিন্ন রেজিস্টারে ইত্যাদির অপারেশনগুলি প্রত্যাশা করে etc )।

সুতরাং, আপনি যদি কোনও বিমূর্ত মেশিনকে মডেল করতে চলেছেন তবে খাঁটি স্ট্যাক-ভিত্তিক মডেলটি যাওয়ার বেশ ভাল উপায়।

অবশ্যই, আসল মেশিনগুলি সেভাবে কাজ করে না। সুতরাং জেআইটি সংকলক বাইটকোড ক্রিয়াকলাপগুলির "নিবন্ধকরণ" সম্পাদনের জন্য দায়বদ্ধ, মূলত আসল সিপিইউ রেজিস্ট্রারগুলিকে অপারেশনগুলি এবং ফলাফলগুলি যখনই সম্ভব ফলাফলগুলি নির্ধারণের জন্য নির্ধারিত করে।

সুতরাং, আমি মনে করি এটি সিএলআর এবং জেভিএম-এর মধ্যে সবচেয়ে বড় সাধারণতা।

মতভেদ হিসাবে ...

দুটি বাস্তবায়নের মধ্যে একটি আকর্ষণীয় পার্থক্য হ'ল সিএলআর জেনেরিক প্রকার তৈরির জন্য নির্দেশাবলী অন্তর্ভুক্ত করে এবং তারপরে সেই ধরণেরগুলিতে প্যারামেট্রিক বিশেষত্ব প্রয়োগের জন্য। সুতরাং, রানটাইমের সময়, সিএলআর একটি তালিকা <তালিকা> একটি তালিকা <স্ট্রিং> থেকে সম্পূর্ণ ভিন্ন ধরণের হিসাবে বিবেচনা করে।

কভারগুলির অধীনে, এটি সমস্ত রেফারেন্স-ধরণের বিশেষায়নের জন্য একই এমএসআইএল ব্যবহার করে (সুতরাং একটি তালিকা <স্ট্রিং> এপিআই সীমানায় বিভিন্ন টাইপ-কাস্ট সহ একটি তালিকা <অবজেক্ট> হিসাবে একই প্রয়োগ ব্যবহার করে), তবে প্রতিটি মান-প্রকারের ব্যবহার করে এর নিজস্ব অনন্য বাস্তবায়ন (তালিকা <দন্ত> তালিকা <ডাবল> থেকে সম্পূর্ণ আলাদা কোড উত্পন্ন করে)।

জাভাতে, জেনেরিক প্রকারগুলি সম্পূর্ণরূপে একটি সংকলক কৌশল। কোন ক্লাসে টাইপ-আর্গুমেন্ট রয়েছে সে সম্পর্কে জেভিএমের ধারণা নেই এবং এটি রানটাইমে প্যারামেট্রিক বিশেষায়িতকরণ করতে অক্ষম।

ব্যবহারিক দৃষ্টিকোণ থেকে, এর অর্থ আপনি জেনেরিক ধরণের ক্ষেত্রে জাভা পদ্ধতিগুলি ওভারলোড করতে পারবেন না। আপনার কাছে একই নামের সাথে দুটি আলাদা পদ্ধতি থাকতে পারে না কেবল তারা তালিকা <স্ট্রিং> বা একটি তালিকা <তারিখ> গ্রহণ করে কিনা তা নিয়ে ভিন্ন ering অবশ্যই, যেহেতু সিএলআর প্যারামিমেট্রিক প্রকার সম্পর্কে জানে, জেনেরিক ধরণের বিশেষায়নের উপর ওভারলোড হওয়া কোনও সমস্যা নেই methods

প্রতিদিনের ভিত্তিতে, এই পার্থক্যটি আমি সিএলআর এবং জেভিএমের মধ্যে সবচেয়ে বেশি লক্ষ্য করি notice

অন্যান্য গুরুত্বপূর্ণ পার্থক্যগুলির মধ্যে রয়েছে:

  • সিএলআর-এর ক্লোজার রয়েছে (সি # প্রতিনিধি হিসাবে প্রয়োগ করা হয়েছে)। জেভিএম কেবল জাভা 8 এর পরে ক্লোজার সমর্থন করে।

  • সিএলআরতে কর্টাইন রয়েছে (সি # 'ফলন' কীওয়ার্ড দিয়ে প্রয়োগ করা হয়েছে)। জেভিএম তা করে না।

  • সিএলআর ব্যবহারকারী কোডকে নতুন মান ধরণের (স্ট্রাক্ট) সংজ্ঞায়িত করার অনুমতি দেয়, যেখানে জেভিএম মান ধরণের (বাইট, সংক্ষিপ্ত, দীর্ঘ, ভাসা, ডাবল, চর, বুলিয়ান) একটি নির্দিষ্ট সংগ্রহ সরবরাহ করে এবং ব্যবহারকারীদের কেবল নতুন রেফারেন্স- সংজ্ঞায়িত করতে দেয় প্রকার (ক্লাস)।

  • সিএলআর পয়েন্টারগুলি ঘোষিত ও পরিচালনা করার জন্য সহায়তা সরবরাহ করে। এটি বিশেষত আকর্ষণীয় কারণ জেভিএম এবং সিএলআর উভয়ই তাদের স্মৃতি-পরিচালনার কৌশল হিসাবে কঠোর প্রজন্মের সংযোগকারী আবর্জনা সংগ্রহকারী বাস্তবায়নকে নিয়োগ করে। সাধারণ পরিস্থিতিতে, একটি কঠোর সংযোগকারী জিসি পয়েন্টারগুলির সাথে সত্যিই কঠিন সময় দেয় কারণ আপনি যখন একটি মানের অবস্থান থেকে অন্য মেমরিতে স্থানান্তর করেন তখন সমস্ত পয়েন্টার (এবং পয়েন্টারগুলিতে পয়েন্টার) অবৈধ হয়ে যায়। তবে সিএলআর একটি "পিনিং" প্রক্রিয়া সরবরাহ করে যাতে বিকাশকারীরা কোডের একটি ব্লক ঘোষণা করতে পারে যার মধ্যে সিএলআরকে নির্দিষ্ট পয়েন্টার স্থানান্তরিত করার অনুমতি দেওয়া হয় না। এটা খুব সুবিধাজনক।

  • জেভিএমের কোডের বৃহত্তম ইউনিটটি হয় 'প্যাকেজ' যা 'সুরক্ষিত' কীওয়ার্ড দ্বারা প্রমাণিত হয় বা তর্কিতভাবে একটি জেআর (অর্থাত্ জাভা আর্কাইভ) শ্রেণিপথে একটি জার নির্দিষ্ট করে রাখতে সক্ষম হয় এবং এটি ফোল্ডারের মতো আচরণ করে কোডের। সিএলআর-তে ক্লাসগুলি 'অ্যাসেমব্লিগুলিতে' একত্রিত হয় এবং সিএলআর অ্যাসেমব্লিগুলি সম্পর্কে বিতর্ক ও পরিচালনা করার জন্য যুক্তি সরবরাহ করে (যা "অ্যাপডোমাইনস" এ লোড করা হয়, মেমরি বরাদ্দকরণ এবং কোড প্রয়োগের জন্য সাব-অ্যাপ্লিকেশন-স্তরের স্যান্ডবক্স সরবরাহ করে)।

  • সিএলআর বাইটকোড ফর্ম্যাট (এমএসআইএল নির্দেশাবলী এবং মেটাডেটা সমন্বিত) তে জেভিএমের চেয়ে কম নির্দেশের ধরণ রয়েছে। জেভিএম-এ, প্রতিটি অনন্য ক্রিয়াকলাপের (দুটি int মান যোগ করুন, দুটি ভাসমান মান যুক্ত করুন ইত্যাদি) এর নিজস্ব অনন্য নির্দেশ রয়েছে। সিএলআর-তে, সমস্ত এমএসআইএল নির্দেশাবলী বহুমুখী (দুটি মান যুক্ত করুন) এবং জেআইটি সংকলক অপারেটরগুলির ধরণ নির্ধারণ এবং উপযুক্ত মেশিন কোড তৈরি করার জন্য দায়বদ্ধ। তবে আমি জানি না কোনটি পছন্দনীয় কৌশল strategy দুজনেরই বাণিজ্য রয়েছে। হটস্পট জেআইটি সংকলক, জেভিএম এর জন্য, একটি সহজ কোড-প্রজন্মের পদ্ধতি ব্যবহার করতে পারে (এটি অপারেণ্ডের ধরণগুলি নির্ধারণ করার প্রয়োজন হয় না, কারণ তারা ইতিমধ্যে নির্দেশে এনকোডেড রয়েছে), তবে এর অর্থ এটি আরও জটিল বাইকোড ফর্ম্যাটের প্রয়োজন, আরও নির্দেশের ধরণের সাথে।

আমি প্রায় দশ বছর ধরে জাভা ব্যবহার করছি (এবং জেভিএমকে প্রশংসা করছি)।

তবে, আমার মতে, সিএলআর এখন প্রায় প্রতিটি ক্ষেত্রেই উচ্চতর বাস্তবায়ন।


73
বন্ধকরণ এবং জেনারেটরগুলি একটি ভাষা পর্যায়ে প্রয়োগ করা হয় এবং কেবল সিএলআর স্তরের শ্রেণি হিসাবে প্রতিনিধিত্ব করা হয়।
কর্ট হ্যাগেনলোচার

2
তারা কীভাবে গাদাটি পরিচালনা করে তার মধ্যে পার্থক্য সম্পর্কে কী? সিএলআর ওএস / হোস্ট প্রোকের উপর বেশি নির্ভরশীল যখন জেভিএম কমবেশি পুরোপুরি হিপ মেমরি পরিচালনা করে।
কেলি এস ফরাসী

6
একটি গুরুত্বপূর্ণ পার্থক্য হ'ল ইন-টাইম সংকলন (সিএলআর) এবং (ওরাকল / সান) জেভিএম-এ অভিযোজিত অপ্টিমাইজেশনের মধ্যে বিপরীতে।
এডউইন ডালোরজো

1
জাভা এর স্থানীয় ভেরিয়েবল স্লটগুলি অনেকটা রেজিস্টারের মতোই কাজ করে। তবে জেআইটি স্থানীয় স্লট এবং স্ট্যাকটিকে সত্যিকারের রেজিস্টারে রূপান্তরিত করার পরে এটি সবই ছাপিয়ে যায়।
এন্টিমোনি

1
@কোহাজায়ান কারণ সিএলআর চালু হওয়ার সময়, জেভিএম 10 বছর বয়সী ছিল। এটি আইটি দীর্ঘ সময়। ১৯৯৩ সালে যখন জেভিএম আসল তখন কোনও গুরুতর প্রতিযোগী ছিল না, সিএলআর (২০০৩) এর জন্য একটি পরিপক্ক এবং দৃ solid় জেভিএম ছিল শিল্পে শক্তিশালী পা রাখে।
সাধারণ ফেলো

25

আপনার প্রথম প্রশ্নটি জেভিএমকে। নেট ফ্রেমওয়ার্কের সাথে তুলনা করছে - আমি ধরে নিলাম আপনি আসলে সিএলআর এর সাথে তুলনা করতে চেয়েছিলেন। যদি তা হয় তবে আমি মনে করি আপনি এটিতে একটি ছোট বই লিখতে পারেন ( EDIT: দেখে মনে হচ্ছে বেনজির ইতিমধ্যে রয়েছে :-)

একটি গুরুত্বপূর্ণ পার্থক্য হ'ল সিএলআরটি ভাষা-নিরপেক্ষ আর্কিটেকচার হিসাবে তৈরি করা হয়েছে, জেভিএম-এর বিপরীতে।

আর একটি গুরুত্বপূর্ণ পার্থক্য হ'ল সিএলআরটি বিশেষভাবে দেশীয় কোডের সাথে একটি উচ্চ স্তরের আন্তঃযোগিতা করার অনুমতি দেওয়ার জন্য ডিজাইন করা হয়েছিল। এর অর্থ হ'ল সিএলআর অবশ্যই নেতিবাচকতা এবং সুরক্ষা পরিচালনা করতে হবে যখন নেটিভ মেমোরি অ্যাক্সেস এবং সংশোধিত হয় এবং সিএলআর ভিত্তিক ডেটা স্ট্রাকচার এবং নেটিভ ডেটা স্ট্রাকচারের মধ্যে মার্শেলিং পরিচালনা করে

আপনার দ্বিতীয় প্রশ্নের উত্তর দেওয়ার জন্য, "ভার্চুয়াল মেশিন" শব্দটি হার্ডওয়্যার জগতের একটি পুরানো শব্দ (যেমন আইবিএমের ভার্চুয়ালাইজেশন ১৯ 360০ এর দশকে )৮০) যা একই ধরণের কাজটি সম্পাদন করতে অন্তর্নিহিত মেশিনের একটি সফ্টওয়্যার / হার্ডওয়্যার অনুকরণ বোঝায় used ভিএমওয়্যার করে এমন স্টাফ

সিএলআরকে প্রায়শই "এক্সিকিউশন ইঞ্জিন" হিসাবে উল্লেখ করা হয়। এই প্রসঙ্গে, এটি একটি এক্স 86 এর শীর্ষে একটি আইএল মেশিনের একটি বাস্তবায়ন। এটি জেভিএমও তাই করে, যদিও আপনি যুক্তি দিতে পারেন যে সিএলআর এর পলিমারফিক বাইটোকোড এবং জেভিএম-র টাইপড বাইকোডগুলির মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে।

সুতরাং আপনার দ্বিতীয় প্রশ্নের পেডেন্টিক উত্তরটি "না"। তবে আপনি কীভাবে এই দুটি পদকে সংজ্ঞা দিচ্ছেন তা সত্যিই নেমে আসে।

সম্পাদনা: জেভিএম এবং সিএলআরের মধ্যে আরও একটি পার্থক্য হ'ল জেভিএম (সংস্করণ)) বরাদ্দ হওয়া মেমরি অপারেটিং সিস্টেমে ফিরিয়ে দিতে খুব অনিচ্ছুক , এমনকি যেখানে এটি পারে।

উদাহরণস্বরূপ, ধরা যাক যে একটি জেভিএম প্রক্রিয়া অপারেটিং সিস্টেম থেকে শুরুতে 25 এমবি মেমরি শুরু করে এবং বরাদ্দ করে। অ্যাপ্লিকেশন কোডটি এমন বরাদ্দগুলি চেষ্টা করে যা অতিরিক্ত 50 এমবি প্রয়োজন। জেভিএম অপারেটিং সিস্টেম থেকে অতিরিক্ত 50 এমবি বরাদ্দ করবে। একবার অ্যাপ্লিকেশন কোডটি সেই মেমরিটি ব্যবহার করা বন্ধ করে দিলে এটি আবর্জনা সংগ্রহ করা হয় এবং জেভিএম হিপ আকার হ্রাস পাবে। তবে, জেভিএম কেবলমাত্র নির্দিষ্ট কিছু নির্দিষ্ট পরিস্থিতিতে বরাদ্দ হওয়া অপারেটিং সিস্টেম মেমরিটি মুক্ত করবে । অন্যথায়, প্রক্রিয়াটির আজীবন সেই স্মৃতি বরাদ্দ থাকবে।

অন্যদিকে, সিএলআর যদি আর প্রয়োজন না হয় তবে অপারেটিং সিস্টেমে বরাদ্দকৃত মেমরিটি ছেড়ে দেয়। উপরের উদাহরণে, সিএলআর গাদা কমে যাওয়ার পরে মেমরিটি ছেড়ে দিত।


2
এটি নিখুঁতভাবে ঠিক নয় যে জেভিএম বরাদ্দ মেমরি মুক্ত করবে না। প্রমাণের জন্য এই প্রশ্নের আমার উত্তর দেখুন: স্ট্যাকওভারফ্লো
মাইকেল বর্গওয়ার্ট ২

উইন্ডোজটিতে জেভিএম রিটার্ন মেমরিটি দেখেছি।
স্টিভ কুও

আমি আমার উত্তরটি পরিবর্তন করে বললাম যে জেভিএম 6 রেন এবং মাইকেল এর উত্তরগুলির লিঙ্ক সহ মেমরি প্রকাশ করতে খুব নারাজ। আমি জেভিএম 5 এর সাথে এই আচরণটি কখনই দেখিনি, তাই সম্ভবত সংস্করণটি আরও অনিচ্ছুক ছিল।
এইচটিটিপি 410

আপনি কী আবরণ করতে পারেন যে সিএলআর পিতামাতার প্রক্রিয়ার উপর নির্ভর করে যখন কীভাবে সক্রিয়ভাবে জেভিএম হিপ পরিচালনা করে? আমি যে নির্দিষ্ট উদাহরণটি ব্যবহার করি তা হ'ল জেভিএমের সর্বোচ্চ হিপ আকারের জন্য রানটাইম আরোগুলি থাকে যখন ডিফল্ট সিএলআর পরিবেশটি হয় না। যদিও এটি সত্য তবে আইআইএসের অধীনে হোস্ট করা একটি সিএলআর অ্যাপ্লিকেশন মেমরি সীমাবদ্ধ করতে আইআইএসকে কনফিগার করতে পারে, এর অর্থ ভার্চুয়াল মেশিনের সংজ্ঞায় আইআইএস অন্তর্ভুক্ত থাকবে।
কেলি এস ফরাসি

@ স্টিভ কুও, হ্যাঁ আমি এটিও দেখেছি। সাধারণত 5 টা থেকে 6 টা অবধি।
সরল ফেলো

11

সিএলআর এবং জেভিএম দুটি ভার্চুয়াল মেশিন।

.NET ফ্রেমওয়ার্ক এবং জাভা রানটাইম এনভায়রনমেন্টগুলি সংশ্লিষ্ট ভিএম এবং তাদের লাইব্রেরিগুলির বান্ডিলিং। লাইব্রেরি ছাড়া ভিএমগুলি বেশ অকেজো।


11

বিভিন্ন একাডেমিক এবং ব্যক্তিগত উত্স থেকে পার্থক্য সম্পর্কে আরও সুনির্দিষ্ট তথ্য পাওয়া যাবে। একবার ভাল উদাহরণ সিএলআর ডিজাইন পছন্দ

কিছু নির্দিষ্ট উদাহরণ অন্তর্ভুক্ত:

  • কিছু নিম্ন-স্তরের বিপরীত টাইপ করা হয় যেমন "দুটি অন্তর্ যুক্ত করুন" যেখানে সিএলআর একটি পলিমারফিক অপারেন্ড ব্যবহার করে। (যেমন fadd / iadd / মই বনাম শুধু যোগ)
  • বর্তমানে, জেভিএম আরও আগ্রাসী রানটাইম প্রোফাইলিং এবং অপ্টিমাইজেশন (অর্থাত্ হটস্পট) করে। সিএলআর বর্তমানে জেআইটি অপ্টিমাইজেশন করে, তবে রানটাইম অপ্টিমাইজেশান নয় (যেমন আপনি চলমান সময় কোড প্রতিস্থাপন করুন)।
  • সিএলআর ভার্চুয়াল পদ্ধতিগুলিকে ইনলাইন করে না, জেভিএম করে ...
  • সিএলআরতে কেবল "আদিম" এর বাইরে মান ধরণের জন্য সমর্থন।

-11

এটি কোনও ভার্চুয়াল মেশিন নয়,। নেট ফ্রেমওয়ার্কটি প্রথম রানের সময় অ্যাসেমব্লিশগুলি দেশীয় বাইনারিতে সংকলিত করে:

কম্পিউটিংয়ে, জাস্ট-ইন-টাইম সংকলন (জেআইটি), যা ডায়নামিক অনুবাদ হিসাবে পরিচিত, এটি একটি কম্পিউটার প্রোগ্রামের রানটাইম পারফরম্যান্সকে উন্নত করার জন্য একটি কৌশল a রান-টাইম পরিবেশে জেআইটি পূর্বের দুটি ধারণা তৈরি করে: বাইটকোড সংকলন এবং গতিশীল সংকলন। এটি রানটাইমের সময় কোডটি দেশীয়ভাবে কার্যকর করার পূর্বে রূপান্তর করে, উদাহরণস্বরূপ বাইটোকোডকে দেশীয় মেশিন কোডে। দোভাষীদের তুলনায় পারফরম্যান্সের উন্নতি কোডের ব্লক অনুবাদ করার ফলাফলগুলি ক্যাশে করা থেকে শুরু করে এবং প্রতিটি লাইনকে পুনরায় মূল্যায়ন না করে প্রতিবার পূরণ করা হয় (বর্ণিত ভাষা দেখুন)। এটি বিকাশের সময় কোডটি স্থিতিশীলভাবে সংকলন করারও সুবিধা রয়েছে, কারণ এটি যদি সুবিধাজনক বলে মনে হয় তবে কোডটি পুনরায় রচনা করতে পারে এবং সুরক্ষা গ্যারান্টি প্রয়োগ করতে সক্ষম হতে পারে।

মাইক্রোসফ্টের .NET ফ্রেমওয়ার্ক, জাভার বেশিরভাগ বাস্তবায়ন এবং অতি সম্প্রতি অ্যাকশনস্ক্রিট 3 এর মতো বেশ কয়েকটি আধুনিক রানটাইম পরিবেশ উচ্চ-গতির কোড প্রয়োগের জন্য জেআইটি সংকলনের উপর নির্ভর করে।

সূত্র: http://en.wikedia.org/wiki/Just-in-time_compilation

.NET ফ্রেমওয়ার্ক যুক্ত করা জাভা এর মত একটি ভার্চুয়াল মেশিন ধারণ করে।


10
ভার্চুয়াল মেশিনটি পারফরম্যান্স অপ্টিমাইজেশনের জন্য জেআইটি ব্যবহার করে, তার অর্থ এই নয় যে এটি আর ভার্চুয়াল মেশিন নয়। প্রোগ্রামার সংকলন করে যখন তিনি ভার্চুয়াল মেশিনে সংকলন করেন, কার্যকর করা কার্যকর করেন তবে এটি
যথাযথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.