জাভা ক্লাস ফাইল তৈরি করা কি ডিস্ট্রিমেন্টিক?


94

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

আপডেট 1 আমি প্রজন্মের প্রতি আগ্রহী , অর্থাৎ সংকলক আউটপুট, কোনও ক্লাস ফাইলটি বিভিন্ন প্ল্যাটফর্মে চালানো যায় কিনা তা নয় ।

আপডেট 2 'সেম জেডিকে' দ্বারা, আমি একই নির্বাহযোগ্যও বলতে চাইছি javac

ওরাকলের সংকলকগুলিতে তাত্ত্বিক পার্থক্য এবং ব্যবহারিক পার্থক্যের মধ্যে আপডেট 3 3

[সম্পাদনা করুন, প্যারাফ্রেসড প্রশ্ন যুক্ত করে]
"এমন পরিস্থিতি কী যেখানে একই প্ল্যাটফর্ম সম্পাদনযোগ্য, যখন অন্য প্ল্যাটফর্মে চালানো হয়, তখন বিভিন্ন বাইকোড তৈরি করে?"


5
@ গ্যাম সিওএর অর্থ এই নয় যে বিভিন্ন প্ল্যাটফর্মগুলিতে সংকলিত বাইট কোড হুবহু একই রকম হবে; এর সমস্ত অর্থ হ'ল জেনারেটেড বাইট কোড ঠিক একই কাজ করবে।
সের্গেই কালিনিচেনকো

11
আপনি যত্ন কেন? এটি এক্সওয়াই সমস্যার মতো গন্ধযুক্ত ।
জোছিম সৌর

4
@ জোয়াচিমসৌয়ার বিবেচনা করুন যে আপনি সংস্করণটি আপনার বাইনারিগুলি নিয়ন্ত্রণ করে কিনা - আপনি কেবলমাত্র সোর্স কোডটি পরিবর্তিত হলে পরিবর্তনগুলি সনাক্ত করতে চাইতে পারেন, তবে জেডিকে নির্বিচারে আউটপুট বাইনারিগুলি পরিবর্তন করতে পারলে আপনি বুঝতে পারেন যে এটি কোনও বুদ্ধিমান ধারণা নয়।
আরবি।

7
@ আরবি .: সংকলকটি সংকলিত কোডটি উপস্থাপন করে এমন কোনও উপযুক্ত বাইট কোড তৈরি করতে অনুমোদিত। আসলে, কিছু সংকলক আপডেটগুলি কিছুটা পৃথক কোড উৎপন্ন বাগগুলি স্থির করে (সাধারণত একই রানটাইম আচরণের সাথে)। অন্য কথায়: আপনি যদি উত্স পরিবর্তনগুলি সনাক্ত করতে চান তবে উত্সের পরিবর্তনগুলি পরীক্ষা করুন
জোছিম সউর

4
@ ড্যাসব্লিংকনলাইট: আপনি ধরে নিচ্ছেন যে তারা যে উত্তর দিয়েছে বলে দাবি করেছে তা আসলে সঠিক এবং আপ-ডেট-ডেট (সন্দেহভাজন যে, প্রশ্নটি 2003 সাল থেকে হয়েছে)।
জোয়াকিম সৌর

উত্তর:


68

আসুন এটি এইভাবে রাখি:

আমি সহজেই একটি সম্পূর্ণরূপে অনুসরণকারী জাভা সংকলক উত্পাদন করতে পারি যা একই .classফাইলটি কখনও কখনও একই ফাইল উত্পাদন করে না .java

আমি এটি সমস্ত ধরণের বাইটকোড নির্মাণের মাধ্যমে ট্যুইক করে বা কেবল আমার পদ্ধতিতে অতিরিক্ত অতিরিক্ত বৈশিষ্ট্য যুক্ত করে (যা অনুমোদিত)।

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

তবে , কয়েক বার যে আমি পরীক্ষা করেছি, একই সুইচ (এবং একই লাইব্রেরি!) সঙ্গে একই কম্পাইলার সঙ্গে একই সোর্স ফাইল কম্পাইল করেনি একই ফলাফলের .classফাইল।

আপডেট করুন: আমি সম্প্রতি উপর পদস্খলিত করেছি বাস্তবায়ন সম্পর্কে এই আকর্ষণীয় ব্লগ পোস্ট switchউপর Stringজাভা 7 । এই ব্লগ পোস্টে, কিছু প্রাসঙ্গিক অংশ আছে, আমি এখানে উদ্ধৃত করব (জোর আমার):

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

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


স্থাপিত টুইট "একই জাভাক যখন নির্বাহযোগ্য, যখন অন্য প্ল্যাটফর্মে চালানো হয় তখন বিভিন্ন বাইকোড তৈরি করে এমন পরিস্থিতি কী?" মূলত এই সংকলকটি প্রস্তুতকারক গোষ্ঠীর স্বাদের উপর নির্ভর করে
এমোরি

4
ঠিক আছে, আমার জন্য এটি নির্ভর করবে না এটি যথেষ্ট কারণ: একটি আপডেট করা জেডিকে আমার বিল্ড / আর্কাইভ সিস্টেমটি ভেঙে দিতে পারে যদি আমি এই তথ্যের উপর নির্ভর করি যে সংকলক সর্বদা একই কোড তৈরি করে।
জোছিম সউর

4
@ গ্যাবরসচ: আপনার কাছে ইতিমধ্যে এমন পরিস্থিতির একটি নিখুঁত উদাহরণ রয়েছে, সুতরাং সমস্যার বিষয়ে কিছু অতিরিক্ত দৃষ্টিভঙ্গি যথাযথ ছিল। আপনার কাজের সদৃশ করার কোনও বুদ্ধি নেই।
জোছিম সৌর

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

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

39

কম্পাইলারদের প্রতিটি প্ল্যাটফর্মে একই বাইটকোড তৈরি করার কোনও বাধ্যবাধকতা নেই। javacএকটি নির্দিষ্ট উত্তর পেতে আপনার বিভিন্ন বিক্রেতার ইউটিলিটিটি পরামর্শ করা উচিত ।


ফাইল অর্ডার দিয়ে আমি এর জন্য ব্যবহারিক উদাহরণ দেখাব।

ধরা যাক যে আমাদের কাছে 2 টি জার ফাইল রয়েছে: my1.jarএবং My2.jar। সেগুলি libডিরেক্টরিতে পাশাপাশি রাখা হয়। কম্পাইলার তাদের ক্রম অনুযায়ী সার্চ (যেহেতু এই হল lib), কিন্তু অর্ডার my1.jar, My2.jarযখন ফাইল সিস্টেম যদি অবশ, এবং My2.jar, my1.jarযদি এটা কেস সংবেদনশীল।

my1.jarএকটি বর্গ হয়েছে A.classএকটি পদ্ধতি সঙ্গে

public class A {
     public static void a(String s) {}
}

My2.jarএকই হয়েছে A.class, কিন্তু বিভিন্ন পদ্ধতি স্বাক্ষর সহ (গ্রহণ Object):

public class A {
     public static void a(Object o) {}
}

এটা স্পষ্ট যে আপনি যদি একটি কল আছে

String s = "x"; 
A.a(s); 

এটি বিভিন্ন ক্ষেত্রে বিভিন্ন স্বাক্ষর সহ একটি মেথড কল সংকলন করবে। সুতরাং, আপনার ফাইল সিস্টেমের ক্ষেত্রে সংবেদনশীলতার উপর নির্ভর করে আপনি ফলাফল হিসাবে বিভিন্ন শ্রেণি পাবেন।


4
+1 গ্রহগ্রাহী সংকলক এবং জাভাকের মধ্যে অগণিত পার্থক্য রয়েছে, উদাহরণস্বরূপ কীভাবে সিন্থেটিক কনস্ট্রাক্টর তৈরি হয়
পল বেলোরা

4
@ গ্যাবারসচ আমি বাইট কোডটি একই জেডিকে, একই জ্যাভাকের জন্য অভিন্ন কিনা তাতে আগ্রহী। আমি যে আরও পরিষ্কার করব।
mstrap

4
@ এমস্ট্র্যাপ আমি আপনার প্রশ্নটি বুঝতে পেরেছি, তবে উত্তরটি এখনও একই: বিক্রেতার উপর নির্ভর করে। javacকারণ আপনি প্রতিটি প্ল্যাটফর্ম (যেমন Win7, লিনাক্স, সোলারিস, ম্যাক) উপর বিভিন্ন বাইনেরিতে আছে, একই নয়। কোনও বিক্রেতার পক্ষে এটির বিভিন্ন বাস্তবায়ন হওয়া বোধগম্য নয়, তবে কোনও প্ল্যাটফর্ম নির্দিষ্ট সমস্যা ফলাফলকে প্রভাবিত করতে পারে (যেমন কোনও ডিরেক্টরিতে ফ্লাই অর্ডার করা (আপনার libডিরেক্টরিতে ভাবেন ), শেষের দিক ইত্যাদি)।
গ্যাবর্স

4
সাধারণত, বেশিরভাগ javacজাভাতে প্রয়োগ করা হয় (এবং javacএটি কেবল একটি সরল নেটিভ লঞ্চার), তাই বেশিরভাগ প্ল্যাটফর্মের পার্থক্যগুলির কোনও প্রভাব নেই।
জোছিম সউর

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

6

সংক্ষিপ্ত উত্তর - কোন


দীর্ঘ উত্তর

bytecodeবিভিন্ন প্ল্যাটফর্মের জন্য তাদের এক হওয়ার দরকার নেই। এটি জেআরই (জাভা রানটাইম এনভায়রনমেন্ট) যা জানে ঠিক কীভাবে বাইটকোড কার্যকর করতে হয়।

আপনি যদি জাভা ভিএম স্পেসিফিকেশনের মধ্য দিয়ে যান তবে আপনি জানতে পারবেন যে এটি সঠিক হওয়া উচিত নয় যে বিভিন্ন প্ল্যাটফর্মের জন্য বাইটকোড একই।

ক্লাস ফাইলের ফর্ম্যাটটি দিয়ে যাওয়ায় এটি কোনও শ্রেণিবদ্ধ ফাইলের কাঠামো দেখায়

ClassFile {
    u4 magic;
    u2 minor_version;
    u2 major_version;
    u2 constant_pool_count;
    cp_info constant_pool[constant_pool_count-1];
    u2 access_flags;
    u2 this_class;
    u2 super_class;
    u2 interfaces_count;
    u2 interfaces[interfaces_count];
    u2 fields_count;
    field_info fields[fields_count];
    u2 methods_count;
    method_info methods[methods_count];
    u2 attributes_count;
    attribute_info attributes[attributes_count];
}

গৌণ এবং বড় সংস্করণ সম্পর্কে চেক করা হচ্ছে

গৌণ_ত্যাগ

মাইনর_ভার্সন এবং মেজর_সভারশন আইটেমগুলির মানগুলি এই শ্রেণীর ফাইলটির গৌণ এবং প্রধান সংস্করণ সংখ্যা T সব মিলিয়ে একটি বড় এবং একটি ছোট সংস্করণ নম্বর বর্গ ফাইল ফর্ম্যাটটির সংস্করণ নির্ধারণ করে। যদি কোনও শ্রেণি ফাইলের বড় সংস্করণ নম্বর এম এবং ছোটখাটো সংস্করণ নম্বর এম থাকে তবে আমরা তার বর্গ ফাইলের ফর্ম্যাটটির সংস্করণ এমএম হিসাবে চিহ্নিত করি, ক্লাস ফাইলের বিন্যাসের সংস্করণগুলি অভিধানিক অর্থে অর্ডার করা যেতে পারে, উদাহরণস্বরূপ, 1.5 <2.0 <2.1। একটি জাভা ভার্চুয়াল মেশিন বাস্তবায়ন v সংস্করণের v ক্লাসের ফাইল ফর্ম্যাটকে সমর্থন করতে পারে যদি কেবলমাত্র v কিছু সংক্ষিপ্ত পরিসীমা Mi.0 v Mj.m. জাভা ভার্চুয়াল মেশিন বাস্তবায়ন জাভা প্ল্যাটফর্মের একটি নির্দিষ্ট রিলিজ স্তরের সাথে সঙ্গতিপূর্ণ সংস্করণগুলির পরিসরটি কেবলমাত্র সূর্যই নির্দিষ্ট করতে পারে .1

পাদটীকাগুলির মাধ্যমে আরও পড়ছেন

1 সান এর জেডি কে প্রকাশের জাভা ভার্চুয়াল মেশিন বাস্তবায়ন 1.0.2 ক্লাস ফাইল ফর্ম্যাট সংস্করণ 45.0 এর 45.3 সহ সমেত supports সান এর জেডিকে ১.১. এক্স প্রকাশ করেছে ৪৫.০55৫৫৫ সহ 45.0 এর মধ্যে পরিসরের সংস্করণ ফাইল ফর্ম্যাটকে সমর্থন করতে পারে। জাভা 2 প্ল্যাটফর্মের 1.2 সংস্করণটির বাস্তবায়ন 45.0 এর মধ্যে 46.0 সহ অন্তর্ভুক্ত সংস্করণের সংস্করণ ফাইল ফর্ম্যাটগুলিকে সমর্থন করতে পারে।

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


আপনি আরও বিস্তারিত লিঙ্ক দিতে পারেন দয়া করে?
এমস্ট্র্যাপ

আমি মনে করি 'প্ল্যাটফর্ম' দ্বারা তারা জাভা প্ল্যাটফর্মের কথা উল্লেখ করছে, অপারেটিং সিস্টেম নয়। অবশ্যই, জাভ্যাক 1.7 কে 1.6- সামঞ্জস্যপূর্ণ ক্লাস ফাইল তৈরি করার নির্দেশ দেওয়ার সময়, একটি পার্থক্য থাকবে।
mstrap

সংকলনের সময় একক শ্রেণীর জন্য কতগুলি সম্পত্তি উত্পন্ন হয় তা দেখানোর জন্য @ এমটিকে +1।
গ্যাবর্স

3

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

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

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

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


2

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


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

4
এটি আমার প্রশ্নের উত্তর এবং আমি কী প্রত্যাশা করব, তবে আমি আরবির সাথে একমত হই যে এর জন্য একটি উল্লেখ গুরুত্বপূর্ণ হবে।
এমস্ট্র্যাপ

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

1

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

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

জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশনে বাইনারি সামঞ্জস্যতার বিষয়ে একটি বিভাগ রয়েছে ।

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

পারফরম্যান্স উন্নত করতে বিদ্যমান পদ্ধতি, কনস্ট্রাক্টর এবং ইনিশিয়ালাইজারকে পুনরায় বাস্তবায়ন করা।

Methods ইনপুটগুলিতে মূল্য ফেরত দেওয়ার পদ্ধতি বা নির্মাতারা যার জন্য তারা পূর্বে হয় ব্যতিক্রম ছুঁড়ে ফেলেছিল যা সাধারণত অসীম লুপে গিয়ে বা অচলাবস্থার কারণে ঘটে না বা ব্যর্থ হয়।

Fields বিদ্যমান ক্ষেত্র বা ইন্টারফেসে নতুন ক্ষেত্র, পদ্ধতি বা কনস্ট্রাক্টর যুক্ত করা।

Private ব্যক্তিগত ক্ষেত্র, পদ্ধতি বা শ্রেণীর নির্মাতা মোছা।

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

Existing বিদ্যমান প্রকারের ঘোষণায় ক্ষেত্র, পদ্ধতি বা নির্মাতাকে পুনরায় সাজানো।

Method শ্রেণিবিন্যাসে একটি পদ্ধতিকে উপরের দিকে সরানো।

A কোনও শ্রেণি বা ইন্টারফেসের সরাসরি সুপারিনটারফেসের তালিকাটিকে পুনরায় সাজানো।

Ie শ্রেণিবিন্যাসে নতুন শ্রেণি বা ইন্টারফেস প্রকার সন্নিবেশ করানো।

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


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

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

1

Java allows you write/compile code on one platform and run on different platform. আফাইক ; এটি তখনই সম্ভব হবে যখন বিভিন্ন প্ল্যাটফর্মে উত্পন্ন ক্লাস ফাইলগুলি একই বা প্রযুক্তিগতভাবে একই অর্থ একই হয়।

সম্পাদনা করুন

আমি প্রযুক্তিগতভাবে একই মন্তব্য বলতে যা বোঝাতে চাই তা হ'ল। আপনি বাইট বাই বাইট তুলনা করাতে তাদের ঠিক একই হওয়ার দরকার নেই।

স্পেসিফিকেশন অনুসারে বিভিন্ন প্ল্যাটফর্মের একটি শ্রেণির ক্লাস ফাইল বাইট বাই বাইটের সাথে মেলে না।


ওপির প্রশ্ন ছিল ক্লাসের ফাইলগুলি একই বা "প্রযুক্তিগতভাবে একই" whether
বিডেশম

তারা অভিন্ন কিনা আমি আগ্রহী ।
এমস্ট্র্যাপ

এবং উত্তর হ্যাঁ। আমার অর্থ হ'ল এগুলি একই নাও হতে পারে যদি আপনি বাইট বাই বাইট করে তুলেন, তবে আমি কেন শব্দটি প্রযুক্তিগতভাবে একই ব্যবহার করেছি ts
rai.skumar

@ বিডিশাম তিনি জানতে চেয়েছিলেন যে তারা অভিন্ন কিনা। "প্রযুক্তিগতভাবে একই" দ্বারা আপনি কী বুঝতে পেরেছেন তা নিশ্চিত নন ... এটি কি ডাউনটোটের কারণ?
rai.skumar

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

1

প্রশ্নের জন্য:

"একই জাভাক যখন নির্বাহযোগ্য, যখন অন্য প্ল্যাটফর্মে চালানো হয় তখন বিভিন্ন বাইকোড তৈরি করে এমন পরিস্থিতি কী?"

ক্রস-সংকলন উদাহরণ দেখায় কিভাবে আমরা javac বিকল্প ব্যবহার করতে পারেন: -target সংস্করণ

এই পতাকাটি ক্লাসের ফাইল তৈরি করে যা জাভা সংস্করণটির সাথে সামঞ্জস্যপূর্ণ যা আমরা এই আদেশটি প্রেরণের সময় নির্দিষ্ট করেছিলাম। সুতরাং ক্লাসের ফাইলগুলি এই বিকল্পটি ব্যবহার করে সংকলনের সময় সরবরাহ করা বৈশিষ্ট্যের উপর নির্ভর করে পৃথক হবে dif


0

সম্ভবত, উত্তরটি হ্যাঁ "হ্যাঁ", তবে সঠিক উত্তর পেতে সংকলনের সময় কিছু কী বা গাইড জেনারেশন অনুসন্ধান করা দরকার।

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

পিএস এছাড়াও জেএনআই বিষয়টি বিবেচনা করতে পারে।

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


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

0

দুটি প্রশ্ন আছে।

Can there be a difference depending on the operating system or hardware? 

এটি একটি তাত্ত্বিক প্রশ্ন, এবং উত্তরটি পরিষ্কারভাবে, হ্যাঁ, হতে পারে। অন্যরা যেমন বলেছে, স্পেসিফিকেশনটির জন্য বাইট-বাই বাইট অভিন্ন শৈলীর ফাইল তৈরি করার জন্য সংকলকটির প্রয়োজন হয় না।

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

What are the circumstances where the same javac executable, when run on a different platform, will produce different bytecode?

অজান্তেই

কনফিগারেশন ম্যানেজমেন্টটি প্রশ্ন জিজ্ঞাসার কারণ কিনা তা আমি জানি না, তবে এটি যত্নের বোঝার কারণ। বাইট কোডের সাথে তুলনা করা বৈধ আইটি নিয়ন্ত্রণ, তবে কেবল শ্রেণীর ফাইলগুলি পরিবর্তন হয়েছে কিনা তা নির্ধারণ করতে, উত্স ফাইলগুলি হয়েছে কিনা তা শীর্ষস্থানীয় নয়।


0

আমি এটি অন্যভাবে রাখতাম।

প্রথমত, আমি মনে করি প্রশ্নটি নির্বিচারবাদী হওয়ার বিষয়ে নয়:

অবশ্যই এটি নির্বিচারবাদী: কম্পিউটার বিজ্ঞানে এলোমেলোভাবে অর্জন করা শক্ত, এবং কোনও কারণেই কোনও সংকলক এখানে এটি চালু করার কোনও কারণ নেই is

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

এটি নিশ্চিত করার একটি ভাল উপায় হ'ল আপনার গিটের পর্যায়ে .class (বা আমার ক্ষেত্রে .pyc) রেখে। আপনি বুঝতে পারবেন যে আপনার দলের বিভিন্ন কম্পিউটারের মধ্যে, .pyc ফাইলগুলির মধ্যে গিট নোটিশগুলি পরিবর্তন হয়, যখন .py ফাইলে কোনও পরিবর্তন আনা হয়নি (এবং .pyc যেভাবেই পুনরায় সংযুক্ত করা হয়েছিল)।

কমপক্ষে আমি যা পর্যবেক্ষণ করেছি। সুতরাং আপনার .gitignore এ * .পিসি এবং * .ক্লাস রাখুন!

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