জাভা বাইটকোডে উত্স কোড রূপান্তরকরণের ব্যবহার কী?


37

যদি বিভিন্ন আর্কিটেকচারের জন্য আলাদা আলাদা জেভিএম দরকার হয় তবে আমি এই ধারণাটি প্রবর্তনের পিছনে যুক্তিটি কী তা বুঝতে পারি না। অন্যান্য ভাষায় আমাদের বিভিন্ন মেশিনের জন্য বিভিন্ন সংকলক প্রয়োজন, তবে জাভাতে আমাদের বিভিন্ন জেভিএম প্রয়োজন, তাই জেভিএম বা এই অতিরিক্ত পদক্ষেপের ধারণাটি প্রবর্তনের পিছনে যুক্তি কী ??



12
@gnat: আসলে, এটি কোনও সদৃশ নয়। এটি হ'ল "উত্স বনাম বাইট কোড", অর্থাত্ প্রথম ট্রান্সফর্মেশন। ভাষার ভাষায়, এটি জাভা স্ক্রিপ্ট বনাম জাভা; আপনার লিঙ্কটি জাভা বনাম সি ++ হবে।
এমসাল্টারস

2
আপনি সেই 50 টি মডেল মডেলের জন্য একটি সাধারণ বাইটকোড ইন্টারপ্রেটার লিখতে চান যা আপনি আপগ্রেড করার জন্য ডিজিটাল কোডিং বা 50 টি বিভিন্ন হার্ডওয়্যারের জন্য 50 টি সংকলক যুক্ত করছেন। জাভা মূলত সরঞ্জাম এবং যন্ত্রপাতিগুলির জন্য তৈরি হয়েছিল। এটি ছিল তার দৃ strong় মামলা। এই উত্তরগুলি পড়ার সময় মনে রাখবেন যে আজকাল জাভাটির সত্যিকারের কোনও সুবিধা নেই (ব্যাখ্যা প্রক্রিয়াটির অদক্ষতার কারণে)। এটি কেবলমাত্র একটি মডেল যা আমরা অবিরত ব্যবহার করি।
গ্রেট ডাক

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

7
@ গ্রেটডাক ব্যাখ্যার প্রক্রিয়া? বেশিরভাগ জেভিএমগণ আজকাল মেশিন কোডে কেবল ইন-টাইম সংকলন করেন। "ব্যাখ্যা" আজকাল একটি বিস্তৃত শব্দ এটি উল্লেখ করার প্রয়োজন নেই। সিপিইউ নিজেই x86 কোডটিকে তার নিজস্ব অভ্যন্তরীণ মাইক্রোকোডে কেবল "ব্যাখ্যা" করে এবং দক্ষতা উন্নত করতে এটি ব্যবহৃত হয় । সর্বশেষতম ইন্টেল সিপিইউ সাধারণভাবে দোভাষীদের কাছেও খুব উপযুক্ত though
লুয়ান

উত্তর:


79

যুক্তিটি হ'ল জেভিএম বাইটকোড জাভা উত্স কোডের চেয়ে অনেক সহজ।

সংকলকগুলি তিনটি মৌলিক অংশ: পার্সিং, শব্দার্থবিজ্ঞান বিশ্লেষণ এবং কোড উত্পন্নকরণ হিসাবে একটি উচ্চ বিমূর্ত স্তরে ভাবা যেতে পারে।

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

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

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


7
অ্যাপলেট বিতরণে প্রাথমিক কিছু প্রচেষ্টা যেমন সেফটিসিএল আসলে উত্স কোড বিতরণ করেছিল। জাভাটির একটি সহজ এবং দৃ specified়ভাবে নির্দিষ্ট বাইটকোডের ব্যবহার প্রোগ্রামটির যাচাইকরণকে অনেক বেশি ট্র্যাকটেবল করে তোলে এবং এটি ছিল সেই কঠিন সমস্যা যা সমাধান করা হচ্ছে। পি-কোডের মতো বাইটকোডগুলি ইতিমধ্যে বহনযোগ্যতা সমস্যার সমাধানের অংশ হিসাবে পরিচিত ছিল (এবং এএন্ডএফ সম্ভবত সেই সময়ে বিকাশে ছিল)।
টবি স্পিড

9
অবিকল। বায়োটোকড -> মেশিন কোড ধাপের কারণে জাভা শুরুর সময়গুলি ইতিমধ্যে কিছুটা সমস্যা। আপনার (অ-তুচ্ছ) প্রকল্পে জাভ্যাক চালান, এবং তারপরে প্রতিটা শুরুতে পুরো জাভা -> মেশিন কোডটি করার পরিকল্পনা করুন।
পল ড্রাগন

24
এর অন্য একটি বিশাল সুবিধা রয়েছে: যদি কোনও দিন আমরা সকলেই একটি অনুমানমূলক নতুন ভাষায় সরে যেতে চাই - তবে এটিকে "স্কালা" বলি - আমাদের কয়েক ডজন স্কালার -> মেশিন কোডের পরিবর্তে কেবল একটি স্কালা -> বাইটকোড সংকলক লিখতে হবে কম্পাইলার। বোনাস হিসাবে, আমরা বিনামূল্যে JVM- র প্ল্যাটফর্ম-নির্দিষ্ট অপ্টিমাইজেশন পাই।
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট

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

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

27

সংক্ষিপ্ত / রানটাইম ডিজাইনে বিভিন্ন কারণে বিভিন্ন ধরণের মধ্যবর্তী উপস্থাপনা ক্রমশ সাধারণ হয় are

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

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

মধ্যবর্তী প্রতিনিধিত্বের অন্যান্য সুবিধার মধ্যে রয়েছে:

  • অপ্টিমাইজেশন , যেখানে নিদর্শনগুলি বাইটোকোডে চিহ্নিত করা যায় এবং দ্রুত সমতুল্য সংকলন করা যায়, বা এমনকি প্রোগ্রামের চলমান হিসাবে একটি বিশেষ ক্ষেত্রে অপ্টিমাইজ করা হয় ("JIT", বা "জাস্ট ইন টাইম", সংকলক)
  • ইনটেরোপিরাবিলিটি একই VM- র একাধিক ভাষার মধ্যে; এটি JVM (যেমন স্কেলা) এর মাধ্যমে জনপ্রিয় হয়েছে এবং এটি নেট ফ্রেমওয়ার্কের স্পষ্ট লক্ষ্য

1
জাভাও এম্বেডড সিস্টেমে ওরিয়েন্টেড ছিল। এই জাতীয় সিস্টেমে, হার্ডওয়্যারটিতে মেমরি এবং সিপিইউয়ের কয়েকটি সীমাবদ্ধতা ছিল।
লাইভ

কমপ্লায়ারদের এমনভাবে বিকাশ করা যেতে পারে যে তারা প্রথমে জাভা উত্স কোডটি বাইট কোডে সংকলন করে এবং তারপরে মেশিন কোডে বাইট কোডটি সংকলন করে? এটি কি আপনার উল্লেখ করা সবচেয়ে ডাউনস্টাইডকে দূর করবে?
Sher10ck

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

8

মনে হচ্ছে আপনি ভাবছেন কেন আমরা কেবল উত্স কোড বিতরণ করি না। আমাকে এই প্রশ্নটি ঘুরিয়ে দিন: আমরা কেবল মেশিন কোডটি বিতরণ করব না কেন?

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

এই আলোকে দেখা গেছে, কাঁচা উত্স কোডের মাধ্যমে বাইট-কোড ব্যবহারের যুক্তি আরও স্পষ্ট। কাঁচা মেশিনের ভাষা যতটা সম্ভব কাছাকাছি পাওয়া আমাদের মেশিন কোডের কিছু সুবিধা বুঝতে বা আংশিকভাবে উপলব্ধি করতে দেয় যেমন:

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

দ্রষ্টব্য যে আমি দ্রুত কার্যকরকরণের কথা উল্লেখ করি না। উভয় উত্স কোড এবং বাইট কোড প্রকৃত বাস্তবায়নের জন্য একই মেশিন কোডে সম্পূর্ণভাবে সংকলিত হতে পারে (তত্ত্ব অনুসারে)।

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


8

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

সাধারণভাবে সংকলকগণ

আসুন প্রথমে সাধারণ প্রশ্নটি বিবেচনা করা যাক: কেন একটি সংকলক কিছু নির্দিষ্ট প্রসেসরের উপর চালানোর জন্য উত্স কোড সংকলনের প্রক্রিয়ায় কিছু মধ্যবর্তী উপস্থাপনা ব্যবহার করবে?

জটিলতা হ্রাস

এর একটি উত্তর মোটামুটি সহজ: এটি একটি ও (এন * এম) সমস্যাটিকে ও (এন + এম) সমস্যায় রূপান্তর করে।

যদি আমাদের এন উত্স ভাষা এবং এম লক্ষ্যগুলি দেওয়া হয় এবং প্রতিটি সংকলক সম্পূর্ণ স্বতন্ত্র হয় তবে আমাদের সেই সমস্ত উত্স ভাষাগুলিকে সমস্ত লক্ষ্যগুলিতে অনুবাদ করার জন্য এন * এম সংকলকগুলির প্রয়োজন (যেখানে "টার্গেট" একটি সংমিশ্রণের মতো কিছু is প্রসেসর এবং ওএস)।

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

সমস্যা বিভাজন

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

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

দু'জনের মধ্যে যোগাযোগের জন্য একটি মধ্যবর্তী প্রতিনিধিত্ব করে একটি সামনের প্রান্ত এবং পিছনের প্রান্তে সংকলকগুলি পৃথক করা জাভা দিয়ে আসল নয়। এটি দীর্ঘকাল ধরে বেশ সাধারণ অভ্যাস ছিল (যেহেতু জাভা বরাবর আসার আগে, যাইহোক)।

বিতরণ মডেল

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

জাভা পরিবর্তে জাভা ডেভেলপমেন্ট কিটে ফ্রন্ট-এন্ড এবং জাভা ভার্চুয়াল মেশিনে ব্যাক-এন্ড বিতরণ করেছে। প্রতিটি জাভা ব্যবহারকারীর কাছে তিনি যে কোনও সিস্টেম ব্যবহার করছেন তা লক্ষ্য করতে একটি সংকলক ছিল। জাভা বিকাশকারীরা মধ্যবর্তী ফর্ম্যাটে কোড বিতরণ করেছিলেন, সুতরাং যখন কোনও ব্যবহারকারী এটি লোড করেন, তখন জেভিএম তাদের নির্দিষ্ট মেশিনে এটি কার্যকর করার জন্য যা প্রয়োজন তা করেছিল did

প্রিসিডেন্ট

নোট করুন যে এই বিতরণ মডেলটি সম্পূর্ণ নতুন ছিল না। শুধু উদাহরণস্বরূপ, UCSD পি-সিস্টেম একভাবে কাজ: কম্পাইলার সামনে প্রান্ত উত্পাদিত পি-কোড, এবং পি-ব্যবস্থার প্রতিটি কপি একটি ভার্চুয়াল মেশিনের যে করেনি কি সেই বিশেষ লক্ষ্যে P- কোড চালানো প্রয়োজন ছিল অন্তর্ভুক্ত 1

জাভা বাইট-কোড

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

শক্তি

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

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

দুর্বলতা

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

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

সারাংশ

আপনি যদি সাধারণভাবে মধ্যবর্তী উপস্থাপনাগুলি কেন ব্যবহার করতে চান তবে দুটি প্রধান কারণ হ'ল:

  1. একটি ও (এন * এম) সমস্যা একটি ও (এন + এম) সমস্যা হ্রাস করুন, এবং
  2. সমস্যাটিকে আরও পরিচালনাযোগ্য টুকরো টুকরো করুন।

আপনি যদি জাভা বাইট কোডের বিশদ সম্পর্কে জিজ্ঞাসা করছেন এবং কেন তারা অন্য কোনওটির পরিবর্তে এই নির্দিষ্ট প্রতিনিধিত্বকে বেছে নিয়েছে, তবে আমি বলব যে উত্তরটি মূলত তাদের মূল উদ্দেশ্য এবং ওয়েবে সীমাবদ্ধতার দিকে ফিরে আসে , নিম্নলিখিত অগ্রাধিকার অগ্রণী:

  1. কমপ্যাক্ট উপস্থাপনা।
  2. দ্রুত এবং ডিকোড করা এবং কার্যকর করা সহজ।
  3. বেশিরভাগ সাধারণ মেশিনে দ্রুত এবং কার্যকর করা সহজ।

বিভিন্ন ভাষার প্রতিনিধিত্ব করতে বা বিভিন্ন লক্ষ্যে সর্বোত্তমভাবে সম্পাদন করতে সক্ষম হওয়াই ছিল অনেক কম অগ্রাধিকার (যদি সেগুলিকে অগ্রাধিকার হিসাবে বিবেচনা করা হত)।


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

ওয়েব অ্যাপলেটগুলির সাথে বেশ কাছাকাছি: মূল উদ্দেশ্যটি ছিল অ্যাপ্লিকেশনগুলিতে কোড বিতরণ করা (শীর্ষস্থানীয় বাক্সগুলি সেট করুন ...), ঠিক একইভাবে আরপিসি ফাংশন কল বিতরণ করে এবং CORBA বস্তু বিতরণ করে।
নিনজালজ

2
এটি একটি দুর্দান্ত উত্তর এবং বিভিন্ন মধ্যবর্তী উপস্থাপনা কীভাবে বিভিন্ন বাণিজ্য বন্ধ করে দেয় সে সম্পর্কে একটি ভাল অন্তর্দৃষ্টি। :)
আইএমএসওপি

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

@ টবিস্পাইট: হ্যাঁ, অভিব্যক্তি সম্ভবত সেখানে আরও ভাল ফিট। ধন্যবাদ।
জেরি কফিন

0

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

এটি কপিরাইটযুক্ত উত্স কোড রক্ষা করাও সহজ করে তোলে।


2
জাভা (এবং। নেট) বাইটকোডটি যুক্তিযুক্ত সুস্পষ্ট উত্সে ফিরে আসা এত সহজ যে এখানে আরও শক্ত করে তুলতে মঙ্গলের নাম এবং কিছু সময় অন্যান্য তথ্যের পণ্য রয়েছে - এটি প্রায়শই জাভাস্ক্রিপ্টকে আরও ছোট করার জন্য করা হয়, কারণ আমরা এখনই হতে পারে ওয়েব ব্রাউজারগুলির জন্য একটি বাইটকোডে সেট করা।
LnxPrgr3

0

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


0

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

কেবলমাত্র পরে, যখন স্পষ্ট প্রকাশ পেয়েছে যে JVM- এর ব্যাখ্যাকারীদের কার্যকারিতা এখনও স্তন্যপান হয়েছে, তখন কি লোকেরা ভাল-সম্পাদনকারী-ইন-টাইম সংকলক তৈরির প্রচেষ্টা বিনিয়োগ করেছিল? এটি কিছুটা দ্রুত সি এবং সি ++ এর মতো দ্রুত ভাষার কাছে বন্ধ করে দিয়েছে। (কিছু জাভা সহজাত গতির সমস্যাগুলি রয়ে গেছে, তবে আপনি সম্ভবত কোনও জাভা পরিবেশ পাবেন না যা ভাল লিখিত সি কোড সম্পাদন করে))

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


ডাউনওয়োটার কেন দয়া করে বুঝিয়ে বলবেন ?
8

-5

পাঠ্য উত্স কোড এমন একটি কাঠামো যা কোনও মানুষের দ্বারা সহজেই পড়া ও সংশোধন করা যায় inte

বাইট কোড এমন একটি কাঠামো যা কোনও মেশিন দ্বারা সহজেই পড়া এবং সম্পাদন করা সহজ হতে চায় ।

যেহেতু কোড সহ সমস্ত জেভিএম কাজটি করে এটি পড়া এবং চালিত হয়, বাইট কোডটি জেভিএম দ্বারা গ্রাহনের জন্য আরও ভাল ফিট।

আমি লক্ষ করেছি যে এখনও পর্যন্ত কোনও উদাহরণ পাওয়া যায় নি। বোকা সিউডো উদাহরণ:

//Source code
i += 1 + 5 * 2 + x;

// Byte code
i += 11, i += x
____

//Source code
i = sin(1);

// Byte code
i = 0.8414709848
_____

//Source code
i = sin(x)^2+cos(x)^2;

// Byte code (actually that one isn't true)
i = 1

অবশ্যই বাইট কোডটি কেবল অপ্টিমাইজেশন সম্পর্কে নয়। এর একটি বড় অংশ জটিল নিয়মের বিষয়ে চিন্তা না করেই কোড সম্পাদন করতে সক্ষম হয়, যেমন কোনও পদ্ধতি "foo" বোঝায় তখন ক্লাসে ফাইলটির আরও কিছু নিচে "foo" নামক কোনও সদস্য রয়েছে কিনা তা পরীক্ষা করা উচিত।


2
সেই বাইট কোড "উদাহরণ" হ'ল মানব পঠনযোগ্য। এটি মোটেও বাইট কোড নয়। এটি বিভ্রান্তিমূলক এবং জিজ্ঞাসিত প্রশ্নের সমাধান করে না।
ওয়াইল্ডকার্ড

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

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