স্থির এবং ভাগ করা লাইব্রেরির মধ্যে পার্থক্য কী?
আমি Eclipse ব্যবহার করি এবং স্ট্যাটিক লাইব্রেরি এবং ভাগ করা লাইব্রেরি সহ বেশ কয়েকটি প্রকল্পের ধরণ রয়েছে? একজনের কি অন্যের চেয়ে সুবিধা রয়েছে?
স্থির এবং ভাগ করা লাইব্রেরির মধ্যে পার্থক্য কী?
আমি Eclipse ব্যবহার করি এবং স্ট্যাটিক লাইব্রেরি এবং ভাগ করা লাইব্রেরি সহ বেশ কয়েকটি প্রকল্পের ধরণ রয়েছে? একজনের কি অন্যের চেয়ে সুবিধা রয়েছে?
উত্তর:
ভাগ করা লাইব্রেরিগুলি হ'ল .so (বা উইন্ডোজ .dll বা OS X .dlib এ) ফাইল। লাইব্রেরি সম্পর্কিত সমস্ত কোড এই ফাইলে রয়েছে এবং এটি রান-টাইমে ব্যবহার করে প্রোগ্রামগুলি দ্বারা রেফারেন্স করা হয়। একটি ভাগ করা লাইব্রেরি ব্যবহার করে এমন একটি প্রোগ্রাম কেবল সেই কোডটি রেফারেন্স তৈরি করে যা এটি ভাগ করা লাইব্রেরিতে ব্যবহার করে।
স্ট্যাটিক লাইব্রেরিগুলি হ'ল .a (বা উইন্ডোজ .লিবিতে) ফাইল। লাইব্রেরির সাথে সম্পর্কিত সমস্ত কোড এই ফাইলে রয়েছে এবং এটি সংকলনের সময় সরাসরি প্রোগ্রামের সাথে যুক্ত হয়। একটি স্ট্যাটিক লাইব্রেরি ব্যবহার করে একটি প্রোগ্রাম স্ট্যাটিক লাইব্রেরি থেকে কোডটি অনুলিপি গ্রহণ করে এবং এটিকে প্রোগ্রামের অংশ করে তোলে। [উইন্ডোজে .lib ফাইল রয়েছে যা .dll ফাইলগুলি উল্লেখ করতে ব্যবহৃত হয়, তবে তারা প্রথমটির মতোই কাজ করে]।
প্রতিটি পদ্ধতিতে সুবিধা এবং অসুবিধা রয়েছে:
ভাগ করা লাইব্রেরিগুলি বাইনারিগুলি ছোট রেখে প্রতিটি প্রোগ্রামে ডুপ্লিকেটেড কোডের পরিমাণ হ্রাস করে। এটি আপনাকে ভাগ করা বস্তুটি কার্যকরী সমতুল্যর সাথে প্রতিস্থাপন করতে দেয়, তবে প্রোগ্রামটি পুনরায় সংকলন না করে পারফরম্যান্স সুবিধাগুলি যোগ করতে পারে যা এটির ব্যবহার করে। ভাগ করা লাইব্রেরিগুলিতে, ফাংশনগুলি সম্পাদন করার জন্য একটি অল্প অতিরিক্ত ব্যয় পাশাপাশি একটি রান-টাইম লোডিং ব্যয়ও থাকবে কারণ গ্রন্থাগারের সমস্ত চিহ্নগুলি তাদের ব্যবহার করা জিনিসগুলির সাথে সংযুক্ত করা দরকার। অতিরিক্ত হিসাবে, ভাগ করা লাইব্রেরিগুলি রান-টাইমে একটি অ্যাপ্লিকেশনে লোড করা যায় যা বাইনারি প্লাগ-ইন সিস্টেমগুলি প্রয়োগ করার জন্য সাধারণ প্রক্রিয়া।
স্ট্যাটিক লাইব্রেরিগুলি বাইনারিগুলির সামগ্রিক আকার বৃদ্ধি করে, তবে এর অর্থ হল যে আপনার ব্যবহৃত লাইব্রেরির একটি অনুলিপি বহন করার দরকার নেই। কোডটি সংকলনের সময় সংযুক্ত থাকায় কোনও অতিরিক্ত রান-টাইম লোডিং ব্যয় নেই। কোডটি কেবল সেখানে।
ব্যক্তিগতভাবে, আমি ভাগ করা লাইব্রেরিগুলি পছন্দ করি তবে বাইনারিটির অনেকগুলি বহিরাগত নির্ভরতা না পাওয়া যেগুলি পূরণ করা কঠিন হতে পারে তা নিশ্চিত করার জন্য যখন প্রয়োজন হয় তখন স্ট্যাটিক লাইব্রেরি ব্যবহার করি যেমন সি ++ স্ট্যান্ডার্ড লাইব্রেরির নির্দিষ্ট সংস্করণ বা বুস্ট সি ++ গ্রন্থাগারের নির্দিষ্ট সংস্করণ।
একটি স্ট্যাটিক লাইব্রেরি একটি বইয়ের দোকানের মতো, এবং একটি ভাগ করা লাইব্রেরি ... লাইব্রেরির মতো। প্রাক্তনটির সাথে, আপনি নিজের বই / ফাংশনের অনুলিপি ঘরে নেওয়ার জন্য পান; পরেরটির সাথে আপনি এবং অন্য সবাই একই বই / ফাংশনটি ব্যবহার করতে লাইব্রেরিতে যান। সুতরাং যে কেউ (ভাগ করা) লাইব্রেরিটি ব্যবহার করতে চায় তাদের এটি কোথায় আছে তা জানতে হবে, কারণ আপনাকে বই / ফাংশনটি "পেতে" যেতে হবে। একটি স্ট্যাটিক লাইব্রেরি সহ, বই / ফাংশনটি আপনার নিজস্ব এবং আপনি এটি আপনার বাড়ি / প্রোগ্রামের মধ্যে রাখেন, এবং একবার এটি আপনার হয়ে গেলে আপনি কোথায় পাবেন বা কখন তা পাত্তা দেবেন না।
সরলীকৃত:
একটি স্ট্যাটিক লাইব্রেরির জন্য, লিংক দ্বারা কোডটি লাইব্রেরি থেকে বের করা হয় এবং আপনি যখন আপনার অ্যাপ্লিকেশনটি সংকলন / নির্মাণ করেন তখন আপনি চূড়ান্ত সম্পাদনযোগ্যকে তৈরি করতে ব্যবহার করেন। চূড়ান্ত সম্পাদনযোগ্য রান করার সময় গ্রন্থাগারের উপর কোন নির্ভরতা নেই
ভাগ করা লাইব্রেরির জন্য, সংকলক / লিঙ্কার চেক করে যে আপনার সাথে লিঙ্ক করা নামগুলি অ্যাপ্লিকেশনটি তৈরি হওয়ার সময় লাইব্রেরিতে উপস্থিত রয়েছে, তবে তাদের কোডটি অ্যাপ্লিকেশনটিতে স্থানান্তরিত করে না। রান সময়ে, ভাগ করা লাইব্রেরি অবশ্যই পাওয়া যায়।
সি প্রোগ্রামিং ল্যাঙ্গুয়েজে নিজেই স্থির বা ভাগ করা লাইব্রেরিগুলির কোনও ধারণা নেই - এগুলি সম্পূর্ণরূপে একটি বাস্তবায়ন বৈশিষ্ট্য।
ব্যক্তিগতভাবে, আমি অনেকটা স্থির গ্রন্থাগারগুলি ব্যবহার করতে পছন্দ করি কারণ এটি সফ্টওয়্যার বিতরণকে আরও সহজ করে তোলে। যাইহোক, এটি এমন একটি মতামত যা অতীতে অনেক (রূপক) রক্ত প্রবাহিত হয়েছিল।
স্ট্যাটিক লাইব্রেরিগুলি একটি অ্যাপ্লিকেশনের অংশ হিসাবে সংকলিত হয়, যেখানে ভাগ করা লাইব্রেরি নেই। আপনি যখন এমন অ্যাপ্লিকেশন বিতরণ করেন যা ভাগ করে দেওয়া লাইবারিগুলির উপর নির্ভর করে, গ্রন্থাগারগুলি, যেমন। dll এর এমএস উইন্ডোজ ইনস্টল করা দরকার।
স্ট্যাটিক লাইব্রেরিগুলির সুবিধা হ'ল অ্যাপ্লিকেশনটি চালিত ব্যবহারকারীর জন্য কোনও নির্ভরতা নেই - যেমন তাদের ডিএলএল যা কিছু আপগ্রেড করতে হবে না। অসুবিধাটি হ'ল আপনার অ্যাপ্লিকেশনটি আকারে আরও বড় কারণ আপনি এটি প্রয়োজনীয় সমস্ত লাইব্রেরি দিয়ে শিপিং করছেন।
পাশাপাশি ছোট অ্যাপ্লিকেশনগুলিতে নেতৃত্ব দেওয়ার পাশাপাশি, ভাগ করা লাইব্রেরিগুলি ব্যবহারকারীর নিজস্ব ব্যবহারের দক্ষতা সরবরাহ করে, সম্ভবত অ্যাপ্লিকেশনটির অংশের উপর নির্ভর করে লাইব্রেরির আরও ভাল সংস্করণ
ভাগ করা লাইব্রেরিগুলির সর্বাধিক উল্লেখযোগ্য সুবিধা হ'ল মেমরিতে লোড হওয়া কোডের কেবলমাত্র একটি অনুলিপি রয়েছে, লাইব্রেরিটি কতগুলি প্রক্রিয়া ব্যবহার করছে তা বিবেচনা করে না। স্ট্যাটিক লাইব্রেরির জন্য প্রতিটি প্রক্রিয়া কোডের নিজস্ব কপি পায়। এটি উল্লেখযোগ্য স্মৃতিশক্তি অপচয় করতে পারে।
OTOH, স্থির গ্রন্থাগারগুলির একটি সুবিধা হ'ল সবকিছু আপনার অ্যাপ্লিকেশনটিতে বান্ডিল হয়ে আছে। সুতরাং আপনার উদ্বেগের দরকার নেই যে ক্লায়েন্টের তাদের সিস্টেমে সঠিক লাইব্রেরি (এবং সংস্করণ) পাওয়া যাবে।
.so
* নিক্স সিস্টেমে ফাইলগুলি টাইপ করা শেয়ার্ড (ডায়নামিক) লাইব্রেরি।
অন্যান্য সমস্ত উত্তরের উপরে, এখনও উল্লেখ করা হয়নি এমন একটি জিনিস হ'ল ডিকপল করছে:
আমাকে আসল ওয়ার্ল্ড প্রোডাকশন কোড সম্পর্কে কথা বলতে দাও, যা আমি কাজ করছি:
> 300 প্রকল্প (ভিজ্যুয়াল স্টুডিও সহ) এর তৈরি একটি খুব বড় সফ্টওয়্যার, বেশিরভাগ স্থিতিশীল lib হিসাবে তৈরি করে এবং শেষ পর্যন্ত সমস্ত লিঙ্ককে এক বিশাল কার্যকর কার্যকর হিসাবে একত্রিত করে, আপনি নিম্নলিখিত সমস্যার সাথে শেষ করেন:
লিঙ্ক সময় অত্যন্ত দীর্ঘ। আপনি সংযোগের 15 মিনিটেরও বেশি দ্বারা শেষ হতে পারেন, যাক 10 সংকলন সময়ের 10s এর জন্য বলুন-কিছু সরঞ্জাম তাদের হাঁটুতে এত বড় এক্সিকিউটেবল যেমন মেমরি চেক সরঞ্জামগুলির সাথে কোডটি ইনস্ট্রুমেন্টের সাথে আবশ্যক with আপনি বোকা হিসাবে দেখা হয়েছে যে সীমার মধ্যে পড়ে যেতে পারে।
আপনার সফ্টওয়্যারটির ডিউপলিং আরও সমস্যাযুক্ত: এই বাস্তব বিশ্বের উদাহরণে, প্রতিটি প্রকল্পের শিরোনামের ফাইলগুলি অন্য কোনও প্রকল্পের থেকে গ্রহণযোগ্য ছিল। ফলস্বরূপ একজন বিকাশকারীর পক্ষে নির্ভরতা যুক্ত করা অত্যন্ত সহজ ছিল; এটি কেবল শিরোলেখ সহ অন্তর্ভুক্ত ছিল, কারণ লিঙ্কটি শেষে প্রতীকগুলি সন্ধান করবে। এটি ভয়াবহ সাইক্লিং নির্ভরতা এবং সম্পূর্ণ জগাখিচুড়ি দ্বারা শেষ হয়।
ভাগ করা লাইব্রেরি সহ, এটি কিছুটা অতিরিক্ত কাজ কারণ বিকাশকারীকে নির্ভর করে পাঠাগারটি যুক্ত করতে প্রকল্প বিল্ড সিস্টেমটি সম্পাদনা করতে হবে। আমি লক্ষ্য করেছি যে ভাগ করা লাইব্রেরি কোডটি একটি ক্লিনার কোড এপিআই সরবরাহ করে।
-------------------------------------------------------------------------
| +- | 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 | |
-------------------------------------------------------------------------