C ++ में संख्यात्मक सॉफ्टवेयर लिखने में डिज़ाइन पैटर्न


13

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

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

मैं संख्यात्मक कोड को डिजाइन करने की बड़ी तस्वीर के बारे में जानकारी के लिए देख रहा हूं , न कि कुछ भी जो एल्गोरिदम और इस तरह से संबंधित है।

मुझे आशा है कि इसके लिए संसाधन हैं, और एक पुस्तकालय के बाद सिर्फ पुस्तकालय के माध्यम से जाने के लिए नहीं बचा है, खासकर क्योंकि वहां कोई मार्गदर्शक नहीं है जो चीजों को सही ढंग से डिजाइन करते हैं, इसके अलावा सी ++ में अच्छे मुहावरों और प्रथाओं के अपने ज्ञान से।

(यह भाषा विशिष्ट नहीं है, लेकिन यदि कोई भाषा विशिष्ट सामग्री है, तो मैं C ++ पसंद करूंगा।)


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

2
एक और उपयोगी संदर्भ जो लक्ष्य पर काफी नहीं है, एंथनी स्कोपजेट और कैथरीन हफ द्वारा "भौतिकी में प्रभावी संगणना" है।
ब्रायन बॉर्कर्स

@BrianBorchers Hm, ऐसा लगता है कि इसका आधा हिस्सा पायथन के परिचय में है और फिर विकास के साधनों पर केंद्रित है।
user1997744

जवाबों:


8

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

बेशक, ऐसे कई मामले हैं जो वास्तव में संख्यात्मक एल्गोरिदम के लिए विशिष्ट हैं (उदाहरण के लिए, यहां देखें ), लेकिन डिजाइन पैटर्न के "पारंपरिक" सेट को जानना वास्तव में पहले से ही एक अच्छी शुरुआत है।


मैं यह जोड़ना चाहूंगा कि नए हार्डवेयर पर संख्यात्मक गणनाओं के लिए, पॉइंटर चेज़िंग को कम करने का प्रयास करना चाहिए (जो गैंग ऑफ़ फोर पैटर्न का उपयोग करते हैं)। C ++ डिज़ाइन के लिए एक अच्छा प्रारंभिक बिंदु है github.com/isocpp/CppCoreGuidelines/blob/master/…
बिस्वजीत बनर्जी

@BiswajitBanerjee हाँ, C ++ के कोर दिशानिर्देश आधुनिक C ++ उपयोग में किसी के लिए बुनियादी ज्ञान हैं। हर्ब सटर के संपादकों में से एक है और आप हमेशा उनकी सलाह पर भरोसा कर सकते हैं।
user1997744

@ user1997744 क्या आपका मतलब बजरने से था? हर्ब सटर अपने "हमेशा ऑटो" विचार के लिए भी प्रसिद्ध है जो केवल-कोड लिखने की ओर जाता है (यह निश्चित नहीं है कि मैं उसके फैसले पर कितना भरोसा करूंगा)। इसके अलावा, C ++ कोर दिशानिर्देश बुनियादी ज्ञान से दूर हैं। आपको आश्चर्य होगा।
बिश्वजीत बनर्जी 3

@BiswajitBanerjee खैर, अगर वे नहीं हैं, तो मैं कह सकता हूं कि मैं कभी भी किसी डेवलपर को एक साक्षात्कार से आगे नहीं बढ़ने दूंगा यदि वे दिशानिर्देशों के बहुमत से परिचित नहीं थे और उनका उपयोग कर रहे थे (छोड़कर जहां विरासत कोड उस मुश्किल बना सकता है)।
user1997744

6

मैं इस मैथ्यू जी Knepley सलाह देते हैं। वैज्ञानिक कंप्यूटिंग के लिए प्रोग्रामिंग भाषाएँ। arXiv प्रीप्रिंट arXiv: 1209.1711, 2012 ( https://arxiv.org/pdf/1209.1711.pdf )

मैं अन्य कोड देखने और पढ़ने की सलाह देता हूं, उदाहरण के लिए, त्रिकोण, PETSc, MoAB, deal.II, फेनिक्स और कई अन्य। सभी समाधान आपके लिए काम नहीं करेंगे, लेकिन अंत में, दूसरों से नकल करना और सीखना (अनुभवी डेवलपर्स और सफल कोड) सबसे अच्छा सबक है कि कोड को कैसे डिज़ाइन किया जाए।

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


कुछ नया शुरू करने की मेरी दलील इससे सीखने का अनुभव है और इसे हासिल करने की समझ है :)
user1997744

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

ठीक है, एक अल्ट्रा विशिष्ट गूढ़ संगणना के लिए कोई पुस्तकालय नहीं है जो मुझे करने की आवश्यकता है, इसलिए अंत में मुझे वास्तव में अपना खुद का लिखना होगा हालांकि निश्चित रूप से सब कुछ को फिर से बनाने की कोई आवश्यकता नहीं है।
user1997744 12

एक खुला स्रोत मौजूदा परियोजना में शामिल होने के लिए महान सलाह। मुझे प्रोग्रामर्स के नेटवर्क में इस तरह से मुझसे बेहतर तरीके से खींचा गया ।
user14717
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.