कार्यात्मक प्रोग्रामिंग अभी तक क्यों नहीं ली गई है?


197

मैंने घोषणात्मक / कार्यात्मक प्रोग्रामिंग (भाषाओं) के बारे में कुछ ग्रंथों को पढ़ा है, हास्केल के साथ-साथ खुद को लिखने की कोशिश की। मैंने जो देखा है, उससे कार्यात्मक प्रोग्रामिंग को शास्त्रीय अनिवार्यता शैली में कई फायदे हैं:

  • स्टेटलेस कार्यक्रम; कोई दुष्प्रभाव नहीं
  • संगामिति; बढ़ती मल्टी-कोर प्रौद्योगिकी के साथ बहुत अच्छा खेलता है
  • कार्यक्रम आमतौर पर छोटे होते हैं और कुछ मामलों में पढ़ना आसान होता है
  • उत्पादकता बढ़ती है (उदाहरण: एर्लांग)

  • इम्पीरियल प्रोग्रामिंग एक बहुत पुराना प्रतिमान है (जहाँ तक मुझे पता है) और संभवतः 21 वीं सदी के लिए उपयुक्त नहीं है

कंपनियां कार्यात्मक भाषाओं में लिखे गए या प्रोग्राम का उपयोग क्यों कर रही हैं?

क्यों, जब कार्यात्मक प्रोग्रामिंग के फायदे देखते हैं, तो क्या हम अभी भी अनिवार्य प्रोग्रामिंग भाषाओं का उपयोग कर रहे हैं?

शायद यह 1990 में इसके लिए बहुत जल्दी था, लेकिन आज?


1
नोट: इस सवाल पर मेटा में कम से कम दो बार चर्चा की गई है, और आम सहमति यह है कि इसे रखा जाना चाहिए, यद्यपि उपरोक्त "ऐतिहासिक महत्व" लॉक के माध्यम से संग्रहीत किया गया है। मैं किसी को भी यह देखने के लिए प्रोत्साहित करता हूं कि इसे देखने के बजाय इसे रोकने के लिए अनलॉक करने के लिए और इस सवाल के बारे में एक और थकाऊ चर्चा में भाग लेने के लिए धन्यवाद न दें, जवाब का आनंद लें जैसे वे हैं, और उनके व्यवसाय के बारे में जाना।
शोग

जवाबों:


530

क्योंकि वे सभी फायदे नुकसान भी हैं।

स्टेटलेस कार्यक्रम; कोई दुष्प्रभाव नहीं

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

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

संगामिति; बढ़ती मल्टी-कोर प्रौद्योगिकी के साथ बहुत अच्छा खेलता है

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

कार्यक्रम आमतौर पर छोटे होते हैं और कुछ मामलों में पढ़ना आसान होता है

उन मामलों को छोड़कर, जहां वे पढ़ने में अधिक लंबे और कठिन हैं। एक कार्यात्मक शैली में लिखे गए कार्यक्रमों को पढ़ना सीखना एक कठिन कौशल है; लोगों को कार्यक्रमों की कल्पना करने में बहुत बेहतर लगता है, एक कदम की तरह, एक नुस्खा की तरह की जाने वाली गणनाओं की एक श्रृंखला के रूप में पालन किया जाना चाहिए।

उत्पादकता बढ़ती है (उदाहरण: एर्लांग)

कार्यात्मक शैली में प्रोग्राम करने का तरीका जानने वाले प्रोग्रामर को काम पर रखने के बड़े पैमाने पर खर्च को सही ठहराने के लिए उत्पादकता को बहुत अधिक बढ़ाना पड़ता है।

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

इम्पीरियल प्रोग्रामिंग एक बहुत पुराना प्रतिमान है (जहाँ तक मुझे पता है) और संभवतः 21 वीं शताब्दी के लिए उपयुक्त नहीं है

फंक्शनल प्रोग्रामिंग बहुत पुरानी है। मैं यह नहीं देखता कि अवधारणा की उम्र कैसे प्रासंगिक है।

मुझे गलत मत समझो मुझे कार्यात्मक प्रोग्रामिंग पसंद है, मैं इस टीम में शामिल हो गया क्योंकि मैं कार्यात्मक प्रोग्रामिंग से अवधारणाओं को C # में लाने में मदद करना चाहता था, और मुझे लगता है कि अपरिवर्तनीय शैली में प्रोग्रामिंग भविष्य का तरीका है। लेकिन एक कार्यात्मक शैली में प्रोग्रामिंग के लिए भारी लागत है जिसे बस दूर नहीं किया जा सकता है। अधिक कार्यात्मक शैली की ओर बदलाव दशकों की अवधि में धीरे-धीरे और धीरे-धीरे होने जा रहा है। और यह वही होगा: एक अधिक कार्यात्मक शैली की ओर एक पारी, हास्केल की पवित्रता और सुंदरता को गले लगाने और सी ++ के परित्याग का थोक अवतार नहीं।

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


41
"जब लेखांकन में जेन स्मिथ शादी कर लेता है और अपना नाम जेन जोन्स में बदल लेता है, तो डेटाबेस जो उस व्यवसाय प्रक्रिया का समर्थन करता है जो उसके पेचेक को प्रिंट करता है, उस तरह के उत्परिवर्तन से निपटने के लिए बेहतर होगा।" एक रिकॉर्ड जेन स्मिथ का पूर्व नाम होगा, हम जेन के पूर्व नाम के सभी उदाहरणों को उसके नए नाम पर अद्यतन नहीं करते हैं;)
जूलियट

40
@ जूलियट: ज़रूर। मेरा कहना है कि यदि आपके पास एक ऐसी वस्तु है जो किसी कर्मचारी का प्रतिनिधित्व करती है, तो ऑपरेशन के बारे में सोचने से समझ में आता है कि "कर्मचारी का नाम बदलना" उस कर्मचारी का प्रतिनिधित्व करने वाली वस्तु का उत्परिवर्तन होगा जो वस्तु की पहचान को नहीं बदलता है । जब जेन स्मिथ अपना नाम बदलता है तो आप जेन जोन्स नामक एक अलग कर्मचारी नहीं बनाते हैं जो अन्यथा समान है। दो अलग-अलग नामों से दो कर्मचारी नहीं हैं। इस प्रक्रिया को एक वस्तु के उत्परिवर्तन के रूप में चित्रित करना स्वाभाविक है, न कि किसी नई वस्तु के निर्माण के रूप में।
एरिक लिपपर्ट

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

29
+1 यह जवाब पढ़ने के लिए ताजी हवा की एक ऐसी सांस थी। अपनी स्थिति में किसी से इस तरह के व्यावहारिकता (कार्यात्मक प्रोग्रामिंग के लिए एक अंतर्निहित जुनून के साथ) को सुनने के लिए शानदार।
5

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

38

प्रोग्रामिंग के मास्टरमाइंड: प्रमुख प्रोग्रामिंग भाषाओं के रचनाकारों के साथ बातचीत

[हास्केल]

आपको क्यों लगता है कि कोई भी कार्यात्मक प्रोग्रामिंग भाषा मुख्यधारा में नहीं आई है?

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

बहुत से लोगों को पता नहीं है कि तकनीकी नवाचार कैसे होता है, और उम्मीद करते हैं कि बेहतर तकनीक केवल अपने आप में ( "बेहतर मूसट्रैप" प्रभाव) से सभी पर हावी हो जाएगी , लेकिन दुनिया का ऐसा नहीं है।


36
हास्केल: 20 वर्षों के बाद, एक रातोंरात सफलता!
जूलियट

लिंक का पालन करें और ग्रैडी बूच के बजाय मनोरंजक डिस्क के लिए समीक्षा पढ़ें। कोई विचार नहीं है कि बूच कौन है, लेकिन इसने मुझे वैसे भी योग्य बना दिया।
सायनाफॉव्हेकप्लेनेट

4
ग्रैमी बूच ज़िम्मेदार है और जैकबॉन और रूंबॉ के साथ मिलकर यूएमएल के घृणा के लिए जिम्मेदार है।
बस मेरा सही समय

27

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

मुझे लगता है कि आप सही कह रहे हैं कि मल्टी-कोर के कारण कंसिस्टेंसी की वृद्धि प्रतिशत (विकास परियोजनाओं के वैश्विक सेट) के कारण बढ़ जाएगी जब कार्यात्मक प्रोग्रामिंग को अन्य शैलियों पर चुना जाता है।

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


यह बहुत ही व्यावहारिक और खुशी से व्यावहारिक है। निश्चित रूप से सबसे अच्छा जवाब मैंने इस सवाल को अपने सभी रूपों में देखा है।
बेन्सन

हो सकता है कि एक ऐसी भाषा जिसके लिए दोनों प्रथम श्रेणी के नागरिक हैं, लोकप्रिय हो जाएंगे।
केविन कोस्टलन

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

26

कार्यात्मक प्रोग्रामिंग के फायदे के बावजूद, अनिवार्य और वस्तु उन्मुख प्रोग्रामिंग कभी भी पूरी तरह से दूर नहीं जाएंगे।

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

अंततः, एक उपयोगी कार्यक्रम में हमेशा दुष्प्रभाव होंगे (जैसे उपभोग के लिए उपयोगकर्ता को वास्तविक आउटपुट प्रदान करना), इसलिए कार्यात्मक भाषाओं के शुद्धतम को अभी भी समय-समय पर अनिवार्य दुनिया में कदम रखने की आवश्यकता होगी।

वर्तमान अत्याधुनिक कला यह है कि कार्यात्मक भाषाओं (जैसे कि C #) कार्यात्मक दुनिया (जैसे लैंबडा स्टेटमेंट्स) से सुविधाएँ उधार लेती हैं और इसके विपरीत।


3
OOP अनिवार्य प्रोग्रामिंग के सबसेट के कुछ प्रकार नहीं है?
pankrax

9
OOP एक सुपरसेट है। OOP को C ++ की तरह C के पास होना अनिवार्य है
रॉबर्ट हार्वे

10
मुझे नहीं लगता कि OOP अनिवार्य रूप से अनिवार्य प्रोग्रामिंग पर निर्भर है। क्लोजर या सीएलओएस देखें - दोनों कार्यात्मक हैं, फिर भी ऑब्जेक्ट-ओरिएंटेड हैं।
गाबे

9
OO भाषाओं का होना लाजिमी है, लेकिन होना जरूरी नहीं है। OCaml एक दृढ़ता से (हालांकि विशुद्ध रूप से नहीं) कार्यात्मक भाषा है जिसका पूरा raison d'etre OO है।
चक

7
मुझे नहीं मिल रहा है क्यों OOP अनिवार्य प्रोग्रामिंग का एक सुपरसेट है। सभी अनिवार्य कोड OOP नहीं है, और सभी कार्यात्मक कोड गैर-OOP नहीं है। मैं बल्कि यह कहूंगा कि OOP अनिवार्य प्रोग्रामिंग और कार्यात्मक प्रोग्रामिंग है, जैसे वायुगतिकीय पंख कारों, या विमानों, या रॉकेट, या शीतलन प्रशंसकों, या पवन चक्कियों, या ... की परिकल्पना करने के लिए हैं, यानी अवधारणाएँ संबंधित हैं, लेकिन कसकर युग्मित नहीं हैं। 1-से -1 कनेक्शन।
सेबेस्टियन मच

21

है ना?

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

कार्यात्मक एक ही तरीका है। हास्केल एक महान कार्यात्मक भाषा थी। लेकिन हमने आज से 20 साल पहले सी-जैसे सिंटैक्स का उपयोग करके मुख्यधारा के प्रोग्रामर का अधिक द्रव्यमान प्राप्त किया है। तो यह सी। की तरह लग रहा है: किसी भी LINQ अभिव्यक्ति को देखो और मुझे बताओ कि यह कार्यात्मक नहीं है।


2
दिलचस्प बात है, लेकिन मुख्यधारा की भाषाएं स्मॉलटाक जैसी कैसे हो रही हैं? उदाहरण के लिए C ++, Java और C #, संदेश भेजने पर आधारित नहीं हैं, जो (मेरा मानना ​​है) स्मालटाक प्रतिमान का सबसे महत्वपूर्ण हिस्सा है।
जोनाथन स्टर्लिंग

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

जावास्क्रिप्ट, अजगर, और माणिक इस बात का अच्छा चित्रण है कि यह वास्तव में
कैसा

15

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

एक पोस्टर में कहा गया है कि कार्यात्मक प्रोग्रामिंग कोड की तुलना में अनिवार्य कोड समझना आसान है। यह केवल सच है अगर पाठक पहले से ही अनिवार्य कोड देख चुका है, खासकर यदि पूर्व उदाहरण उसी "परिवार" (उदाहरण के लिए, C / C ++, पर्ल, PHP और जावा) का हिस्सा हैं। मैं यह दावा नहीं करूंगा कि यह किसी भी अनिवार्य भाषा के लिए सही है ; एक चरम उदाहरण बनाने के लिए जावा और फोर्थ की तुलना करें।

एक लेपर्सन के लिए, सभी प्रोग्रामिंग लैंग्वेज अशोभनीय हैं, सिवाय इसके कि हाइपरटेल और एसक्यूएल जैसी वर्बोज भाषाएं। (ध्यान दें, एसक्यूएल एक घोषणात्मक और / या कार्यात्मक भाषा है और भारी लोकप्रियता प्राप्त करता है।)

यदि हमें शुरू से एक लिस्प-वाई या हास्केल-वाई भाषा पर प्रशिक्षित किया गया था, तो हम सभी को लगता है कि कार्यात्मक प्रोग्रामिंग भाषा पूरी तरह से सामान्य हैं।


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

2
एकमात्र कारण है कि मैं अभी भी कभी-कभी उत्परिवर्ती राज्य को उपयोगी मानता हूं, यह है कि यह तेज़ कोड लिखने का एक आसान तरीका प्रदान करता है (कोई प्रतिलिपि नहीं); लेकिन इसका कारण यह हो सकता है कि मैं पर्याप्त कार्यात्मक प्रोग्रामिंग नहीं जानता हूं और 90% स्थितियों के लिए, आप उत्परिवर्ती राज्य का उपयोग किए बिना तेजी से कार्यात्मक कोड लिख सकते हैं।
जियोर्जियो

3
सबसे व्यापक रूप से उपयोग किया जाने वाला और लंबे समय तक रहने वाला, संगणना के आयोजन के लिए वातावरण स्प्रेडशीट है; मूल रूप से नामित चर के बजाय कोशिकाओं के साथ एक कार्यात्मक प्रोग्रामिंग वातावरण। मुझे विश्वास नहीं है कि लोग, सामान्य रूप से, चरणों की एक श्रृंखला के रूप में स्वाभाविक रूप से कार्यक्रमों की कल्पना करते हैं। प्रोग्रामर व्यापक अनिवार्य भाषाओं में फंस गए, हो सकता है।
jpnp

14

आपने पहले से ही पर्याप्त जवाब पा लिया है कि मैं केवल कुछ चीजों का उल्लेख करूँगा जिन्हें मैंने अभी तक नहीं देखा है।

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

कार्यात्मक पक्ष पर, यह बहुत कम सच है। उदाहरण के लिए, मैं योजना को यथोचित रूप से लिख सकता हूं, लेकिन Ocaml या हास्केल (केवल कुछ उदाहरणों के लिए) को पढ़ने में इसका उपयोग बहुत कम है। यहां तक ​​कि एक परिवार के भीतर (जैसे, स्कीम बनाम, कॉमन लिस्प) एक के साथ परिचित दूसरे को भी लगभग अनुवाद नहीं करता है।

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

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

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


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

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

11

कोई परसेस्ड नीड

मुझे अपने पुराने बॉस रिक क्लाइन की प्रतिक्रिया याद है जब मैंने उसे जॉन बैकस के ट्यूरिंग अवार्ड व्याख्यान की एक प्रति दिखाई थी, जिसका शीर्षक कैन प्रोग्रामिंग फ्रॉम द वॉन न्यूमैन स्टाइल था?

उनकी प्रतिक्रिया: "शायद हममें से कुछ लोग वॉन न्यूमैन शैली से मुक्त नहीं होना चाहते हैं!"


10

कार्यात्मक प्रोग्रामिंग अभी तक क्यों नहीं ली गई है?

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

स्टेटलेस कार्यक्रम; कोई दुष्प्रभाव नहीं

स्टेटलेस कार्यक्रमों को परखना आसान है। यह अब व्यापक रूप से सराहना की जाती है और उद्योग में अक्सर शोषित होती है।

संगामिति; बढ़ते मल्टी-कोर प्रौद्योगिकी के साथ बहुत अच्छा खेलता है कार्यक्रम आमतौर पर कम होते हैं और कुछ मामलों में पढ़ना आसान होता है उत्पादकता बढ़ जाती है (उदाहरण: क्लैंग)

आप समवर्ती और समानांतरवाद का सामना कर रहे हैं।

अनुक्रमिक प्रक्रियाओं (सीएसपी) को संप्रेषित करके कॉनएरेबिलिटी को प्रभावी ढंग से किया जा सकता है। एक सीएसपी के अंदर कोड अपने स्थानीय राज्य को बदल सकता है लेकिन उनके बीच भेजे गए संदेश हमेशा अपरिवर्तनीय होने चाहिए।

विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग मल्टीकोर के साथ बहुत बुरी तरह से खेलती है क्योंकि यह इतना कैश है। साझा मेमोरी और समानांतर कार्यक्रमों के लिए कॉर्स एंड कॉन्टेंट स्केल नहीं हैं।

कंपनियां कार्यात्मक भाषाओं में लिखे गए या प्रोग्राम का उपयोग क्यों कर रही हैं?

स्काला को अक्सर एक कार्यात्मक भाषा के रूप में माना जाता है, लेकिन यह C # से अधिक कार्यात्मक नहीं है जो आज दुनिया की सबसे लोकप्रिय भाषाओं में से एक है।

क्यों, जब कार्यात्मक प्रोग्रामिंग के फायदे देखते हैं, तो क्या हम अभी भी अनिवार्य प्रोग्रामिंग भाषाओं का उपयोग कर रहे हैं?

विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग में बहुत सारे गंभीर नुकसान हैं, इसलिए हम अशुद्ध कार्यात्मक भाषाओं जैसे लिस्प, स्कीम, एसएमएल, ओकेएमएल, स्काला और सी # का उपयोग करते हैं।


7

जब मैं सोचता हूं कि मेरे काम में कौन-सी कार्यात्मक प्रोग्रामिंग आ सकती है, तो मैं हमेशा विचार के एक ही मार्ग का नेतृत्व करता हूं:

  1. कार्यात्मक प्रोग्रामिंग का पूरा लाभ पाने के लिए आपको आलस्य की आवश्यकता होती है। हां, सख्त कार्यात्मक भाषाएं हैं, लेकिन कार्यात्मक प्रोग्रामिंग के वास्तविक लाभ सख्त कोड में चमकते नहीं हैं। उदाहरण के लिए, हास्केल में किसी सूची पर आलसी संचालन का क्रम बनाना और उन्हें संक्षिप्त करना और उन्हें सूची में लागू करना आसान है। उदाहरण के लिए। op1 $ op2 $ op3 $ op4 $ someList। मुझे पता है कि यह पूरी सूची का निर्माण नहीं करने जा रहा है और आंतरिक रूप से मैं सिर्फ एक अच्छा लूप प्राप्त करने जा रहा हूं जो एक समय में तत्वों के माध्यम से चलता है। यह आपको वास्तव में मॉड्यूलर कोड लिखने की अनुमति देता है। दो मॉड्यूल के बीच के इंटरफेस में संभावित विशाल डेटा संरचनाओं को सौंपना शामिल हो सकता है, और फिर भी आपको संरचना का निवासी होना आवश्यक नहीं है।

  2. लेकिन जब आपके पास आलस्य होता है, तो स्मृति उपयोग के बारे में तर्क करना कठिन हो जाता है। हास्केल संकलक झंडे को बदलने से अक्सर ओ (एन) से ओ (1) तक एक एल्गोरिथ्म द्वारा उपयोग की जाने वाली स्मृति की मात्रा में परिवर्तन होता है, कभी-कभी ऐसा नहीं होता है। यह वास्तव में स्वीकार्य नहीं है जब आपके पास ऐसे एप्लिकेशन हों जो सभी उपलब्ध मेमोरी का अधिकतम उपयोग करने की आवश्यकता हो, और यह उन अनुप्रयोगों के लिए भी महान नहीं है, जिन्हें सभी मेमोरी की आवश्यकता नहीं है।


आलस्य के साथ-साथ आलस्य कम-आदर्श रूप से बातचीत करता है।
ब्रायन

3
जैसा कि मुझे पता है कि अन्य भाषाओं में मैं जिन कई बगों का पीछा करता हूं, वे संबंधित पारदर्शिता की कमी से संबंधित हैं, मैं डिबगिंग के मुद्दों के बारे में कम चिंतित हूं, भले ही वे कभी-कभी एक दर्द हो सकते हैं।
सिगफेप

6

दो चीज़ें:

  1. बस समय लगता है चाहे कितनी भी अच्छी तकनीक क्यों न हो। एफपी के पीछे के विचार लगभग 70 साल पुराने हैं। लेकिन सॉफ्टवेयर इंजीनियरिंग (उद्योग में, खाइयों में) का मुख्यधारा का उपयोग संभवतः 10 साल से कम है। डेवलपर्स को नस्लीय रूप से नए मानसिकता अपनाने के लिए कहना संभव है लेकिन बस समय लगता है (कई, कई साल)। उदाहरण के लिए, OOP को वास्तव में 1980 के दशक की शुरुआत में मुख्यधारा का उपयोग मिला। हालाँकि, यह 1990 के उत्तरार्ध तक सुप्त नहीं हुआ।
  2. इससे पहले कि यह बड़ा हो, आपको लोगों को एक प्रौद्योगिकी की ताकत का सामना करने के लिए मजबूर होना चाहिए । वर्तमान में, लोग ऐसे उपकरणों का उपयोग कर रहे हैं जो समानता का उपयोग नहीं करते हैं और चीजें ठीक काम करती हैं। जब समानता का उपयोग नहीं करने वाले ऐप असहनीय रूप से धीमे हो जाते हैं; तब कई लोगों को समानतावाद-साधनों का उपयोग करने के लिए मजबूर किया जाएगा और एफपी लोकप्रियता में गोली मार सकता है। यह एफपी की अन्य शक्तियों पर भी लागू हो सकता है।

3
कोड के पुन: उपयोग में FP बहुत अच्छा है। शायद बेहतर तो ओ.ओ. मुझे इसके साथ कई बार काम करना पड़ा, विभिन्न प्रकारों की ओर पलायन हुआ, और एक नई प्रणाली और यह दर्द रहित थी।
मुलुकरोनी

@Freddy Rios और @nlucaroni मैंने गलत व्याख्या को स्पष्ट करने के लिए टिप्पणी को पुनः प्रकाशित किया।
फिल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.