জাভা মধ্যে সংকলন সময় এবং রান সময় নির্ভরতা মধ্যে পার্থক্য কি? এটি শ্রেণিবদ্ধের সাথে সম্পর্কিত, তবে কীভাবে তারা আলাদা?
উত্তর:
CLASSPATH
সংকলন -সময় নির্ভরতা : আপনার নিদর্শনটি সঙ্কলনের জন্য আপনার মধ্যে নির্ভরতা প্রয়োজন । এগুলি উত্পাদিত হয়েছে কারণ আপনার কোডটিতে হার্ডকোডযুক্ত নির্ভরতার বিষয়ে আপনার কাছে এক ধরণের "রেফারেন্স" রয়েছে যেমন new
কিছু শ্রেণির জন্য ডাকে , কোনও কিছুকে প্রসারিত করা বা বাস্তবায়ন করা হয় (প্রত্যক্ষ বা অপ্রত্যক্ষভাবে), বা সরাসরি reference.method()
স্বরলিপি ব্যবহার করে একটি পদ্ধতি কল ।
রান-টাইম নির্ভরতা : CLASSPATH
আপনার শিল্পকলা চালানোর জন্য আপনার মধ্যে নির্ভরতা প্রয়োজন । এগুলি উত্পাদিত হয়েছে কারণ আপনি এমন কোড নির্বাহ করেন যা নির্ভরতা অ্যাক্সেস করে (কোনও হার্ডকোডযুক্ত উপায়ে বা প্রতিচ্ছবি বা যা কিছু মাধ্যমে)।
যদিও সংকলন-সময় নির্ভরতা সাধারণত রান-টাইম নির্ভরতা বোঝায়, আপনার কেবল একটি সংকলন-সময় নির্ভরতা থাকতে পারে। এটি জাভা কেবল class শ্রেণীর প্রথম অ্যাক্সেসের উপর শ্রেণি নির্ভরতাগুলি লিঙ্ক করে এর ভিত্তিতে তৈরি হয়, সুতরাং আপনি যদি রান-টাইমে কোনও নির্দিষ্ট শ্রেণিতে অ্যাক্সেস করেন না কারণ কোনও কোড পাথ কখনও ট্র্যাভার হয় না, জাভা শ্রেণি এবং তার নির্ভরতা উভয়ই উপেক্ষা করবে।
এর উদাহরণ
সি জাভাতে (সি.ক্লাস তৈরি করে):
package dependencies;
public class C { }
এ। জাভাতে (A.class উত্পন্ন করে):
package dependencies;
public class A {
public static class B {
public String toString() {
C c = new C();
return c.toString();
}
}
public static void main(String[] args) {
if (args.length > 0) {
B b = new B();
System.out.println(b.toString());
}
}
}
এই ক্ষেত্রে, A
একটি কম্পাইল-টাইম নির্ভরতা রয়েছে C
মাধ্যমে B
, কিন্তু আপনি যদি কিছু প্যারামিটার যখন নির্বাহ পাস এটি শুধুমাত্র সি তে একটি রান-টাইম নির্ভরতা থাকবে java dependencies.A
, যেমন জেভিএম শুধুমাত্র সমাধান করার চেষ্টা করবে B
উপর এর নির্ভরতা C
যখন এটি চালানো পায় B b = new B()
। এই বৈশিষ্ট্যটি আপনাকে রানটাইমের সময় কেবলমাত্র আপনার কোড পাথগুলিতে ব্যবহার করা ক্লাসগুলির নির্ভরতা সরবরাহ করতে এবং আর্টিফ্যাক্টের বাকী ক্লাসগুলির নির্ভরতা উপেক্ষা করার অনুমতি দেয়।
একটি সহজ উদাহরণ সার্ভলেট এপিআই এর মত একটি এপি তাকান হয়। আপনার সার্লেটগুলি সংকলন করার জন্য আপনার সার্লেট-এপিআই.জার প্রয়োজন, তবে রানটাইমের সময় সার্লেট কন্টেইনারটি একটি সার্লেট এপি বাস্তবায়ন সরবরাহ করে যাতে আপনার রানটাইম শ্রেণীর পথে সার্লেট-এপি.আইজার যুক্ত করার দরকার নেই।
একটি লাইব্রেরিতে কল সংকলনের জন্য সংকলকটির সঠিক শ্রেণিপথ প্রয়োজন (সময় নির্ভরতা সংকলন করুন)
আপনি যে লাইব্রেরীতে কল করছেন (রানটাইম নির্ভরতা) ক্লাসগুলি লোড করার জন্য জেভিএমের সঠিক ক্লাসপথ প্রয়োজন needs
তারা কয়েকটি উপায়ে ভিন্ন হতে পারে:
1) যদি আপনার ক্লাস সি 1 লাইব্রেরি ক্লাস L1, এবং L1 কে লাইব্রেরি ক্লাস L2 কল করে, তবে সি 1 এল 1 এবং এল 2 এর উপর রানটাইম নির্ভরতা রাখে, তবে এল 1 এ কেবল একটি সংকলনের সময় নির্ভরতা রয়েছে।
2) যদি আপনার ক্লাস সি 1 ক্লাস.ফরনাম () বা অন্য কোনও প্রক্রিয়া ব্যবহার করে কোনও ইন্টারফেস I1 গতিশীলভাবে ইনস্ট্যান্ট করে এবং ইন্টারফেস I1 এর জন্য বাস্তবায়নকারী শ্রেণি ক্লাস এল 1 হয়, তবে সি 1 এর আইটাইম এবং এল 1 এর একটি রানটাইম নির্ভরতা রয়েছে তবে কেবল একটি সংকলনের সময় নির্ভরতা আই 1 তে
অন্যান্য "অপ্রত্যক্ষ" নির্ভরতা যা সংকলন-সময় এবং রান-টাইমের জন্য সমান:
3) আপনার শ্রেণি C1 লাইব্রেরি ক্লাস L1 প্রসারিত করে, এবং L1 ইন্টারফেস I1 প্রয়োগ করে এবং লাইব্রেরি ক্লাস L2 প্রসারিত করে: C1 এর L1, L2 এবং I1 এর একটি সংকলন-সময় নির্ভরতা রয়েছে।
৪) আপনার ক্লাস সি 1 এর একটি পদ্ধতি foo(I1 i1)
এবং একটি পদ্ধতি রয়েছে bar(L1 l1)
যেখানে আই 1 একটি ইন্টারফেস এবং এল 1 এমন একটি শ্রেণি যা একটি পরামিতি নেয় যা ইন্টারফেস I1: সি 1 এর I1 এবং L1 এর একটি সংকলন-সময় নির্ভরতা থাকে।
মূলত, আকর্ষণীয় কিছু করার জন্য, আপনার শ্রেণিকে ক্লাসপথে অন্যান্য ক্লাস এবং ইন্টারফেসের সাথে ইন্টারফেস করতে হবে। লাইব্রেরি ইন্টারফেসের সেট দ্বারা গঠিত শ্রেণি / ইন্টারফেস গ্রাফটি সংকলন-সময় নির্ভরতা চেইন দেয়। লাইব্রেরি প্রয়োগগুলি রান-টাইম নির্ভরতা চেইন দেয় yield দ্রষ্টব্য যে রান-টাইম নির্ভরতা শৃঙ্খলা রান-টাইম নির্ভরশীল বা ব্যর্থ-ধীর: যদি L1 বাস্তবায়ন কখনও কখনও L2 শ্রেণীর কোনও বিষয় ইনস্ট্যান্ট করার উপর নির্ভর করে এবং সেই শ্রেণিটি কেবল একটি নির্দিষ্ট দৃশ্যে ইনস্ট্যান্ট হয় তবে তার ব্যতীত কোনও নির্ভরতা নেই there's যে দৃশ্য।
জাভা আসলে সংকলনের সময় কোনও কিছুর সাথে লিঙ্ক দেয় না। এটি কেবল ক্লাসস্প্যাটে পাওয়া মেলানো ক্লাস ব্যবহার করে বাক্য গঠনটি যাচাই করে। রানটাইম হওয়া পর্যন্ত এটি নয় যে সমস্ত কিছু একসাথে রাখা হয়েছিল এবং সেই সময় CLASSPATH এর উপর ভিত্তি করে কার্যকর করা হবে।
কম্পাইলটাইম নির্ভরতাগুলি কেবলমাত্র নির্ভরশীলতা (অন্যান্য শ্রেণি) যা আপনি সংকলিত ক্লাসে সরাসরি ব্যবহার করেন। রানটাইম নির্ভরতা আপনি যে শ্রেণিতে চলছে তা প্রত্যক্ষ এবং অপ্রত্যক্ষ উভয়ই নির্ভরতা coversেকে রাখে। সুতরাং, রানটাইম নির্ভরতাগুলির মধ্যে নির্ভরতাগুলির নির্ভরতা এবং কোনও প্রতিচ্ছবি নির্ভরতা যেমন শ্রেণীর নামগুলির মধ্যে আপনার একটিতে থাকে String
তবে এতে ব্যবহার হয় Class#forName()
।
A
, বিজার সাথে B extends A
এবং সিজারের সাথে সিজার থাকে C extends B
তবে এ.এর উপর সি নির্ভরতা পরোক্ষ হলেও যদিও সিজার এ.আর এর সময় সংকলনের উপর নির্ভর করে।
জাভা জন্য, সংকলন সময় নির্ভরতা আপনার উত্স কোডের নির্ভরতা। উদাহরণস্বরূপ, ক্লাস এ যদি ক্লাস বি থেকে কোনও পদ্ধতি কল করে, তবে সংকলনের সময় এ বি এর উপর নির্ভরশীল যেহেতু এ-কে সংকলিত হতে হবে বি (বি এর ধরণ) সম্পর্কে জানতে হবে। এখানে কৌশলটি এটি হওয়া উচিত: সংকলিত কোডটি এখনও একটি সম্পূর্ণ এবং সম্পাদনযোগ্য কোড নয়। এটিতে উত্সগুলির জন্য প্রতিস্থাপনযোগ্য ঠিকানা (প্রতীক, মেটাডেটা) অন্তর্ভুক্ত রয়েছে যা এখনও বাইরের জারে সংকলিত বা বিদ্যমান নেই existing সংযোগের সময়, সেই ঠিকানাগুলি অবশ্যই মেমরিতে প্রকৃত ঠিকানাগুলি দ্বারা প্রতিস্থাপিত করা উচিত। এটি সঠিকভাবে করতে, সঠিক চিহ্ন / ঠিকানাগুলি তৈরি করা উচিত। এবং এটি ক্লাসের ধরণের (বি) দিয়ে করা যেতে পারে। আমি বিশ্বাস করি যে সংকলনের সময় এটিই মূল নির্ভরতা।
রানটাইম নির্ভরতা প্রকৃত প্রবাহ-নিয়ন্ত্রণের সাথে আরও সম্পর্কিত। এটি প্রকৃত মেমরি ঠিকানাগুলি প্রত্যাখ্যান করে। এটি আপনার নির্ভরতা যখন আপনার প্রোগ্রামটি চলমান থাকে। আপনার প্রয়োগের জন্য এখানে বি শ্রেণীর বিশদ প্রয়োজন, কেবলমাত্র টাইপ তথ্য নয়। যদি ক্লাসটি বিদ্যমান না থাকে, তবে আপনি রানটাইম এক্সেক্সপশন পাবেন এবং জেভিএম প্রস্থান করবে।
উভয় নির্ভরতা, সাধারণত এবং না হওয়া উচিত একই দিকে প্রবাহিত। এটি যদিও ওও ডিজাইনের বিষয়।
সি ++ তে, সংকলনটি কিছুটা আলাদা (কেবলমাত্র সময়ের সাথে নয়) তবে এর একটি লিঙ্কারও রয়েছে। সুতরাং প্রক্রিয়াটি জাভা আমার অনুমানের মতোই ভাবা যেতে পারে।