স্থির এবং ভাগ করা লাইব্রেরির মধ্যে পার্থক্য?


560

স্থির এবং ভাগ করা লাইব্রেরির মধ্যে পার্থক্য কী?

আমি Eclipse ব্যবহার করি এবং স্ট্যাটিক লাইব্রেরি এবং ভাগ করা লাইব্রেরি সহ বেশ কয়েকটি প্রকল্পের ধরণ রয়েছে? একজনের কি অন্যের চেয়ে সুবিধা রয়েছে?


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

উত্তর:


745

ভাগ করা লাইব্রেরিগুলি হ'ল .so (বা উইন্ডোজ .dll বা OS X .dlib এ) ফাইল। লাইব্রেরি সম্পর্কিত সমস্ত কোড এই ফাইলে রয়েছে এবং এটি রান-টাইমে ব্যবহার করে প্রোগ্রামগুলি দ্বারা রেফারেন্স করা হয়। একটি ভাগ করা লাইব্রেরি ব্যবহার করে এমন একটি প্রোগ্রাম কেবল সেই কোডটি রেফারেন্স তৈরি করে যা এটি ভাগ করা লাইব্রেরিতে ব্যবহার করে।

স্ট্যাটিক লাইব্রেরিগুলি হ'ল .a (বা উইন্ডোজ .লিবিতে) ফাইল। লাইব্রেরির সাথে সম্পর্কিত সমস্ত কোড এই ফাইলে রয়েছে এবং এটি সংকলনের সময় সরাসরি প্রোগ্রামের সাথে যুক্ত হয়। একটি স্ট্যাটিক লাইব্রেরি ব্যবহার করে একটি প্রোগ্রাম স্ট্যাটিক লাইব্রেরি থেকে কোডটি অনুলিপি গ্রহণ করে এবং এটিকে প্রোগ্রামের অংশ করে তোলে। [উইন্ডোজে .lib ফাইল রয়েছে যা .dll ফাইলগুলি উল্লেখ করতে ব্যবহৃত হয়, তবে তারা প্রথমটির মতোই কাজ করে]।

প্রতিটি পদ্ধতিতে সুবিধা এবং অসুবিধা রয়েছে:

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

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

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


2
"ভাগ করা বস্তুটি ... কার্যত সমমানের সাথে প্রতিস্থাপন করুন, তবে [সম্পাদনা] পারফরম্যান্স" করতে পারেন: বিশেষত, সমান কলারের মুখোমুখি কার্যকারিতা এপিআইয়ের সিমেটিক ব্যবহারে (অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেস: ফাংশন স্বাক্ষর এবং প্রকারগুলি সহ ভেরিয়েবল), তবে বাস্তবায়ন-পক্ষ কার্যকারিতা পারফেক্টের চেয়ে আলাদা হতে পারে: যেমন ফাংশন সর্বদা ফাইলটিতে লগ করে -> এছাড়াও টিসিপি সার্ভারে লগ হয়: পোর্টটি expected MY_APP_LOG_SERVER তে প্রত্যাশিত।
টনি ডেলরয়

1
"[.সোস এ।] ফাংশনগুলি সম্পাদনের জন্য সামান্য অতিরিক্ত ব্যয়" - এটি সম্ভব (যদি ফাংশন গ্রুপগুলি / ক্রম স্থির লিঙ্কে ক্যাশে স্থানীয়করণের জন্য অনুকূল হয়ে থাকে, বা ওএস / লোডার / সংকলক / আর্কিটেকচারের মতো ক্রসের মতো প্রতিকূলতার কারণে) -সেটমেন্ট / লার্জ-পয়েন্টার পারফেক্ট। পেনাল্টি), তবে অনেকগুলি আর্কিটেকচার / সংকলক-সেটিংসে ডায়নামিক লিঙ্কার কলটি প্যাচ করে ঠিক একই কলিং মেশিনের অপকডগুলি তৈরি করে।
টনি ডেলরয়

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

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

1
এই উত্তরটি আরও সুসংহত হতে পারে। যেখানে পার্থক্য রয়েছে সেখানে প্রতিটি মাত্রার মধ্যে পার্থক্যগুলি দেখানোর পক্ষে পক্ষে / পক্ষে বা একটি সারণীর বুলেট তালিকা তৈরি করা সহায়ক হবে।
এলিফ্যান্ট

377

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


70

সরলীকৃত:

  • স্ট্যাটিক লিঙ্কিং: একটি বড় এক্সিকিউটেবল
  • ডায়নামিক লিঙ্কিং: একটি ছোট এক্সিকিউটেবল প্লাস এক বা একাধিক লাইব্রেরি ফাইল (উইন্ডোজে .dll ফাইল, লিনাক্সে .so, অথবা ম্যাকোজে .dlib)

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

36

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

ভাগ করা লাইব্রেরির জন্য, সংকলক / লিঙ্কার চেক করে যে আপনার সাথে লিঙ্ক করা নামগুলি অ্যাপ্লিকেশনটি তৈরি হওয়ার সময় লাইব্রেরিতে উপস্থিত রয়েছে, তবে তাদের কোডটি অ্যাপ্লিকেশনটিতে স্থানান্তরিত করে না। রান সময়ে, ভাগ করা লাইব্রেরি অবশ্যই পাওয়া যায়।

সি প্রোগ্রামিং ল্যাঙ্গুয়েজে নিজেই স্থির বা ভাগ করা লাইব্রেরিগুলির কোনও ধারণা নেই - এগুলি সম্পূর্ণরূপে একটি বাস্তবায়ন বৈশিষ্ট্য।

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


5
"1 এর জন্য" সি প্রোগ্রামিং ভাষার নিজস্ব কোনও স্ট্যাটিক বা ভাগ করা লাইব্রেরি সম্পর্কে ধারণা নেই - এগুলি সম্পূর্ণরূপে বাস্তবায়ন বৈশিষ্ট্য। "
টাইগার

1
হাই আনন / @ টাইগার, আপনি কেন বলেছেন যে "সি প্রোগ্রামিং ল্যাঙ্গুয়েজ নিজেই স্ট্যাটিক বা শেয়ার্ড লাইব্রেরি সম্পর্কে কোনও ধারণা নেই - এগুলি সম্পূর্ণরূপে বাস্তবায়ন বৈশিষ্ট্য?" আপনি কি দয়া করে কিছুটা বিশদ বর্ণনা করতে পারেন বা আমাকে উপযুক্ত রেফারেন্সে নির্দেশ করতে পারেন?
সুনীল শাহু

@ সুনীলশাহু প্রোগ্রামটি কীভাবে সংকলিত এবং লিঙ্কযুক্ত তা আপনি যে সংকলক এবং লিঙ্কারটি ব্যবহার করছেন তার সাথে সম্পর্কিত, অর্থাত্ ভাষার নির্দিষ্ট প্রয়োগ implementation ভাষা speficications সাধারণত বর্ণনা না কিভাবে ভাষায় বাস্তবায়িত হবে অথবা নির্মিত, শুধুমাত্র কার্যকারিতা, সিনট্যাক্স, ব্যাকরণ, ইত্যাদি
জেসি Rocamonde

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

31

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

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

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


3
এটি পরিচিত হিসাবে DLL
হেল্প

1
"স্ট্যাটিক লাইব্রেরিগুলি একটি অ্যাপ্লিকেশনের অংশ হিসাবে সংকলিত হয়" ... স্ট্যাটিক লাইব্রেরিগুলি স্থির গ্রন্থাগার হিসাবে সংকলিত হয় এবং একটি অ্যাপ্লিকেশন অংশ হিসাবে যুক্ত হয়
idclev 463035818

19

ভাগ করা লাইব্রেরিগুলির সর্বাধিক উল্লেখযোগ্য সুবিধা হ'ল মেমরিতে লোড হওয়া কোডের কেবলমাত্র একটি অনুলিপি রয়েছে, লাইব্রেরিটি কতগুলি প্রক্রিয়া ব্যবহার করছে তা বিবেচনা করে না। স্ট্যাটিক লাইব্রেরির জন্য প্রতিটি প্রক্রিয়া কোডের নিজস্ব কপি পায়। এটি উল্লেখযোগ্য স্মৃতিশক্তি অপচয় করতে পারে।

OTOH, স্থির গ্রন্থাগারগুলির একটি সুবিধা হ'ল সবকিছু আপনার অ্যাপ্লিকেশনটিতে বান্ডিল হয়ে আছে। সুতরাং আপনার উদ্বেগের দরকার নেই যে ক্লায়েন্টের তাদের সিস্টেমে সঠিক লাইব্রেরি (এবং সংস্করণ) পাওয়া যাবে।


1
এক্সিকিউটেবল ইমেজটি ডিস্কে বড়, সেইসাথে মেমরিতেও স্ট্যাটিক লিবস ব্যবহার করার সময়।
জাস্টজেফ

এটি ঠিক আছে, আমি যখন বলেছিলাম যে আপনার অ্যাপ্লিকেশনটিতে সমস্ত কিছু বান্ডিল হয়ে গেছে তখনই আমি এটির ইঙ্গিত দিচ্ছিলাম।
জস্মিত

অতিরিক্তভাবে, .so* নিক্স সিস্টেমে ফাইলগুলি টাইপ করা শেয়ার্ড (ডায়নামিক) লাইব্রেরি।
20:20

6

অন্যান্য সমস্ত উত্তরের উপরে, এখনও উল্লেখ করা হয়নি এমন একটি জিনিস হ'ল ডিকপল করছে:

আমাকে আসল ওয়ার্ল্ড প্রোডাকশন কোড সম্পর্কে কথা বলতে দাও, যা আমি কাজ করছি:

> 300 প্রকল্প (ভিজ্যুয়াল স্টুডিও সহ) এর তৈরি একটি খুব বড় সফ্টওয়্যার, বেশিরভাগ স্থিতিশীল lib হিসাবে তৈরি করে এবং শেষ পর্যন্ত সমস্ত লিঙ্ককে এক বিশাল কার্যকর কার্যকর হিসাবে একত্রিত করে, আপনি নিম্নলিখিত সমস্যার সাথে শেষ করেন:

লিঙ্ক সময় অত্যন্ত দীর্ঘ। আপনি সংযোগের 15 মিনিটেরও বেশি দ্বারা শেষ হতে পারেন, যাক 10 সংকলন সময়ের 10s এর জন্য বলুন-কিছু সরঞ্জাম তাদের হাঁটুতে এত বড় এক্সিকিউটেবল যেমন মেমরি চেক সরঞ্জামগুলির সাথে কোডটি ইনস্ট্রুমেন্টের সাথে আবশ্যক with আপনি বোকা হিসাবে দেখা হয়েছে যে সীমার মধ্যে পড়ে যেতে পারে।

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

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


2
-------------------------------------------------------------------------
|  +-  |    Shared(dynamic)       |   Static Library (Linkages)         |
-------------------------------------------------------------------------
|Pros: | less memory use          |   an executable, using own libraries|
|      |                          |     ,coming with the program,       |
|      |                          |   doesn't need to worry about its   |
|      |                          |   compilebility subject to libraries|
-------------------------------------------------------------------------
|Cons: | implementations of       |   bigger memory uses                |
|      | libraries may be altered |                                     |
|      | subject to OS  and its   |                                     |
|      | version, which may affect|                                     |
|      | the compilebility and    |                                     |
|      | runnability of the code  |                                     |
-------------------------------------------------------------------------
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.