সংকলন সময় বনাম রান সময় নির্ভরতা - জাভা


91

জাভা মধ্যে সংকলন সময় এবং রান সময় নির্ভরতা মধ্যে পার্থক্য কি? এটি শ্রেণিবদ্ধের সাথে সম্পর্কিত, তবে কীভাবে তারা আলাদা?

উত্তর:


78
  • 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()। এই বৈশিষ্ট্যটি আপনাকে রানটাইমের সময় কেবলমাত্র আপনার কোড পাথগুলিতে ব্যবহার করা ক্লাসগুলির নির্ভরতা সরবরাহ করতে এবং আর্টিফ্যাক্টের বাকী ক্লাসগুলির নির্ভরতা উপেক্ষা করার অনুমতি দেয়।


4
আমি জানি এটি এখন খুব পুরানো উত্তর, তবে কীভাবে শুরু থেকেই রানটাইম নির্ভরতা হিসাবে জেভিএমের সি থাকবে না? যদি এটি "সি এর জন্য এখানে একটি রেফারেন্স, এটি নির্ভরতা হিসাবে যুক্ত করার সময়" সনাক্ত করতে সক্ষম হয়, তবে সি ইতিমধ্যে জেভিএম এটি স্বীকৃত এবং এটি কোথায় আছে তা জেনে রাখার কারণে এটি ইতিমধ্যে নির্ভরতা নয়?
wearebob

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

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

4
@ ওয়েয়ারবব একটি জেআর এর সমস্ত নির্ভরতা অন্তর্ভুক্ত করার দরকার নেই। এজন্য প্রায় প্রতিটি অ-তুচ্ছ অ্যাপ্লিকেশনটিতে একটি / লিবিব ডিরেক্টরি বা একাধিক জেআর সমন্বিত অনুরূপ থাকে।
জিপিচে

33

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


স্পষ্টতার জন্য (এটি আমাকে বিভ্রান্ত করেছে), আপনি যদি ম্যাভেন ব্যবহার করছেন এবং যুদ্ধ চালাচ্ছেন, তবে "সার্ভলেট-এপি" সাধারণত "রানটাইম" নির্ভরতার পরিবর্তে "সরবরাহিত" নির্ভরতা হয়, যদি এটি যুদ্ধে অন্তর্ভুক্ত হতে পারে, আমি সঠিক.
xdmoore

4
'প্রদত্ত' অর্থ সংকলনের সময় অন্তর্ভুক্ত করুন তবে এটি ওয়ার বা অন্যান্য নির্ভরতাগুলির সংগ্রহের মধ্যে বান্ডিল করবেন না। 'রানটাইম' বিপরীতে কাজ করে (সংকলনে উপলভ্য নয় তবে ওয়ারের সাথে প্যাকেজড)।
কেসি বাল্টজ 4'17

29

একটি লাইব্রেরিতে কল সংকলনের জন্য সংকলকটির সঠিক শ্রেণিপথ প্রয়োজন (সময় নির্ভরতা সংকলন করুন)

আপনি যে লাইব্রেরীতে কল করছেন (রানটাইম নির্ভরতা) ক্লাসগুলি লোড করার জন্য জেভিএমের সঠিক ক্লাসপথ প্রয়োজন 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 যে দৃশ্য।


4
উদাহরণস্বরূপ 1 সংকলন নির্ভরতা L1 হওয়া উচিত নয়?
BalusC

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

4
আমি নিশ্চিত যে ডিফল্ট ক্লাসলোডার ক্লাসপথ নেয় এবং এর মধ্য দিয়ে পদক্ষেপ নেয়, সুতরাং আপনার যদি ক্লাসপথে দুটি জার থাকে যা উভয়ই একই শ্রেণীর (যেমন com.example.fooutils.Foo) থাকে তবে এটি একটিটি ব্যবহার করবে ক্লাসপথে প্রথম। হয় বা আপনি অস্পষ্টতা উল্লেখ করে একটি ত্রুটি পাবেন। তবে আপনি যদি শ্রেণিবদ্ধদের জন্য নির্দিষ্ট আরও তথ্য চান তবে আপনার আলাদা প্রশ্ন জিজ্ঞাসা করা উচিত।
জেসন এস

আমি মনে করি প্রথম ক্ষেত্রে, সংকলনের সময় নির্ভরতাগুলি L2 তেও হওয়া উচিত অর্থাৎ বাক্যটি হওয়া উচিত: 1) যদি আপনার শ্রেণি C1 লাইব্রেরি ক্লাস L1 কে কল করে, এবং L1 লাইব্রেরি ক্লাস L2 কে কল করে, তবে সি 1 এর এলটাইমে রানটাইম নির্ভরতা রয়েছে এবং L2, তবে কেবলমাত্র L1 এবং L2 এ একটি সংকলন সময় নির্ভরতা। এটি ঠিক যেমন, সংকলনের সময়ও যখন জাভা সংকলক এল 1 যাচাই করে, তখন এটি L1 দ্বারা রেফারেন্সযুক্ত অন্যান্য সমস্ত শ্রেণীর যাচাই করে (Class.forName ("মাইক্লাসনাম)) এর মতো গতিশীল নির্ভরতা বাদ দিয়ে ... অন্যথায় কীভাবে এটি যাচাই করে? সংকলনটি ঠিকঠাক কাজ করছে। আপনি যদি অন্যথায় মনে করেন তবে দয়া করে ব্যাখ্যা করুন
রাজেশ গোয়েল

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

12

জাভা আসলে সংকলনের সময় কোনও কিছুর সাথে লিঙ্ক দেয় না। এটি কেবল ক্লাসস্প্যাটে পাওয়া মেলানো ক্লাস ব্যবহার করে বাক্য গঠনটি যাচাই করে। রানটাইম হওয়া পর্যন্ত এটি নয় যে সমস্ত কিছু একসাথে রাখা হয়েছিল এবং সেই সময় CLASSPATH এর উপর ভিত্তি করে কার্যকর করা হবে।


এটি লোডটাইম না হওয়া পর্যন্ত ... রানটাইম লোডটাইমের চেয়ে আলাদা।
ওভাররেচেন্জ করুন

10

কম্পাইলটাইম নির্ভরতাগুলি কেবলমাত্র নির্ভরশীলতা (অন্যান্য শ্রেণি) যা আপনি সংকলিত ক্লাসে সরাসরি ব্যবহার করেন। রানটাইম নির্ভরতা আপনি যে শ্রেণিতে চলছে তা প্রত্যক্ষ এবং অপ্রত্যক্ষ উভয়ই নির্ভরতা coversেকে রাখে। সুতরাং, রানটাইম নির্ভরতাগুলির মধ্যে নির্ভরতাগুলির নির্ভরতা এবং কোনও প্রতিচ্ছবি নির্ভরতা যেমন শ্রেণীর নামগুলির মধ্যে আপনার একটিতে থাকে Stringতবে এতে ব্যবহার হয় Class#forName()


ধন্যবাদ, তবে ক্লাস লোড রান সময়ে কীভাবে কাজ করে? সংকলনের সময়ে এটি বোঝা সহজ। তবে রানটাইমে, এটি কীভাবে কাজ করে, যখন আমার কাছে দুটি সংস্করণ বিভিন্ন সংস্করণ থাকে? শ্রেণীর পথে বিভিন্ন শ্রেণীর একাধিক ক্লাসের ক্ষেত্রে কোন শ্রেণীর জন্য Class.forName () পিকআপ হবে?
কুণাল

এক অবশ্যই নামের সাথে মেলে। যদি আপনি প্রকৃতপক্ষে "একই শ্রেণীর একাধিক সংস্করণ" বোঝায় তবে তা ক্লাসলোডারের উপর নির্ভর করে। "নিকটতম" একটি লোড করা হবে।
BalusC

আচ্ছা আমি মনে করি আপনার সাথে যদি এজার A, বিজার সাথে B extends Aএবং সিজারের সাথে সিজার থাকে C extends Bতবে এ.এর উপর সি নির্ভরতা পরোক্ষ হলেও যদিও সিজার এ.আর এর সময় সংকলনের উপর নির্ভর করে।
জিপিচে

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

2

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

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

উভয় নির্ভরতা, সাধারণত এবং না হওয়া উচিত একই দিকে প্রবাহিত। এটি যদিও ওও ডিজাইনের বিষয়।

সি ++ তে, সংকলনটি কিছুটা আলাদা (কেবলমাত্র সময়ের সাথে নয়) তবে এর একটি লিঙ্কারও রয়েছে। সুতরাং প্রক্রিয়াটি জাভা আমার অনুমানের মতোই ভাবা যেতে পারে।

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