क्या मानक संख्यात्मक एल्गोरिदम के लिए पुस्तकालयों का उपयोग नहीं करना आम है, और क्यों?


54

जीएसएल जैसी वैज्ञानिक गणना पुस्तकालयों में बहुत सारे संख्यात्मक एल्गोरिदम (एकीकरण, विभेदन, प्रक्षेप, विशेष कार्य आदि) उपलब्ध हैं । लेकिन मैं अक्सर इन कार्यों के "हाथ से लुढ़का" कार्यान्वयन के साथ कोड देखता हूं। छोटे कार्यक्रमों के लिए, जो सार्वजनिक वितरण के लिए जरूरी नहीं हैं, क्या यह कम्प्यूटेशनल वैज्ञानिकों के बीच केवल संख्यात्मक एल्गोरिदम को लागू करने के लिए सामान्य अभ्यास है (जिसके द्वारा मुझे किसी वेबसाइट, न्यूमेरिकल व्यंजनों, या इसी तरह की नकल की आवश्यकता होती है) जब आपको उनकी आवश्यकता होती है? यदि हां, तो क्या जीएसएल जैसी किसी चीज से जुड़ने से बचने का कोई विशेष कारण है , या यह किसी और चीज की तुलना में सिर्फ "परंपरा" है?

मैं पूछता हूं क्योंकि मैं कोड के पुन: उपयोग का एक बड़ा प्रशंसक हूं , जो यह सुझाव देगा कि मुझे संभव होने पर मौजूदा कार्यान्वयन का उपयोग करने का प्रयास करना चाहिए। लेकिन मैं उत्सुक हूं कि क्या कारण हैं कि सिद्धांत सामान्य प्रोग्रामिंग की तुलना में वैज्ञानिक गणना में कम मूल्यवान है ।


उल्लेख करना भूल गए: मैं विशेष रूप से सी और सी ++ के बारे में पूछ रहा हूं, क्योंकि पायथन जैसी भाषाओं के विपरीत जहां लाइब्रेरी का उपयोग करने का स्पष्ट लाभ (निष्पादन की गति) है।


14
एक तरफ, आप पहिया को सुदृढ़ नहीं करना चाहेंगे। दूसरी ओर, एक एल्गोरिथ्म को समझने का सबसे अच्छा तरीका (और विस्तार से, आसानी से उन मामलों का निदान करना जहां एल्गोरिदम शानदार ढंग से विफल हो जाता है) एक कार्यान्वयन को स्वयं कोड करने का प्रयास करना है।
JM

2
क्या आप हर उस प्रमेय को दोहराते हैं जिसे आप भरते हैं? हो सकता है कि आप इसे एक शॉट दें और कुछ बच्चे के मामलों के साथ खेलें, लेकिन जब तक यह आपके शोध का ध्यान नहीं है, तब तक आप इसे स्वीकार करते हैं और जीवन के साथ आगे बढ़ते हैं।
dls

3
भौतिक विज्ञानी प्रोग्रामर नहीं हैं और उनका उपयोग अन्य लोगों के कोड (इसे पढ़ने या इसे ठीक करने) से निपटने के लिए नहीं किया जाता है। जब उन्हें दूसरों के कोड का उपयोग करना होता है, तो यह अक्सर अन्य भौतिकविदों द्वारा लिखे गए बहुत अच्छी तरह से लिखे या अच्छी तरह से टिप्पणी किए गए कोड नहीं होता है, फिर से इस विचार को जोड़ते हुए कि इसे फिर से उपयोग करने की तुलना में इसे फिर से लिखना बेहतर है। यह कम से कम कुछ क्षेत्रों / समुदायों में सही है, लेकिन छोटे लोगों के बीच दृष्टिकोण बदल रहे हैं। यह सब बुरा नहीं है, लेकिन खराब सीएस छात्र के रवैये के बारे में सोचें जो कुछ नहीं कर सकता है अगर वह इसके लिए एक आसान पर्याप्त पुस्तकालय नहीं पा सकता है।
शैबॉलेज़

जवाबों:


45

मैं खुद सब कुछ लागू करता था, लेकिन हाल ही में पुस्तकालयों का उपयोग करना शुरू कर दिया है। मुझे लगता है कि एक पुस्तकालय का उपयोग करने के कई बहुत महत्वपूर्ण फायदे हैं, सिर्फ इस मुद्दे से परे कि आपको खुद एक दिनचर्या लिखना है या नहीं। यदि आप एक पुस्तकालय का उपयोग करते हैं, तो आपको मिलता है

  • कोड जो सैकड़ों / हजारों / अधिक उपयोगकर्ताओं द्वारा परीक्षण किया गया है
  • कोड जो आपकी ओर से बिना किसी काम के, भविष्य में अपडेट और बेहतर होता रहेगा
  • ऑप्टिमाइज्ड कोड जो पहले प्रयास में आप जितना लिखेंगे उससे अधिक कुशल और शायद अधिक स्केलेबल है
  • पुस्तकालय के आधार पर, अपने कोड में एक इंटरफ़ेस स्थापित करके आप कई एल्गोरिदम तक पहुंच प्राप्त कर सकते हैं जो आप वर्तमान में उपयोग नहीं करते हैं, लेकिन भविष्य में चाहते हैं।

ऊपर अंतिम बुलेट बिंदु में, मैं जैसे बड़े पुस्तकालयों की सोच रहा हूँ Trilinos या PETSc । मैं PyClaw के विकास में ठोस व्यक्तिगत उदाहरणों के एक जोड़े के साथ इसे सुदृढ़ कर सकता हूं । हालाँकि यह MPI कॉल के साथ Clawpack को समानांतर करने के लिए सीधा होता , लेकिन हमने PETSc का उपयोग करना चुना। इसने हमें पैकेज में समानता कोड को पाइथन की 300 से कम लाइनों तक सीमित करने की अनुमति दी, लेकिन इससे भी बेहतर, पेट्स के प्रारूप में हमारे डेटा को डालकर, हमने पेट्सक के अंतर्निहित सॉल्वरों तक तत्काल पहुंच प्राप्त की, जो पाइक्लाव में एक अंतर्निहित सॉल्वर पर वर्तमान काम को सक्षम करता है। एक दूसरे उदाहरण के रूप में, PyClaw ने शुरू में हाथ-कोड पांचवें क्रम के WENO पुनर्निर्माण को शामिल किया, लेकिन हमने अंततः PyWENO पर भरोसा करने का फैसला कियाइसके लिए पैकेज। यह एक बड़ा लाभ था, क्योंकि PyWENO स्वचालित रूप से कई भाषाओं में किसी भी क्रम के WENO दिनचर्या उत्पन्न कर सकता है।

अंत में, यदि आप पुस्तकालयों का उपयोग करते हैं, तो आप सुधारों को विकसित करके या बग ढूंढकर अपना योगदान दे सकते हैं, जिससे कई अन्य लोगों को लाभ होगा, जबकि डिबगिंग या अपने स्वयं के कोड में सुधार करने से आपको केवल लाभ होता है।


5
"आप सुधारों को विकसित करके या बग ढूंढकर अपना योगदान दे सकते हैं, जिससे कई अन्य लोगों को लाभ होगा।" - जो दोनों "टिंकरिंग / लर्निंग" आग्रह और आलस्य (जो पहले से किए गए कामों को नहीं करने के लिए संतुष्ट करेगा) को संतुष्ट करेगा। :)
JM

1
किनारे के मामले भी देखें। कई एल्गोरिदम के लिए कुछ "लागू" करने के लिए अपने तुच्छ, लेकिन मामलों के कुछ छोटे अंशों को सही ढंग से संभाल नहीं पाएंगे। यह एक 1-बंद छोटी परियोजना के लिए ठीक हो सकता है, लेकिन मैं कई बार एक रोग संबंधी स्थितियों से छीन लिया गया हूं जिसे मैं खुद से "अनुकूलित" करता हूं।
मेवोप्लप

34

लाइब्रेरी फ़ंक्शन को जोड़ने में पर्याप्त प्रोग्रामर ओवरहेड शामिल है, खासकर यदि वह प्रोग्रामर के लिए नया है। यह अक्सर एक विशेष पुस्तकालय की बारीकियों को समझने के बजाय सरल एल्गोरिदम को फिर से लिखना सरल होता है। जैसे-जैसे एल्गोरिदम अधिक जटिल होते जाते हैं यह व्यवहार बदल जाता है।

पाइथन ने इस ओवरहेड को पाइप / easy_install और एक समान डेटा संरचना इंटरफ़ेस (जैसे कि हर लाइब्रेरी को लगता है कि एक खस्ता सरणी पैदा करता है) के साथ इस ओवरहेड को कम करने में उत्कृष्टता प्राप्त की है।


19

जिन परियोजनाओं में मैं अभी शामिल हूं उनमें से एक कण भौतिकी डिटेक्टरों के एक वर्ग के लिए एक लचीला सिमुलेशन और विश्लेषण पैकेज लिख रहा है। इस परियोजना का एक लक्ष्य यह है कि आने वाले दशकों में इन चीजों में इस्तेमाल होने वाला कोड आधार प्रदान किया जाए।

इस बिंदु पर, हमारे पास पहले से ही दो दर्जन निर्भरताएं हैं, निर्माण प्रक्रिया को एक ऐसी दुःस्वप्न बना रही है कि यह एक विश्वसनीय उपकरण-श्रृंखला प्रदान करने के लिए फ़र्मिलाब कंप्यूटिंग केंद्र से प्रबंधित एक अलग परियोजना को बंद कर दिया है।

अब कल्पना है कि आप कुछ उपकरण है जो के लिए एक की जरूरत का सामना नहीं है कि उपकरण श्रृंखला (सिर्फ पिछले महीने मुझे क्या हुआ) में। आपके पास तीन विकल्प हैं

  1. अपना रोल करो। सभी जोखिम और बाधाओं के साथ।
  2. कहीं एक पुस्तकालय से बाहर कुछ कोड परिमार्जन और इसे परियोजना में निर्देशन शामिल करें। मतलब कि आपको आगे बढ़ते हुए रखरखाव करना है, और ऐसा होने पर आपको किसी और के कोड को समझना होगा।
  3. टूल-चेन बनाए रखने वाले लोगों के पास जाएं, उनसे भीख मांगें जो आपको चाहिए और फिर इसे पाने के लिए एक रिलीज चक्र की प्रतीक्षा करें । ये लोग बहुत संवेदनशील होते हैं, लेकिन आपको इसके लिए काम करने वाले कोड के बिना या आपके (1) या (2) किए जाने के बाद मामला बनाना होगा ।

(1) चुनना बहुत आसान है। शायद बहुत आसान है।


हां, अतिरिक्त निर्भरता पुस्तकालयों का उपयोग करने का एक महत्वपूर्ण दोष है।
डेविड केचेसन

निर्भरता मेरे मन में भी बड़ी खामी है
Fomite

2
यह संभव है कि मेरा उत्तर निर्भरता के तथ्य पर बहुत अधिक भार डाल रहा है, और बड़ी परियोजनाओं में स्थापित निर्भरता अनुमोदित विज्ञापन प्राप्त करने की नौकरशाही प्रक्रिया पर पर्याप्त नहीं है।
dmckee

* आपका पॉइंट 3. (
नाइट्रिक के

एर कोई। यह कहता है कि मेरा क्या मतलब है।
dmckee

12

मुझे लगता है कि यह है बहुत आम, के साथ कुछ अधिक होने की संभावना एल्गोरिथम दूसरों से फिर से लागू किया जाना।

लाइब्रेरी को स्थापित करने के लिए कितना कष्टप्रद है, इसके बीच एक मुश्किल व्यापार-बंद है, एल्गोरिथ्म को स्वयं लागू करना कितना कठिन है, इसे अनुकूलित करना कितना कठिन है, और पुस्तकालय आपकी आवश्यकताओं को कितनी अच्छी तरह फिट करता है। इसके अलावा, कभी-कभी एक पुस्तकालय का उपयोग करना सिर्फ ओवरकिल होता है: मैंने अपने एक कार्यक्रम में धीमी द्विध्रुव एल्गोरिथ्म का उपयोग किया क्योंकि मैंने इसे केवल कुछ ही बार कहा था और मैं इसके लिए केवल एक पुस्तकालय जोड़ना नहीं चाहता था।

क्या आपके लिए एक अच्छी तरह से अनुकूलित संस्करण लिखना आसान है? यदि ऐसा है, तो आप इसे करने से बेहतर हो सकते हैं। आपको ठीक वही मिलेगा जो आपको चाहिए और आप किसी के काम पर निर्भर नहीं होंगे। लेकिन निश्चित रूप से आपको यह जानने की जरूरत है कि आप क्या कर रहे हैं: यहां तक ​​कि सरल एल्गोरिदम को लागू करने के लिए मुश्किल हो सकता है।

मैं इस पर एक अध्ययन देखने के लिए उत्सुक हूं, लेकिन मेरे पक्षपाती दृष्टिकोण से, वैज्ञानिक अक्सर रैखिक बीजगणित और यादृच्छिक संख्या जनरेटर के लिए पुस्तकालयों का उपयोग करते हैं, शेष कोड के अधिकांश घर का बना हुआ है।


12
"लेकिन निश्चित रूप से आपको यह जानने की जरूरत है कि आप क्या कर रहे हैं: यहां तक ​​कि सरल एल्गोरिदम को लागू करने के लिए मुश्किल हो सकता है।" - इस पर पर्याप्त जोर नहीं दिया जा सकता है।
JM

10

मुझे लगता है कि एक पुस्तकालय का उपयोग करने के बजाय एक एल्गोरिथ्म को लागू करना कभी-कभी मॉडल की बेहतर समझ और नियंत्रण दे सकता है। जब मैं वैज्ञानिक गणनाओं के लिए कुछ कार्यक्रम को कोड कर रहा हूं, तो मेरे लिए यह समझना महत्वपूर्ण है कि मैं क्या कर रहा हूं। महत्वपूर्ण एल्गोरिदम को लागू करने से मुझे समस्या का बेहतर ज्ञान प्राप्त करने और इसके बेहतर नियंत्रण को प्राप्त करने में मदद मिलती है।

दूसरी ओर, कभी-कभी एक पुस्तकालय का चयन करना कोई तुच्छ कार्य नहीं होता है जो एक समाधान प्राप्त करने के लिए आवश्यक है, इसलिए पहले से लागू किए गए एल्गोरिदम की खोज करना बेहतर है जब आप सुनिश्चित हों कि आप क्या हासिल करने की कोशिश कर रहे हैं और आप इसे क्यों चाहते हैं।

यदि एल्गोरिदम जटिल हैं, तो उन्हें हाथ से कोड करना आपको कार्य-विशिष्ट सुविधाओं का उपयोग करके समाधान के प्रदर्शन / गुणवत्ता में सुधार करने का अवसर देता है। और कभी-कभी एल्गोरिथ्म को थोड़ा बदलना आवश्यक होता है, जो कि आपके द्वारा लिखे गए कोड को जानता है और यदि आप चाहते हैं तो आप इसे संपादित कर सकते हैं।


1
समझ में सुधार के लिए +1। यद्यपि यह आपके स्वयं के एल्गोरिदम के लिए एक समस्या है जो एक पुस्तकालय दिनचर्या के लिए है।
फहीम मीठा

8

एक उत्तर यह है कि संख्यात्मक कोड में इतने मामूली बदलाव हैं कि एक पुस्तकालय में इनकैप्सुलेट करना वास्तव में कठिन है। वेब सॉफ़्टवेयर की तुलना में इसे लें, जो अक्सर स्थापित करना आसान होता है और इसमें इनपुट और आउटपुट का एक स्पष्ट सेट होता है। मुझे लगता है कि अधिक आम लोग एक फ्रेमवर्क, या बड़े पुस्तकालय को पकड़ते हैं जो एक फ्रेमवर्क (ट्रिलिनो / PETSc) की तरह काम करता है, और उस पारिस्थितिकी तंत्र का उपयोग करके सामुदायिक कोड का उपयोग करने के लाभ प्राप्त करता है।


7

पुस्तकालयों का उपयोग करने या न करने का निर्णय लेने से पहले, मुझे लगता है कि आप यह भी जानना चाहेंगे कि पुस्तकालय का उपयोग आपके कोड को कितना मदद करेगा। यदि आप एक महत्वपूर्ण कम्प्यूटेशनल कर्नेल के लिए एक अच्छी तरह से अनुकूलित लाइब्रेरी का उपयोग करने जा रहे हैं, तो यह संभवतः अपने स्वयं के लिखने की कोशिश करने की तुलना में बहुत अधिक कुशल है।

हालाँकि, यदि आप एक विशेष दिनचर्या लिख ​​रहे हैं, जिसे केवल एक कार्यक्रम के निष्पादन के दौरान एक बार बुलाया जाना है, तो लाइब्रेरी के लिए आवश्यक रूपरेखा को फिट करने के लिए अपने कोड को अनुकूलित करने के लिए इसके लायक नहीं हो सकता है।

(एक और बात के बारे में सोचने के लिए: आप पुस्तकालय का लाभ उठाने के लिए कितना री-आर्किटेक्चरिंग की आवश्यकता होगी? जब तक कोड को ठीक करने के लिए आपके द्वारा खर्च किए गए मानव-घंटे की दक्षता या संख्यात्मक सटीकता में संगत लाभ द्वारा मुआवजा नहीं दिया जाता है, यह नहीं हो सकता है लंबे समय में इसके लायक हो। आदर्श रूप से, हालांकि, यह वह चीज है जिसके लिए आप शुरू में डेटा संरचनाओं और एल्गोरिदम को डिजाइन करते समय योजना बनाते हैं, ताकि लाइब्रेरी के "प्रवाह" को जमीन से ऊपर ले जाया जाए।


6

मेरे 2 सेंट।

मुझे लगता है कि केवल C / C ++ के बजाय, इस बारे में आम तौर पर लिखना आसान है। सबसे पहले, पायथन जैसी भाषाओं में पुस्तकालयों को आवश्यक रूप से गति लाभ प्राप्त करने के लिए उपयोग नहीं किया जाता है, भले ही वह एक परिणाम हो। मुझे लगता है कि @ डेविड ने कारणों को अच्छी तरह से कवर किया।

इसे ऊपर से लेते हुए, कुछ हद तक भाषा कार्यान्वयन यह निर्धारित करता है कि आपके पास कौन से पुस्तकालय हैं। कम्प्यूटेशनल विज्ञान में आमतौर पर इस्तेमाल की जाने वाली भाषाओं में सी, सी ++, पायथन, पर्ल, जावा, फोरट्रान और आर। कम आम उदाहरण ओकेमेल और कॉमन लिस्प हो सकते हैं। अब, चूंकि इन भाषाओं में से अधिकांश सी में लिखे गए हैं, उनके पास सी के लिए एक प्राकृतिक विदेशी फ़ंक्शन इंटरफ़ेस है। हालांकि, कॉल करना इतना आसान नहीं है, कहते हैं, पायथन से एक पर्ल लाइब्रेरी या इसके विपरीत। तो व्यवहार में लोग या तो करते हैं

  1. उनकी कार्यान्वयन भाषा में लिखी गई लाइब्रेरी का उपयोग करें, जो कि मानक पुस्तकालयों का हिस्सा है, या अन्यथा व्यापक रूप से उपलब्ध है, या

  2. FFI भाषाओं के माध्यम से C / C ++ लाइब्रेरी को कॉल करें। यह मानता है कि एक आवरण पहले से मौजूद नहीं है, क्योंकि अगर यह होता है, तो यह आसानी से (1) से अलग नहीं होता है।

(2) आमतौर पर कठिन होता है, क्योंकि आपको C / C ++ फ़ंक्शन को स्वयं लपेटना होता है। इसके अलावा, आपको या तो पुस्तकालय को बंडल करना होगा, या एक अतिरिक्त निर्भरता जोड़ना होगा। उस कारण से, लोग जीएसएल का उपयोग करने के बजाय अंतर्निहित भाषा पुस्तकालयों का उपयोग करने की अधिक संभावना रखते हैं, उदाहरण के लिए, जो सी में है।

बहुत सामान्य दिनचर्या के लिए, वितरण से यादृच्छिक नमूने उत्पन्न करना, या इंटीग्रल के चतुर्थांश जैसे बुनियादी संख्यात्मक दिनचर्या बनाना, कुछ पुस्तकालय का पुन: उपयोग करना आसान और सामान्य है। जैसा कि कार्यक्षमता को लागू करने की कोशिश कर रहा है वह अधिक जटिल हो जाता है, यह तेजी से अधिक संभावना नहीं बन जाता है कि एक व्यक्ति को किसी अन्य पुस्तकालय में सटीक फ़ंक्शन ढूंढना पड़ रहा है, और यहां तक ​​कि एक भी करता है, व्यक्ति बहुत समय खोज और अंत में फ़ंक्शन को अपनाने में खर्च कर सकता है आवश्यक (कोड शैली / डिजाइन उदाहरण के लिए एक समस्या हो सकती है)। और जैसा कि ऊपर चर्चा की गई है, एक के पास पुस्तकालयों के केवल सबसेट तक पहुंच है। दूसरी ओर, एक एल्गोरिथ्म को लागू करना, यदि यह जटिल है और मुख्य फोकस कठिन नहीं है, और निश्चित रूप से उन pesky गति के मुद्दों से निपटना है।

तो, यह लागत / लाभ विश्लेषण में एक अनुकूलन समस्या बन जाती है। मेरा अनुभव यह है कि एमसीएमसी जैसी तुलनात्मक रूप से मानक तकनीकों के लिए भी, मैं आमतौर पर अपना कोड लिखना बंद कर देता हूं, क्योंकि यह इस बात से बेहतर है कि मैं समग्र सॉफ्टवेयर को कैसे डिजाइन कर रहा हूं।

बेशक, भले ही आप कोड का उपयोग न करें, अन्य लोगों के कोड से सीखना संभव है। मैं नहीं जानता कि वैज्ञानिक वास्तव में ऐसा करने के लिए कितनी बार परेशान होते हैं। मेरी धारणा है कि सीखने के लिए अन्य लोगों के कोड को पढ़ना एक सॉफ्टवेयर इंजीनियर की बात है।


6

अपने दूसरे साल के मैकेनिक्स कोर्स पर विचार करने के बाद, यह मेरे लिए होता है कि जिस कारण से मैंने अच्छी तरह से ज्ञात एल्गोरिदम के अपने संस्करणों को लागू किया है वह यह है कि मुझे इसे इस तरह से करने के लिए सिखाया गया था। मैं एक भी उदाहरण के बारे में नहीं सोच सकता, जहां मुझे सिखाया गया था कि मैं अपने अंडरग्रेजुएट भौतिकी शिक्षा में एक पुस्तकालय में कैसे इंटरफ़ेस और लिंक करूं। मुझे पहली बार किसी स्पिनिंग गोल्फ बॉल के निर्देशकों की सूची देखने की शौकीन याद है, जिसने खुद फोरट्रान में युग्मित न्यूटन समीकरणों के समाधान की गणना की है। एक निश्चित रोमांच और संतुष्टि (यहां तक ​​कि गर्व) है जो खरोंच से चीजों की गणना करने से आता है।


1
यह निश्चित रूप से एक कारक है। और यह कि यह खुद पर ध्यान केंद्रित एक कम्प्यूटेशनल वैज्ञानिक की शिक्षा के एक हिस्से के लिए आवश्यक है। शुद्ध प्रोग्रामर इसे किसी न किसी बिंदु पर उनसे बाहर निकलते हैं, लेकिन हमें विज्ञान के प्रकार उस परिचयात्मक कक्षा से सही तरीके से आगे बढ़ सकते हैं, जो लगभग उसी तरह से आने वाले अन्य लोगों द्वारा अनुमानित रूप से आबादी वाले क्षेत्र में आते हैं।
dmckee

5

मुझे लगता है कि किसी को जितना संभव हो सके परीक्षण किए गए पुस्तकालयों का उपयोग करना चाहिए। अधिकांश लोग संख्यात्मक अभिकलन के विशेषज्ञ नहीं हैं और शायद एक समाधान को सही ढंग से और सावधानी से लागू नहीं कर पाएंगे, जो अच्छी तरह से परीक्षण किए गए पुस्तकालयों में उपलब्ध है। हालांकि, यह कभी-कभी ऐसा होता है कि उपलब्ध पुस्तकालय नहीं हैं जो किसी दिए गए आवेदन में आवश्यक क्षमताओं के संयोजन को लागू करते हैं। मैंने यह देखा है कि मैं जिस तकनीकी क्षेत्र में काम करता हूं; मौजूदा कोड सभी मामलों को हल नहीं करते हैं, और किसी ने खरोंच से एक सॉल्वर को लागू करने को समाप्त कर दिया।


1
यदि पुस्तकालय आपकी सभी आवश्यकताओं को पूरा नहीं करता है, तो मैं आपको पुस्तकालय कोड का विस्तार करने और एक पैच जमा करने की सलाह दूंगा। इस तरह से आप अपने काम से कई अन्य लोगों को लाभान्वित करेंगे, और अन्य भी आपके लिए आपके कोड का परीक्षण करेंगे। बेशक, यह मानता है कि पुस्तकालय कोड पर्याप्त लचीले तरीके से लिखा गया था कि इसे आपकी आवश्यकताओं को पूरा करने के लिए बढ़ाया जा सकता है।
डेविड केचेसन

मैं सहमत हूं, यह एक महान समाधान है, और कुछ लोगों को यदि संभव हो तो करना चाहिए।
मुहका

5

मौलिक समस्या अक्सर एप्लिकेशन और लाइब्रेरी के बीच इंटरफेस के साथ होती है। एक आवेदन प्रोग्रामर को उस समस्या के बारे में ज्ञान होता है जो समस्या को पास करते समय अक्सर खो जाती है (उदाहरण के लिए एक मैट्रिक्स के रूप में) एक पुस्तकालय में। यह ज्ञान ऐसा है जो अत्यधिक अनुकूलित पुस्तकालय का उपयोग करने के लाभों से अधिक शोषण करता है। नतीजतन, आवेदन प्रोग्रामर अपने स्वयं के कार्यान्वयन को "रोल" करता है जो ज्ञान का शोषण करता है।

इस प्रकार, इस तरह के ज्ञान को पुस्तकालय में आवेदन से पारित करने के लिए वास्तव में अच्छी पुस्तकालय की आवश्यकता होती है, ताकि पुस्तकालय भी इसका लाभ उठा सकें।


3

उपरोक्त सभी बातों के अलावा, मैं "फोर्ट्रान बनाम सी ++" सवाल से अपना जवाब दोहराऊंगा: एक प्रोग्रामर के पास सबसे मूल्यवान संपत्ति उसका समय है। हां, बाहरी निर्भरताएं अक्सर अजीब होती हैं। लेकिन दूसरों को पहले से ही लागू किए गए डीबग और परीक्षण एल्गोरिदम को फिर से लागू करने के लिए समय बिताना लगभग हमेशा बेवकूफी भरा होता है, और इसका परिणाम भी शायद ही कभी उतना अच्छा होगा जैसा कि किसी विशेष विषय पर विशेषज्ञों द्वारा लिखा गया था। दूसरों ने जो किया है उसका पुनः उपयोग करें!


मैं इस विषय पर अपना जवाब देता हूं। जब आप सभी विवरणों को फिर से लिखते हैं तो आप बहुत कुछ सीख सकते हैं। मैं 5-6 वर्षों के लिए बिंदु बादलों के साथ काम करता हूं। पहले तीन साल मैंने सभी कार्यशीलता को लिखा। दूसरा आधा मैंने प्वाइंट क्लाउड लाइब्रेरी का उपयोग करके खर्च किया। मैं साबित नहीं कर सकता, लेकिन मैं अपने आप को पहले तीन वर्षों में पीसीएल में मजबूत विशेषज्ञ मानता हूं, जो उन समाधानों के बारे में सोच रहे थे जो दूसरों ने पहले ही प्रदान कर दिए थे।
जनवरी

@ जानहेनबर्ग - हाँ, लेकिन मुझे भी कुंद होने दें: आपने अपने जीवन के तीन साल बर्बाद कर दिए हैं। कल्पना करें कि यदि आपने दूसरों के लिए क्या किया है तो आप कितना नया सामान बना सकते हैं !?
वोल्फगैंग बैंगर्थ

मैंने अपने पहले पीएचडी वर्ष में जावा में लिखने का फैसला किया क्योंकि इस समय मैंने अपने प्रोग्रामिंग कौशल (सूचना विज्ञान में सिद्धांत नहीं) को शून्य के करीब माना। जावा अभी भी भाषा थी जो मैं व्यवहार में सर्वश्रेष्ठ थी। मैंने आसान मल्टी प्लेटफॉर्म सपोर्ट के कारण जावा को भी अच्छा विकल्प माना। मैंने पीएचडी (पारंपरिक वानिकी) में कोई अनौपचारिक समर्थन के साथ एक कुर्सी में प्रवेश किया। जब मैंने अपनी गलती का एहसास किया तो मैं c ++ में कूद गया और मैं (प्रकाशन के बाद, पहले नहीं) कर सका।
जनवरी हैकबर्ग

BTW मैं अपने जीवन के 3 साल विशाल में असहमत हूं। इसका मतलब यह होगा कि पीएचडी के बाद के अनुभव में मेरे पास केवल दो उपयोगी वर्ष थे। आज मैं वानिकी बिंदु वाले बादल में 10 बिलियन सिलिंडर फिट कर सकता हूं और मशीन को यह तय करने दूंगा कि पेड़ों का प्रतिनिधित्व करना अच्छा है। मेरे ~ 50 उपयोगकर्ता भी ऐसा कर सकते हैं। ~ 1 घंटे में। कठिन और समय लेने वाले तरीके सीखकर मैंने जो भी तरकीबें सीखीं। मैंने कभी भी यह सीखने का फैसला नहीं किया कि वीआई का उपयोग कैसे किया जाए, लेकिन जब सीखने की अवस्था से गुजरने वाले लोग कोड का उत्पादन करने के लिए सबसे कुशल तरीके का उपयोग करने का दावा करते हैं तो मुझे विश्वास होता है।
जनवरी हैकबर्ग

2

मैं जिस समूह के साथ काम करता हूं, वह पुस्तकालयों का यथासंभव उपयोग करता है। मैं कुछ प्रोग्रामर में से एक हूं, और बाकी लोगों ने काम पर प्रोग्रामिंग की। वे अपनी खुद की सीमाओं को जानने के लिए पर्याप्त हैं जहां उन्हें डब्बल नहीं होना चाहिए। IMSL पसंदीदा पुस्तकालय है। जीएसएल जैसा सामान लाइसेंस प्रतिबंधों के कारण निषिद्ध होगा, भले ही यह एक संघीय एजेंसी है और हम अपने सॉफ़्टवेयर को वैसे भी दूर देते हैं।


2

"पुन: उपयोग मुख्य रूप से एक सामाजिक घटना है। मैं किसी और के सॉफ़्टवेयर का उपयोग कर सकता हूं जो प्रदान किया गया है।"

  1. यह काम करता हैं
  2. यह समझ में आता है
  3. यह सह-अस्तित्व में हो सकता है
  4. यह समर्थित है (या मैं इसका समर्थन करने के लिए तैयार हूं, ज्यादातर मैं ऐसा नहीं हूं)
  5. यह किफायती है
  6. मुझे यहां ढूंढा जा सकता है।

"- बी। स्ट्रॉस्ट्रुप, द सी ++ प्रोग्रामिंग लैंग्वेज 2 एड। (1991) पृष्ठ 383।


1

पुस्तकालयों का उपयोग करने के लिए और अपने स्वयं के दिनचर्या को रोल करने के लिए कई अच्छे कारण दिए गए हैं।

आप कभी-कभी किसी विशिष्ट एप्लिकेशन के लिए संगणना को गति दे सकते हैं क्योंकि आप पहले से जानते हैं कि आपको लाइब्रेरी रुटीन कवर, या सटीकता जो रूटीन डिलीवर करते हैं, उन मूल्यों की विस्तृत श्रृंखला की आवश्यकता नहीं होगी।

बेशक, बहुत कुछ विशेष अनुप्रयोग पर निर्भर करता है और पुस्तकालय की दिनचर्या को कितनी बार कहा जाएगा। यदि आप केवल एक्स की एक छोटी श्रृंखला के लिए कुछ महत्वपूर्ण आंकड़ों की आवश्यकता है, तो आप अरबों कार्यों के लिए बार-बार पुस्तकालय की दिनचर्या क्यों कहेंगे, और कुछ सरल तकनीक आपकी आवश्यकताओं के लिए पर्याप्त होगी?


0

जोड़ने के लिए बहुत कम है, हमें कोड का पुन: उपयोग करना होगा, यह कोड स्थिरता और समाज में योगदान के बारे में है, लेकिन यह सब ऊपर है।

कोड का पुन: उपयोग नहीं करने का कारण यह है कि यदि आप प्रोग्रामर शुरू कर रहे हैं तो दूसरों के कोड को समझना मुश्किल है। यह उन्नत सी ++ के साथ विशेष रूप से कठिन है, और आप शुद्ध सी में भी कुछ चालें कर सकते हैं।

शुरुआत में बहुत बार, किसी को विधि समझ में आती है, लेकिन जैसा कि यह पुस्तकालय में लागू नहीं होता है, या बस अपने सामान्य इंटरफ़ेस, त्रुटि नियंत्रण और सम्मेलनों के साथ पुस्तकालय का उपयोग कैसे करें, बहुत बार अनुभवी प्रोग्रामर के लिए प्रलेखित किया जाता है। यह भ्रम देता है जो एक मानक विधि को लागू करने के लिए बेहतर है, जैसे कि एलयू कारक अपने आप से। इसके अलावा, नए प्रोग्रामर विभिन्न ऑपरेटिंग सिस्टम के लिए कोड परीक्षण, सत्यापन और पोर्टेबिलिटी के मूल्य को कम आंकते हैं। तो अंत में आलस्य है, खुद का कोड लिखना एक तेज और आसान समाधान के रूप में दिखता है।

वास्तविकता यह है कि हम खरोंच से खुद से प्रोग्रामिंग की तुलना में कोड का उपयोग करके और अधिक सीख सकते हैं।

आलस्य मुझे ज्यादातर समय के लिए चला जाता है, मुझे लगता है कि अधिकांश लोग भी हैं। इसी कारण से, कुछ स्क्रैच से कोड लिखते हैं और अन्य मौजूदा पुस्तकालयों का उपयोग करते हैं।


-1

लाइब्रेरी एल्गोरिदम स्वयं के कार्यान्वयन के विपरीत प्रदान करते हैं:

  • वे सामान्य और अस्थायी हैं। आप बाद में अपने खुद के कोड को बदलने की चिंता किए बिना अपने कार्यान्वयन को फिर से सुधार सकते हैं, जिसमें बहुत सारी बाधाएं हैं।
  • इनपुट डेटा के मामलों में गिरावट बनाम गिरावट है। कई कम्प्यूटेशनल ज्यामिति एल्गोरिदम, जैसे उत्तल पतवार वाले, उदाहरण के लिए तीन बिंदुओं की कॉलिनियरिटी को संभालने की आवश्यकता होती है। आप उन मामलों को अनदेखा करने में सक्षम हो सकते हैं यदि आप कभी भी अपने कोड को वितरित करने की योजना नहीं बनाते हैं और भविष्य में अक्सर अपने कोड का पुन: उपयोग नहीं करना चाहते हैं।
  • वे अपेक्षित या सबसे खराब स्थिति इनपुट कॉन्फ़िगरेशन के लिए न्यूनतम रनटाइम जटिलता प्रदान करते हैं। उच्च स्तर के एल्गोरिदम में ईंटों के निर्माण के रूप में अक्सर निचले स्तर के एल्गोरिदम होते हैं, जैसे एल्गोरिदम या विशेष डेटा प्रकार। डेटा को सॉर्ट करने के लिए क्विक सॉर्ट सबसे आम विकल्प हो सकता है, लेकिन यदि एल्गोरिथ्म के आपके कार्यान्वयन के लिए एन (लॉग (एन)) का उपयोग करना है तो आप इसका उपयोग नहीं कर सकते।
  • वे स्मृति उपयोग कुशल हैं
  • वे आगे चल रहे हैं
  • यदि समर्थित है, तो सामान्य रूप से "बग" मुक्त होने के लिए और अधिक बंद होने से, खासकर यदि आप मुख्य शाखा के साथ काम करते हैं। कुछ भी एक अच्छी तरह से वितरित पुस्तकालय से अधिक परीक्षण नहीं किया गया है। हर बग क्रैश नहीं, हर बग अनुचित परिणाम नहीं देता है। आपके एल्गोरिथ्म का कार्यान्वयन अभी भी स्वीकार्य परिणाम उत्पन्न कर सकता है, बस उतना अच्छा नहीं है जितना इसके लिए डिज़ाइन किया गया है। बग जितना कम दिखाई देता है, उतनी ही कम संभावना है कि आप एक व्यक्ति के रूप में भी इसका पता लगा सकते हैं।

अपने दम पर अच्छी तरह से समझने योग्य एल्गोरिथ्म के एक संस्करण को लागू करने के लिए एक नए क्षेत्र में प्रवेश करते समय मैं अभी भी इसे अच्छा मानता हूं। मुझे कुल मिलाकर बहुत समय लगता है। मैंने किताबें खरीदीं और पढ़ीं, नाम रखा प्रेस एट अल। मैं हमेशा उन कार्यान्वयनों से पहले और दौरान बहुत सिद्धांत पढ़ता हूं। और एक क्षेत्र की सामान्य अवधारणाओं को समझने और मेरे लिए अभ्यास में जाल का अनुभव करने के बाद, यह सभी पहलुओं में बेहतर पुस्तकालय कार्यान्वयन में कूदने का समय है। मुझे लगता है कि यदि आप अपने दम पर पुस्तकालयों के क्षेत्र में एक "हैलो वर्ल्ड" एल्गोरिथ्म लिखेंगे तो आप लाइब्रेरी के बेहतर उपयोगकर्ता बन जाएंगे।

यदि आप एक बड़ी टीम में काम करते हैं तो यह आपकी अपनी पसंद नहीं हो सकती है कि आपकी टीम एक विशिष्ट पुस्तकालय का उपयोग करती है या नहीं। कोर टीम फैसला कर सकती है। और हो सकता है कि आपके प्रोजेक्ट में लाइब्रेरी के लिए कोई व्यक्ति ज़िम्मेदार हो जो अपने समय की योजना के साथ हो। एक एल्गोरिथ्म को फिर से लिखना आप अपने समय की योजना के साथ कर सकते हैं, अन्य लोगों के निर्णय पर निर्भर नहीं हैं।

यदि आप अपने दम पर हैं और वितरित करना चाहते हैं तो एक और समस्या है। मैं और साथ ही कई अन्य स्रोत कोड को सबसे उपयोगी संसाधन मानता हूं। बहुत से सभी जानकार यहाँ सहमत हो सकते हैं। सूचना विज्ञान के बाहर एक लागू क्षेत्र में खिड़कियों पर एक पूर्वनिर्धारित छूट प्रदान करने की आवश्यकता हो सकती है। लिनक्स के तहत आप खुले स्रोत उपयोग पुस्तकालयों के मामले में अपने दम पर अपेक्षाकृत आसान चीजें सेट कर सकते हैं।

अपने आप पर एक एल्गोरिथ्म को फिर से लिखने से लिज़ेंस को स्वतंत्रता मिलती है। आपकी परियोजना उदाहरण के लिए जीएसएल के जीपीएल लिसेंस का समर्थन नहीं कर सकती है ।

लिसेंस एकमात्र बाधा हो सकती है जो रिसचर्स के दृष्टिकोण से स्वतंत्र है।


1
यह सोचना कि "अपने आप से एक एल्गोरिथ्म को लागू करना" और "सीखना [आईएनजी] लाइब्रेरी सिंटैक्स" "एक ही समय में खर्च होंगे" के लिए पहले से तैयार है। यह "स्ट्रैट" जैसे सरल कार्यों के लिए भी सही नहीं है। यह निश्चित रूप से किसी भी चीज के लिए नहीं है जो कि LAPACK में है, उदाहरण के लिए, या उच्च स्तर के पुस्तकालयों पर।
वुल्फगैंग बंगर्थ

@WolfgangBangerth प्रतिक्रिया के लिए धन्यवाद। मैंने जो लिखा है, उसे फिर से पढ़ता हूं और मैं इस संदेश को हस्तांतरित नहीं करना चाहता था कि स्वयं के कार्यान्वयन अनिवार्य हो सकते हैं। लेकिन मैंने बहुत कुछ सीखा। मेरे "दोनों को दो सप्ताह लग सकते हैं" एक अच्छा उदाहरण नहीं था। तथ्य की बात के रूप में इसने मुझे अंतिम बार "वाक्यविन्यास सीखने" में 2 सप्ताह का समय दिया जब मैंने फॉर्म को जावा को C ++ में बदल दिया और मैंने इस समय मूल C ++ सिंटैक्स भी सीखा। मैंने अपने नए पुस्तकालय के साथ पॉइंटर्स के साथ अधिक संघर्ष किया। मेरे किसी भी लागू किए गए एल्गोरिदम पर दो सप्ताह का समय कोडिंग का हो सकता है जो कि मेरा मामूली निवेश था (किताबें पढ़ने से पहले बहुत अधिक समय लगता है)।
Jan Hackenberg

निवेश खुद एक छोटे एल्गोरिथ्म लिखने में नहीं है। यह तेज़ है, और वास्तव में कभी-कभी किसी अन्य पुस्तकालय को सीखने में भी समय लग सकता है। चीजों को डिबग करने और कोने के सभी मामलों को सही तरीके से प्राप्त करने के लिए अविश्वसनीय रूप से बहुत समय खर्च होता है। यदि आप एक अच्छी तरह से विकसित पुस्तकालय का उपयोग करते हैं, तो आप जानते हैं कि यदि मैट्रिक्स-वेक्टर उत्पाद वर्ग मैट्रिसेस के लिए काम करता है, तो यह आयताकार मैट्रीस के लिए भी काम करेगा। अपने स्वयं के सॉफ़्टवेयर के लिए, आप इसे लागू और डिबग कर सकते हैं, भले ही आपको लगे कि आप फ़ंक्शन के साथ किए गए थे। आप कई बार एक ही फ़ंक्शन पर वापस आएंगे। यही समय खर्च होता है।
वोल्फगैंग बंगर्थ

@WolfgangBangerth मैं आपके सभी तर्क से सहमत हूं। मेरा एकमात्र बिंदु यह है कि आप बहुत अधिक सिद्धांत सीखते हैं जब आपको उन कॉर्नर मामलों को स्वयं संभालने की आवश्यकता होती है। मेरे जवाब का मेरा पहला संस्करण वास्तव में लग रहा था जैसे कि इससे कोई फर्क नहीं पड़ता। मैं भयानक थका हुआ था। मैं सुधारित उत्तर में लिखता हूँ कि पुस्तकालयों के स्थायित्व लाभों के बारे में बहुत कुछ। मेरे लिए यह समय व्यतीत करने और अर्जित ज्ञान के बीच का व्यापार है।
Jan Hackenberg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.