कार्यात्मक प्रोग्रामिंग और वैज्ञानिक कम्प्यूटिंग


42

मैं माफी माँगता हूँ अगर यह एक अस्पष्ट सवाल है, लेकिन यहाँ जाता है:

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

कार्य के SciComp डोमेन में कार्यात्मक प्रोग्रामिंग के पेशेवरों और विपक्ष क्या हैं?


2
क्यों जानबूझकर खुद को एक सीधी जैकेट में रखा? साइड इफेक्ट एक उपकरण है; यह वास्तविक दुनिया अनुप्रयोगों के लिए आवश्यक है। यदि आप सीपीयू और मेमोरी दक्षता चाहते हैं, तो कार्यात्मक प्रोग्रामिंग भाषाएं मेरे रडार पर नहीं होंगी। ऐसे प्रोग्राम जिन्हें स्वचालित सत्यापन / शुद्धता की जाँच की आवश्यकता होती है (जैसे, nuke सुविधा में उपयोग के लिए?), फिर ठीक है कोई मामला हो सकता है।
अपरेंटिस कतार

जवाबों:


34

मैंने केवल थोड़ा सा कार्यात्मक प्रोग्रामिंग किया है, इसलिए नमक के दाने के साथ यह उत्तर लें।

पेशेवरों:

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

विपक्ष:

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

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

क्या आपको कार्यात्मक प्रोग्रामिंग में रुचि होनी चाहिए?

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

सिमुलेशन-गहन कार्य के लिए कार्यात्मक प्रोग्रामिंग भाषाओं का कुछ उपयोग किया गया है। क्वांटिटेटिव ट्रेडिंग फर्म जेन स्ट्रीट फाइनेंशियल मॉडलिंग और अपनी ट्रेडिंग रणनीतियों के निष्पादन के लिए OCaml का उपयोग करती है। लाइब्रेरी में इस्तेमाल होने वाले कुछ C कोड को जेनरेट करने के लिए FCamW में OCaml का भी इस्तेमाल किया गया था। लिसस्टेन एक डोमेन-विशिष्ट भाषा है जिसे स्टैनफोर्ड में विकसित किया गया है और स्कैला में लागू किया गया है जो पीडीई को हल करने के लिए उपयोग किया जाता है। कार्यात्मक प्रोग्रामिंग निश्चित रूप से उद्योग में उपयोग की जाती है (कम्प्यूटेशनल विज्ञान में जरूरी नहीं); यह देखा जाना चाहिए कि क्या यह कम्प्यूटेशनल विज्ञान में बंद हो जाएगा।


4
मैं एक प्रो और एक कॉन जोड़ने में योगदान करना चाहूंगा। प्रो :: कोड लचीलापन: चूंकि सब कुछ एक फ़ंक्शन है, आप हमेशा उस फ़ंक्शन को किसी अन्य फ़ंक्शन द्वारा कॉल कर सकते हैं; यह बेहद शक्तिशाली है। Con :: कोड पठनीयता: कार्यात्मक प्रोग्रामिंग कोड वास्तव में पढ़ने के लिए कठिन हैं; यहां तक ​​कि (अधिकांश) जिन लोगों ने उन्हें लिखा है। अब मुझे कुछ पुराने कोड को समझने में भी थोड़ा समय लग गया है, जो मैंने 6 महीने पहले Mathematica में B-splines के साथ कुछ सामान्य PDE समस्याओं को हल करने के लिए लिखा है; जब मैं कुछ सहयोगियों को डराना चाहता हूं, तो मैं हमेशा उस कोड को बाहर खींचता हूं ;-)।
seb

4
केवल इसके अतिरिक्त जो मैं जोड़ूंगा वह है: कॉन :: मेमोरी की खपत । साइड इफेक्ट को खत्म करने के लिए बहुत सारी नकल करनी पड़ती है।
मैथ्यू एम्मेट

1
@StefanSmith: (i) मुझे पता है कि यह कभी-कभी अनुसंधान में उपयोग किया जाता है (उदाहरण के लिए, मैक्सिमा एक लिस्प-आधारित कैस है); इससे आगे, मुझे अपने सिर के ऊपर से पता नहीं है। (ii) कोई विचार नहीं। मेरा अधिकांश उत्तर पिछले कुछ वर्षों में मेरे द्वारा की गई वार्तालापों से चमके हुए साक्ष्यों पर आधारित था।
ज्योफ ऑक्सबेरी

@seb, ऐसा लगता है कि आप लिस्प जैसी कार्यात्मक भाषाओं के गुणों का वर्णन कर रहे हैं जो लगभग हास्केल जैसी कार्यात्मक भाषाओं पर लागू नहीं होती हैं।
मार्क एस।

1
@MatthewEmmett द्वारा टिप्पणी के लिए बड़ा वोट। उच्च प्रदर्शन संगणना के लिए नकल करना बहुत महंगा हो सकता है।
चार्ल्स

10

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

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

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


8

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

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

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

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

ध्यान दें कि मैं अन्य उत्तरों में उल्लिखित विपक्ष से पूरी तरह सहमत हूं, लेकिन मुझे लगा कि समानांतर निष्पादन की सुविधा इतनी शक्तिशाली है कि यह बिना पढ़े नहीं रह सकता।


8

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

मुझे लगता है कि अधिकांश कम्प्यूटेशनल लोग इस बात से सहमत होंगे कि नई प्रोग्रामिंग भाषाओं की कोशिश करने और इस समस्या के लिए उनकी उपयुक्तता का मूल्यांकन करने में बहुत अधिक मूल्य है। लेकिन यह एक मुश्किल और अकेला समय होने वाला है क्योंकि आप उन परिणामों का उत्पादन करने में सक्षम नहीं होंगे जो हर किसी के साथ प्रतिस्पर्धी हैं। यह आपको एक प्रतिष्ठा के रूप में भी पेश कर सकता है, जिसने एक अलग प्रोग्रामिंग प्रतिमान के लिए अगले कदम की शुरुआत की। हे, फोरट्रान को बदलने में केवल C ++ को लगभग 15 साल लग गए!


6
और सी ++, सबसे अच्छे रूप में, वास्तव में फोरट्रान को इस स्थान पर प्रतिस्थापित करने का केवल आधा तरीका है। हम हर समय फोरट्रान में नए कोड देखते हैं, और बूट करने के लिए बहुत सारी विरासत!
बिल बर्थ

2
C ++ (फोरट्रान के विपरीत) सीखना और उपयोग दोनों के लिए बहुत जटिल है। नए खुले स्रोत वैज्ञानिक कोड अभी भी फोरट्रान में लिखे जा रहे हैं। मेरे क्षेत्र (पृथ्वी विज्ञान) में उल्लेखनीय हैं PFlotran, SpecFEM3D, GeoFEM आदि एटमोस्फेरिक विज्ञान में लगभग सभी नए कोड के लिए Ditto। IMHO C ++ ने वह स्थान नहीं लिया है जो इसे प्रतिस्थापित करना चाहिए था (C)।
स्टली

1
आपको फोरट्रान को वुल्फगैंग की कोशिश करनी चाहिए, यह एक महान भाषा है, जो सीखने / लिखने में आसान है और गति आपको निराश नहीं करेगी।
ओडिन्ज íertík

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

4
@StefanSmith: हाँ। यह वैज्ञानिक कंप्यूटिंग में एक दोषपूर्ण विचार हो सकता है (जहां मैं अभी भी तर्क दूंगा कि यह पुराना और अनुत्पादक है)। यह निश्चित रूप से रक्षात्मक नहीं है जहां तक ​​छात्रों की शिक्षा का संबंध है - क्योंकि हमारे अधिकांश छात्र अकादमिया छोड़ देते हैं और उद्योग में व्यावहारिक रूप से कोई भी फोरट्रान का उपयोग नहीं करता है।
वोल्फगैंग बैंगर्थ

7

त्वरित सारांश यह है कि

  1. न्यूमेरिकल कंप्यूटिंग अपने अधिकांश स्पीडअप को प्राप्त करने और आवंटन को कम करने के लिए उत्परिवर्तन / दुष्प्रभाव का उपयोग करता है (कई कार्यात्मक प्रोग्रामिंग संरचनाएं अपरिवर्तनीय हैं)
  2. आलसी मूल्यांकन संख्यात्मक अंकों के साथ उपयोग करने के लिए मोटा हो सकता है।
  3. या तो आप एक ऐसा पैकेज विकसित कर रहे हैं, जहाँ प्रदर्शन के लिए निम्नतम स्तर पर गिरना वास्तव में मायने रखता है (सी / फोरट्रान या अब जूलिया) (इनमें आप आवश्यक रूप से कोडांतरक कोड को भी संपादित कर सकते हैं), या आप एक स्क्रिप्ट लिख रहे हैं जो इन तेज़ पुस्तकालयों का उपयोग करता है इसलिए आप ज्यादातर विकास के समय की देखभाल करते हैं (और इसलिए आप जूलिया / MATLAB / पायथन / आर) का चयन करते हैं। कार्यात्मक भाषाएं एक अजीब मध्य मैदान में बैठती हैं जो अन्य विषयों में सहायक है, लेकिन यहां उतना उपयोगी नहीं है।
  4. xnxn+1

ये तथ्य एक साथ कार्यात्मक प्रोग्रामिंग करते हैं जो अधिकांश उपयोगकर्ताओं के लिए आवश्यक नहीं हैं।


+1, लेकिन 3 बिंदु के अलावा एक: मुझे लगता है कि उच्च स्तरीय भाषाओं में कार्यात्मक विशेषताएं काफी उपयोगी हैं, और अन्य उत्तर (उदाहरण के लिए आसान समानांतरकरण) में उल्लिखित कार्यात्मक भाषाओं के कई फायदे इस परिदृश्य पर लागू होते हैं।
स्ज़बोल्क्स

3

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


1

R एक कार्यात्मक भाषा है और एक आँकड़े (और अब मशीन लर्निंग) भाषा और वास्तव में आँकड़ों के लिए नंबर 1 भाषा है। हालांकि यह एचपीसी भाषा नहीं है: इसका उपयोग पारंपरिक "संख्या क्रंचिंग" जैसे भौतिकी सिमुलेशन आदि के लिए नहीं किया जाता है, लेकिन इसे मशीन सीखने के बड़े पैमाने पर सांख्यिकी सिमुलेशन (एमसीएमसी) के लिए बड़े पैमाने पर क्लस्टर (जैसे एमपीआई के माध्यम से) बनाया जा सकता है।

गणितज्ञ भी एक कार्यात्मक भाषा है, लेकिन यह कोर डोमेन संख्यात्मक कंप्यूटिंग के बजाय प्रतीकात्मक कंप्यूटिंग है।

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

मैं स्काला को एक कार्यात्मक भाषा नहीं कहूंगा, बल्कि एक वस्तु-कार्यात्मक संकर कहूंगा। आप स्काला में कई कार्यात्मक अवधारणाओं का उपयोग कर सकते हैं। स्पार्क ( https://spark.apache.org/ ) के कारण क्लाउड कंप्यूटिंग के लिए स्काला महत्वपूर्ण है ।

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


1

प्रत्येक कार्यात्मक भाषा में निर्मित "टूल" हैं: डेटा को फ़िल्टर करना इतना आसान है, डेटा पर पुनरावृति करना इतना आसान है और आपकी समस्याओं का स्पष्ट और संक्षिप्त समाधान के साथ आना इतना आसान है।

एकमात्र कॉन यह है, कि आपको इस नई तरह की सोच के इर्द-गिर्द अपना सिर जमा लेना है: यह जानने में कुछ समय लग सकता है कि आपको क्या जानना है। SciComp डोमेन के अन्य लोग वास्तव में उन भाषाओं का उपयोग नहीं करते हैं, जिसका अर्थ है कि आपको इतना समर्थन नहीं मिल सकता है :(

यदि आप कार्यात्मक-वैज्ञानिक-भाषाओं में रुचि रखते हैं, तो मैंने एक https://ac1235.github.io विकसित किया है


1

कार्यात्मक प्रोग्रामिंग क्यों कर सकते हैं , और कम्प्यूटेशनल विज्ञान के लिए उपयोग किया जाना चाहिए , इसके लिए मेरे तर्क यहां दिए गए हैं । लाभ विशाल हैं, और विपक्ष जल्दी से दूर जा रहे हैं। मेरे दिमाग में केवल एक चोर है:

Con : C / C ++ / फोरट्रान में भाषा समर्थन की कमी

कम से कम C ++ में, यह con को गायब कर रहा है - C ++ 14/17 के रूप में कार्यात्मक प्रोग्रामिंग का समर्थन करने के लिए शक्तिशाली सुविधाएं जोड़ी गई हैं। आपको स्वयं कुछ पुस्तकालय / सहायता कोड लिखने की आवश्यकता हो सकती है, लेकिन भाषा आपकी मित्र होगी। एक उदाहरण के रूप में, यहां C ++: https://github.com/jzrake/ndarray-v2 में बहु-आयामी सरणियों को करने वाली एक (चेतावनी: प्लग) लाइब्रेरी है ।

इसके अलावा, यहां C ++ में कार्यात्मक प्रोग्रामिंग पर एक अच्छी पुस्तक का लिंक है , हालांकि यह विज्ञान अनुप्रयोगों पर केंद्रित नहीं है।

यहाँ मेरा सारांश है कि मेरा मानना ​​है कि समर्थक हैं:

पेशेवरों :

  • यथार्थता
  • understandability
  • प्रदर्शन

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

int main()
{
    auto state = initial_condition();

    while (should_continue(state))
    {
        state = advance(state);
        side_effects(state);
    }
    return 0;
}

आंशिक अंतर समीकरण (या ODE) को हल करना कार्यात्मक प्रोग्रामिंग के लिए एकदम सही है; आप बस एक शुद्ध फ़ंक्शन ( advanceवर्तमान समाधान) को अगले एक को उत्पन्न करने के लिए आवेदन कर रहे हैं ।

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

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

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

नीचे एक नमूना advanceफ़ंक्शन है, जो ndarray-v2पैकेज का उपयोग करके परिमित-वॉल्यूम कोड से अनुकूलित है । to_sharedसंचालकों पर ध्यान दें - ये मूल्यांकन बिंदु हैं जिन्हें मैं पहले बता रहा था।

auto advance(const solution_state_t& state)
{
    auto dt = determine_time_step_size(state);
    auto du = state.u
    | divide(state.vertices | volume_from_vertices)
    | nd::map(recover_primitive)
    | extrapolate_boundary_on_axis(0)
    | nd::to_shared()
    | compute_intercell_flux(0)
    | nd::to_shared()
    | nd::difference_on_axis(0)
    | nd::multiply(-dt * mara::make_area(1.0));

    return solution_state_t {
        state.time + dt,
        state.iteration + 1,
        state.vertices,
        state.u + du | nd::to_shared() };
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.