मैं यहाँ कार्यात्मक भाषाओं और सामान के बारे में बहुत सारी बातें देख रहा हूँ। आप "पारंपरिक" भाषा पर एक का उपयोग क्यों करेंगे? वे बेहतर क्या करते हैं? वे किस पर बदतर हैं? आदर्श कार्यात्मक प्रोग्रामिंग एप्लिकेशन क्या है?
मैं यहाँ कार्यात्मक भाषाओं और सामान के बारे में बहुत सारी बातें देख रहा हूँ। आप "पारंपरिक" भाषा पर एक का उपयोग क्यों करेंगे? वे बेहतर क्या करते हैं? वे किस पर बदतर हैं? आदर्श कार्यात्मक प्रोग्रामिंग एप्लिकेशन क्या है?
जवाबों:
कार्यात्मक भाषाएं अनिवार्य और वस्तु-उन्मुख भाषाओं की तुलना में एक अलग प्रतिमान का उपयोग करती हैं। वे भाषा में मूल बिल्डिंग ब्लॉक के रूप में साइड-इफ़ेक्ट-फ़्री फ़ंक्शंस का उपयोग करते हैं। यह बहुत सी चीजों को सक्षम बनाता है और बहुत सी चीजों को और अधिक कठिन बना देता है (या ज्यादातर मामलों में जो लोग उपयोग किए जाते हैं उनसे अलग है)।
कार्यात्मक प्रोग्रामिंग के साथ सबसे बड़ा लाभ यह है कि साइड-इफ़ेक्ट-फ़्री फ़ंक्शंस के निष्पादन का क्रम महत्वपूर्ण नहीं है। उदाहरण के लिए, Erlang में यह बहुत पारदर्शी तरीके से संगामिति को सक्षम करने के लिए उपयोग किया जाता है। और क्योंकि कार्यात्मक भाषाओं में फ़ंक्शन गणितीय कार्यों के समान हैं, इसलिए उन लोगों को कार्यात्मक भाषाओं में अनुवाद करना आसान है। कुछ मामलों में, यह कोड को अधिक पठनीय बना सकता है।
परंपरागत रूप से, कार्यात्मक प्रोग्रामिंग का एक बड़ा नुकसान साइड इफेक्ट्स की कमी भी था। IO के बिना उपयोगी सॉफ़्टवेयर लिखना बहुत मुश्किल है, लेकिन कार्यों में दुष्प्रभावों के बिना IO को लागू करना कठिन है। इसलिए अधिकांश लोग एक इनपुट से एकल आउटपुट की गणना करने की तुलना में कार्यात्मक प्रोग्रामिंग से अधिक कभी नहीं निकले। आधुनिक मिश्रित प्रतिमान भाषाओं जैसे एफ # या स्काला में यह आसान है।
आधुनिक भाषाओं के बहुत सारे कार्यात्मक प्रोग्रामिंग भाषाओं से तत्व हैं। C # 3.0 में बहुत अधिक कार्यात्मक प्रोग्रामिंग विशेषताएं हैं और आप पायथन में भी कार्यात्मक प्रोग्रामिंग कर सकते हैं। मुझे लगता है कि कार्यात्मक प्रोग्रामिंग की लोकप्रियता के कारण ज्यादातर दो कारणों से हैं: सामान्य प्रोग्रामिंग में कॉन्जिबिलिटी एक वास्तविक समस्या है क्योंकि हम अधिक से अधिक मल्टीप्रोसेसर कंप्यूटर प्राप्त कर रहे हैं; और भाषाएँ अधिक सुलभ हो रही हैं।
मुझे नहीं लगता कि प्रोग्रामिंग पर "पकड़ने" के कार्यात्मक दृष्टिकोण के बारे में कोई सवाल है, क्योंकि यह लगभग 40 वर्षों से उपयोग (प्रोग्रामिंग की एक शैली के रूप में) है। जब भी एक OO प्रोग्रामर साफ कोड लिखता है जो अपरिवर्तनीय वस्तुओं का पक्ष लेता है, तो वह कोड कार्यात्मक अवधारणाओं को उधार ले रहा है।
हालाँकि, एक कार्यात्मक शैली को लागू करने वाली भाषाएँ इन दिनों बहुत सारी आभासी स्याही प्राप्त कर रही हैं, और क्या भविष्य में वे भाषाएँ प्रभावी होंगी या नहीं, यह एक खुला प्रश्न है। मेरा खुद का संदेह है कि हाइब्रिड, मल्टी-पैराडाइम भाषाएं जैसे स्काला या ओकेएमएल संभवतः "प्यूरिस्ट" कार्यात्मक भाषाओं पर उसी तरह हावी होंगी, जैसे कि शुद्ध ओओ भाषा (स्मॉलटाक, बीटा, आदि) ने मुख्यधारा की भाषाओं को प्रभावित किया है लेकिन समाप्त नहीं किया है। सबसे व्यापक रूप से उपयोग किए जाने वाले नोटेशन के रूप में।
अंत में, मैं यह इंगित करने का विरोध नहीं कर सकता कि आपकी टिप्पणियां फिर से एफपी टिप्पणी के समानांतर हैं जो मैंने प्रक्रियात्मक प्रोग्रामर से सुनी हैं जो एक साल पहले नहीं थे:
जिस तरह ग्राफिकल यूजर इंटरफेस और "व्यापार के एक मॉडल के रूप में कोड" अवधारणाएं थीं जो ओओ को अधिक व्यापक रूप से सराहना करने में मदद करती थीं, मेरा मानना है कि अपरिवर्तनीयता और सरल (बड़े पैमाने पर) समानता के उपयोग में वृद्धि से अधिक प्रोग्रामर को उन लाभों को देखने में मदद मिलेगी जो कार्यात्मक विकल्प प्रदान करते हैं । लेकिन जितना हमने पिछले 50 या इतने वर्षों में सीखा है कि डिजिटल कंप्यूटर प्रोग्रामिंग का पूरा इतिहास बना है, मुझे लगता है कि हमें अभी भी बहुत कुछ सीखना बाकी है। अब से बीस साल बाद, प्रोग्रामर अब हमारे द्वारा उपयोग किए जा रहे औजारों की आदिम प्रकृति पर विस्मय में वापस देखेंगे, जिसमें अब लोकप्रिय ओओ और एफपी भाषाएँ भी शामिल हैं।
मेरे लिए मुख्य प्लस इसकी अंतर्निहित समानता है, खासकर जब हम अब अधिक मेगाहर्ट्ज से दूर जा रहे हैं और अधिक से अधिक कोर की ओर बढ़ रहे हैं।
मुझे नहीं लगता कि यह अगली प्रोग्रामिंग प्रतिमान बन जाएगा और पूरी तरह से ओओ प्रकार के तरीकों को बदल देगा, लेकिन मुझे लगता है कि हम इस बिंदु पर पहुंचेंगे कि हमें अपने कोड को कार्यात्मक भाषा में लिखने की जरूरत है, या हमारी सामान्य प्रयोजन भाषाओं में से कुछ को लिखना होगा अधिक कार्यात्मक निर्माणों को शामिल करने के लिए विकसित करें।
यहां तक कि अगर आप पेशेवर भाषा में कभी भी काम नहीं करते हैं, तो कार्यात्मक प्रोग्रामिंग को समझना आपको बेहतर डेवलपर बना देगा। यह आपको सामान्य रूप से आपके कोड और प्रोग्रामिंग पर एक नया दृष्टिकोण देगा।
मैं कहता हूं कि इसे न सीखने का कोई कारण नहीं है।
मुझे लगता है कि कार्यात्मक और अनिवार्य शैली के मिश्रण का अच्छा काम करने वाली भाषाएँ सबसे दिलचस्प हैं और सफल होने की सबसे अधिक संभावना है।
मैं नेक्स्ट बिग थिंग को लेकर हमेशा संशय में रहता हूं। अगली बार बहुत बड़ी बात इतिहास की शुद्ध दुर्घटना है, सही समय पर सही जगह पर होना कोई मायने नहीं रखता है कि तकनीक अच्छी है या नहीं। उदाहरण: C ++, Tcl / Tk, Perl। सभी त्रुटिपूर्ण प्रौद्योगिकियां, सभी बेतहाशा सफल रहीं क्योंकि वे या तो दिन की समस्याओं को हल करने के लिए थीं या लगभग मानकों के अनुरूप थीं, या दोनों। कार्यात्मक प्रोग्रामिंग वास्तव में बहुत अच्छा हो सकता है, लेकिन इसका मतलब यह नहीं है कि इसे अपनाया जाएगा।
लेकिन मैं आपको बता सकता हूं कि लोग कार्यात्मक प्रोग्रामिंग के बारे में क्यों उत्साहित हैं : कई, कई प्रोग्रामर का एक प्रकार का "रूपांतरण अनुभव" होता है, जिसमें उन्हें पता चलता है कि कार्यात्मक भाषा का उपयोग उन्हें उत्पादन के दौरान दो बार उत्पादक (या शायद दस गुना उत्पादक) बनाता है। कोड जो बदलने के लिए अधिक लचीला है और इसमें कम कीड़े हैं। ये लोग एक गुप्त हथियार के रूप में कार्यात्मक प्रोग्रामिंग के बारे में सोचते हैं; इस मानसिकता का एक अच्छा उदाहरण पॉल ग्रैहम की बीटिंग द एडवर्स है । ओह, और उसका आवेदन? ई-कॉमर्स वेब ऐप।
2006 की शुरुआत से कार्यात्मक प्रोग्रामिंग और समानता के बारे में कुछ चर्चा की गई है। चूंकि साइमन पेयटन जोन्स जैसे लोग कम से कम 1984 से समानतावाद की चिंता कर रहे हैं और मैं तब तक अपनी सांस नहीं ले रहा हूं जब तक कि कार्यात्मक भाषाएं मल्टीकोर समस्या का समाधान नहीं करती हैं। लेकिन यह अभी के बारे में कुछ अतिरिक्त चर्चा की व्याख्या करता है।
सामान्य तौर पर, अमेरिकी विश्वविद्यालय कार्यात्मक प्रोग्रामिंग सिखाने के लिए एक खराब काम कर रहे हैं। स्कीम का उपयोग करके इंट्रो प्रोग्रामिंग सिखाने के लिए समर्थन का एक मजबूत आधार है , और हास्केल को भी वहाँ कुछ समर्थन प्राप्त है, लेकिन कार्यात्मक प्रोग्रामर के लिए उन्नत तकनीक सिखाने के तरीके में बहुत कम है। मैंने हार्वर्ड में ऐसा कोर्स पढ़ाया है और टफ्ट्स में इस बार फिर से ऐसा ही करूंगा। बेंजामिन पियर्स ने पेन पर ऐसा कोर्स पढ़ाया है। मुझे नहीं पता कि पॉल हुडक ने येल में कुछ किया है या नहीं। यूरोपीय विश्वविद्यालय बहुत बेहतर काम कर रहे हैं; उदाहरण के लिए, डेनमार्क, नीदरलैंड, स्वीडन और यूके में महत्वपूर्ण स्थानों पर कार्यात्मक प्रोग्रामिंग पर जोर दिया जाता है। मुझे इस बात की कम जानकारी है कि आस्ट्रेलिया में क्या हो रहा है।
मैं यहाँ कमरे में हाथी का उल्लेख करते हुए किसी को नहीं देखता, इसलिए मुझे लगता है कि यह मेरे ऊपर है :)
जावास्क्रिप्ट एक कार्यात्मक भाषा है। जैसा कि अधिक से अधिक लोग जेएस के साथ और अधिक उन्नत चीजें करते हैं, विशेष रूप से jQuery, Dojo और अन्य रूपरेखाओं के बारीक बिंदुओं का लाभ उठाते हुए, एफपी को वेब-डेवलपर के बैक-डोर द्वारा पेश किया जाएगा।
क्लोजर के साथ संयोजन के रूप में, एफपी जेएस कोड को वास्तव में हल्का बनाता है, फिर भी पठनीय है।
चीयर्स, पीएस
अधिकांश अनुप्रयोग सामान्य OO तरीकों से हल किए जाने के लिए पर्याप्त सरल हैं
ओओ के तरीके हमेशा "सामान्य" नहीं रहे हैं। इस दशक का मानक पिछले दशक की सीमांत अवधारणा थी।
फंक्शनल प्रोग्रामिंग गणित है। लिस्प पर पॉल ग्राहम (लिस्प के लिए स्थानापन्न कार्यात्मक प्रोग्रामिंग):
तो यह 1950 के दशक की भाषा अप्रचलित क्यों नहीं है, इसकी संक्षिप्त व्याख्या यह है कि यह तकनीक नहीं थी, लेकिन गणित, और गणित बासी नहीं है। लिस्प की तुलना करने के लिए सही चीज 1950 का हार्डवेयर नहीं है, लेकिन, कहते हैं, क्विकसॉर्ट एल्गोरिथ्म, जिसे 1960 में खोजा गया था और अभी भी सबसे तेजी से सामान्य प्रयोजन है।
मुझे यकीन है कि जब आप उपयोग करते थे तो आपको पता नहीं था कि आप कार्यात्मक प्रोग्रामिंग थे:
औसत कॉर्पोरेट प्रोग्रामर, उदाहरण के लिए मैं जिन लोगों के साथ काम करता हूं, उनमें से अधिकांश इसे समझ नहीं पाएंगे और अधिकांश कार्य वातावरण आपको इसमें प्रोग्राम नहीं करने देंगे
हालांकि यह एक समय की बात है। आपका औसत कॉर्पोरेट प्रोग्रामर सीखता है कि वर्तमान बिग थिंग जो भी है। 15 साल पहले, वे OOP को नहीं समझते थे। यदि एफपी पर पकड़ है, तो आपके "औसत कॉर्पोरेट प्रोग्रामर" का पालन करेंगे।
यह वास्तव में विश्वविद्यालयों में नहीं पढ़ाया जाता है (या आजकल यह है?)
बहुत कुछ बदलता है। मेरे विश्वविद्यालय में, SML सबसे पहली भाषा है जिसे छात्रों को पेश किया जाता है। मेरा मानना है कि एमआईटी एलआईएसपी को प्रथम वर्ष के पाठ्यक्रम के रूप में पढ़ाता है। ये दो उदाहरण प्रतिनिधि नहीं हो सकते, बेशक, लेकिन मेरा मानना है कि अधिकांश विश्वविद्यालय एफपी पर कुछ वैकल्पिक पाठ्यक्रम प्रदान करते हैं, भले ही वे इसे पाठ्यक्रम का अनिवार्य हिस्सा न बनाते हों।
अधिकांश अनुप्रयोग सामान्य OO तरीकों से हल किए जाने के लिए पर्याप्त सरल हैं
हालांकि यह वास्तव में "सरल पर्याप्त" की बात नहीं है। एफपी में एक समाधान सरल (या अधिक पठनीय, मजबूत, सुरुचिपूर्ण, प्रदर्शनकारी) होगा? कई चीजें "जावा में हल करने के लिए पर्याप्त सरल हैं", लेकिन इसके लिए अभी भी कोड की एक ईश्वरीय राशि की आवश्यकता होती है।
किसी भी मामले में, ध्यान रखें कि एफपी समर्थकों ने दावा किया है कि यह अब कई दशकों तक नेक्स्ट बिग थिंग था। शायद वे सही हैं, लेकिन ध्यान रखें कि जब वे एक ही दावा 5, 10 या 15 साल पहले नहीं करते थे।
एक बात जो निश्चित रूप से उनके पक्ष में मायने रखती है, हालांकि, यह है कि हाल ही में, सी # ने एफपी की ओर एक तीव्र मोड़ लिया है, इस हद तक कि यह व्यावहारिक रूप से प्रोग्रामर की एक पीढ़ी को एफपी प्रोग्रामर में बदल रहा है, उनके बिना भी सूचना नहीं । यह एफपी "क्रांति" का मार्ग प्रशस्त कर सकता है। शायद। ;)
मनुष्य अपनी चुनी हुई कला की पूर्णता और खामियों को नहीं समझ सकता है यदि वह अन्य कलाओं में मूल्य नहीं देख सकता है। निम्नलिखित नियम केवल तकनीक में एक बिंदु तक विकास की अनुमति देते हैं और फिर छात्र और कलाकार को अधिक सीखना और आगे की तलाश करना है। यह अन्य कलाओं के साथ-साथ रणनीति का अध्ययन करने के लिए समझ में आता है।
जिसने दूसरों की गतिविधियों को देखकर खुद के बारे में कुछ और नहीं सीखा है? तलवार सीखने के लिए गिटार का अध्ययन करें। मुट्ठी अध्ययन वाणिज्य सीखने के लिए। सिर्फ अध्ययन करने के लिए तलवार आपको संकीर्ण बना देगी और आपको बाहर की तरफ बढ़ने की अनुमति नहीं देगी।
- मियामोतो मुशी, "ए बुक ऑफ़ फाइव रिंग्स"
एक कार्यात्मक भाषा में एक प्रमुख विशेषता प्रथम श्रेणी के कार्यों की अवधारणा है। विचार यह है कि आप कार्यों को अन्य कार्यों के मापदंडों के रूप में पारित कर सकते हैं और उन्हें मान के रूप में वापस कर सकते हैं।
कार्यात्मक प्रोग्रामिंग में लेखन कोड शामिल होता है जो राज्य को नहीं बदलता है। ऐसा करने का प्राथमिक कारण यह है कि किसी फ़ंक्शन को लगातार कॉल करने से परिणाम समान होगा। आप किसी भी भाषा में कार्यात्मक कोड लिख सकते हैं जो प्रथम श्रेणी के कार्यों का समर्थन करता है, लेकिन कुछ भाषाएं हैं, जैसे हास्केल, जो आपको राज्य बदलने की अनुमति नहीं देते हैं। वास्तव में, आपको किसी भी तरह के साइड इफेक्ट्स (जैसे कि टेक्स्ट को प्रिंट करना) नहीं करना चाहिए - ऐसा लगता है कि यह पूरी तरह से बेकार हो सकता है।
हास्केल इसके बजाय IO: मोनैड्स के लिए एक अलग दृष्टिकोण नियुक्त करता है। ये ऐसी वस्तुएं हैं जिनमें आपके इंटरप्रेटर के टॉपवेल द्वारा निष्पादित किए जाने वाले वांछित आईओ ऑपरेशन शामिल हैं। किसी भी अन्य स्तर पर वे सिस्टम में केवल ऑब्जेक्ट हैं।
कार्यात्मक प्रोग्रामिंग क्या लाभ प्रदान करता है? कार्यात्मक प्रोग्रामिंग कीड़े के लिए कम क्षमता के साथ कोडिंग की अनुमति देता है क्योंकि प्रत्येक घटक पूरी तरह से पृथक है। इसके अलावा, पुनरावृत्ति और प्रथम श्रेणी के कार्यों का उपयोग करके शुद्धता के सरल प्रमाणों की अनुमति मिलती है जो आमतौर पर कोड की संरचना को प्रतिबिंबित करते हैं।
मुझे नहीं लगता कि अधिकांश यथार्थवादी लोगों को लगता है कि कार्यात्मक प्रोग्रामिंग (ओओ की तरह मुख्य प्रतिमान) बन जाएगी। आखिरकार, अधिकांश व्यावसायिक समस्याएं बहुत गणित की समस्याएं नहीं हैं, लेकिन बालों के लिए डेटा को स्थानांतरित करने और उन्हें विभिन्न तरीकों से प्रदर्शित करने के लिए बालों के अनिवार्य नियम हैं, जिसका अर्थ है कि यह शुद्ध कार्यात्मक प्रोग्रामिंग प्रतिमान के लिए एक अच्छा फिट नहीं है (मोनाड का सीखने की अवस्था OO से अधिक है।
OTOH, कार्यात्मक प्रोग्रामिंग वह है जो प्रोग्रामिंग को मजेदार बनाता है। यह आपको ब्रह्माण्ड के अंतर्निहित गणित की संक्षिप्त अभिव्यक्ति की अंतर्निहित, कालातीत सुंदरता की सराहना करता है। लोग कहते हैं कि कार्यात्मक प्रोग्रामिंग सीखने से आप एक बेहतर प्रोग्रामर बनेंगे। यह निश्चित रूप से अत्यधिक व्यक्तिपरक है। मुझे व्यक्तिगत रूप से नहीं लगता कि यह पूरी तरह से सच है।
यह आपको एक बेहतर भावुक बनाता है।
मुझे घना होना चाहिए, लेकिन मैं अभी भी नहीं मिला। क्या एफ # जैसी कार्यात्मक भाषा में लिखे गए छोटे ऐप के कोई वास्तविक उदाहरण हैं जहां आप स्रोत कोड को देख सकते हैं और देख सकते हैं कि कैसे और क्यों इस तरह के दृष्टिकोण का उपयोग करना बेहतर था, कहते हैं, सी #?
मैं बताता हूं कि कार्यात्मक भाषाओं के बारे में आपने जो कुछ भी कहा है, लगभग 20 साल पहले ज्यादातर लोग ऑब्जेक्ट-ओरिएंटेड लैंगगेज के बारे में कह रहे थे। वापस तो OO के बारे में सुनना बहुत आम था:
* The average corporate programmer, e.g. most of the people I work with, will not understand it and most work environments will not let you program in it
* It's not really taught at universities (or is it nowadays?)
* Most applications are simple enough to be solved in normal IMPERATIVE ways
बदलाव कहीं से आना है। एक सार्थक और महत्वपूर्ण बदलाव खुद ही हो जाएगा, भले ही पहले की तकनीकों में प्रशिक्षित लोग इस बात पर ध्यान दें कि परिवर्तन आवश्यक नहीं है। क्या आपको लगता है कि उस समय सभी लोगों के बावजूद OO में बदलाव अच्छा था?
F # पकड़ सकता था क्योंकि Microsoft इसे आगे बढ़ा रहा है।
समर्थक:
कॉन्ट्रा:
इसलिए, मैं F # को महत्वपूर्ण बनने के लिए 50:50 का मौका देता हूं। अन्य कार्यात्मक भाषाएँ निकट भविष्य में इसे बनाने नहीं जा रही हैं।
मुझे लगता है कि एक कारण यह है कि कुछ लोगों को लगता है कि किसी भाषा को स्वीकार किया जाएगा या नहीं, इसका सबसे महत्वपूर्ण हिस्सा यह है कि भाषा कितनी अच्छी है । दुर्भाग्य से, चीजें शायद ही कभी इतनी सरल हैं। उदाहरण के लिए, मैं तर्क दूंगा कि पायथन की स्वीकृति के पीछे सबसे बड़ा कारक भाषा ही नहीं है (हालांकि यह बहुत महत्वपूर्ण है)। अजगर का इतना लोकप्रिय होने का सबसे बड़ा कारण है उसका विशाल मानक पुस्तकालय और तीसरा पक्ष पुस्तकालयों का उससे भी बड़ा समुदाय।
क्लीजुर या एफ # जैसी भाषाएं इस पर विचार करने के लिए नियम का अपवाद हो सकती हैं कि वे जेवीएम / सीएलआर पर निर्मित हैं। नतीजतन, मेरे पास उनके लिए कोई जवाब नहीं है।
अधिकांश एप्लिकेशन को [अपनी पसंदीदा भाषा, प्रतिमान आदि सम्मिलित करें] में हल किया जा सकता है।
हालांकि, यह सच है, विभिन्न उपकरणों का उपयोग विभिन्न समस्याओं को हल करने के लिए किया जा सकता है। कार्यात्मक सिर्फ एक और उच्च (उच्च?) स्तर के अमूर्त की अनुमति देता है जो सही ढंग से उपयोग किए जाने पर हमारे कार्यों को अधिक प्रभावी ढंग से करने की अनुमति देता है।
मुझे ऐसा लगता है कि जिन लोगों ने स्नातक के रूप में लिस्प या योजना कभी नहीं सीखी, वे अब इसकी खोज कर रहे हैं। इस क्षेत्र में बहुत सी चीजों के साथ प्रचार करने और उच्च उम्मीदें पैदा करने की प्रवृत्ति है ...
यह सफल हो जाएगा।
फंक्शनल प्रोग्रामिंग बढ़िया है। हालांकि, यह दुनिया को नहीं लेगा। C, C ++, Java, C #, आदि अभी भी आसपास ही होंगे।
इससे क्या होगा कि मुझे लगता है कि अधिक क्रॉस-भाषा क्षमता है - उदाहरण के लिए एक कार्यात्मक भाषा में चीजों को लागू करना और फिर अन्य भाषाओं में उस सामान तक पहुंच प्रदान करना।
टिम स्वीनी, एपिक गेम्स द्वारा "द नेक्स्ट मेनस्ट्रीम प्रोग्रामिंग लैंग्वेज: ए गेम डेवलपर पर्सपेक्टिव" पढ़ते समय, मेरा पहला विचार था - मुझे हास्केल सीखने को मिला।
चीजें कुछ समय के लिए कार्यात्मक दिशा में आगे बढ़ रही हैं। पिछले कुछ वर्षों के दो शांत नए बच्चे, रूबी और पायथन, दोनों ही पहले की तुलना में कार्यात्मक भाषाओं के करीब मौलिक रूप से अधिक हैं - इतना है कि कुछ लिस्पर्स ने एक या दूसरे को "करीब पर्याप्त" के रूप में समर्थन करना शुरू कर दिया है।
और बड़े पैमाने पर समानांतर हार्डवेयर के साथ हर किसी पर विकासवादी दबाव डालते हैं - और परिवर्तनों से निपटने के लिए सबसे अच्छी जगह में कार्यात्मक भाषाएं - यह अब तक एक छलांग नहीं है क्योंकि यह सोचना एक बार था कि हास्केल या एफ # अगली बड़ी चीज होगी।
क्या आप हाल ही में प्रोग्रामिंग भाषाओं के विकास का अनुसरण कर रहे हैं? सभी मुख्य धारा प्रोग्रामिंग भाषाओं की हर नई रिलीज कार्यात्मक प्रोग्रामिंग से अधिक से अधिक सुविधाओं को उधार लेती है।
क्लोज़र, अनाम फ़ंक्शंस, पासिंग और रिटर्निंग फ़ंक्शंस, मानों का उपयोग केवल लिस्प और एमएल हैकर्स के लिए जाने जाने वाली विदेशी सुविधाएँ थीं। लेकिन धीरे-धीरे, सी #, डेल्फी, पायथन, पर्ल, जावास्क्रिप्ट, ने बंद के लिए समर्थन जोड़ा है। किसी भी अप और आने वाली भाषा को बंद किए बिना गंभीरता से लिया जाना संभव नहीं है।
कई भाषाओं, विशेष रूप से पायथन, सी #, और रूबी को सूची समझ और सूची जनरेटर के लिए मूल समर्थन है।
एमएल ने 1973 में जेनेरिक प्रोग्रामिंग का बीड़ा उठाया, लेकिन जेनेरिक ("पैरामीट्रिक पॉलीमोर्फिज्म") के लिए समर्थन केवल पिछले 5 वर्षों में एक उद्योग मानक बन गया है। अगर मुझे सही तरीके से याद है, तो फोरट्रान ने 2003 में जेनरिक का समर्थन किया, इसके बाद जावा 2004, 2005 में सी #, 2008 में डेल्फी। (मुझे पता है कि सी ++ ने 1979 से समर्थन किया है, लेकिन सी ++ के एसटीएल पर 90% चर्चा "यहाँ राक्षस हो" से शुरू होती है। ।)
क्या इन सुविधाओं प्रोग्रामर के लिए अपील करता है? यह स्पष्ट रूप से स्पष्ट होना चाहिए: यह प्रोग्रामर को छोटे कोड लिखने में मदद करता है । यदि वे प्रतिस्पर्धी बने रहना चाहते हैं तो भविष्य में सभी भाषाएं कम से कम बंद होने का समर्थन करने जा रही हैं। इस संबंध में, कार्यात्मक प्रोग्रामिंग पहले से ही मुख्यधारा में है।
अधिकांश अनुप्रयोग सामान्य OO तरीकों से हल किए जाने के लिए पर्याप्त सरल हैं
कौन कहता है कि साधारण चीजों के लिए भी कार्यात्मक प्रोग्रामिंग का उपयोग नहीं किया जा सकता है? प्रत्येक कार्यात्मक कार्यक्रम को एक संकलक, प्रमेय कहावत, या व्यापक समानांतर दूरसंचार स्विच की आवश्यकता नहीं होती है। मैं नियमित रूप से अपने अधिक जटिल परियोजनाओं के अलावा तदर्थ फेंकने वाली लिपियों के लिए एफ # का उपयोग करता हूं।
इस पर पकड़ है क्योंकि यह जटिलता को नियंत्रित करने के लिए सबसे अच्छा उपकरण है। देखें:
- साइमन पेटन-जोन्स की 109-116 स्लाइड्स में "ए टेस्ट ऑफ हास्केल"
- "टिम मेनस्टी द्वारा दी गई अगली मेनस्ट्रीम प्रोग्रामिंग लैंग्वेज: ए गेम डेवलपर का पर्सपेक्टिव"
मैं पहले बिंदु से सहमत हूं, लेकिन समय बदल जाता है। यदि वे देर से गोद लेने वाले हैं, तो निगम जवाब देंगे, यदि वे देखते हैं कि वहाँ एक फायदा होना चाहिए था। जीवन गतिशील है।
वे 90 के दशक के अंत में स्टैनफोर्ड में हास्केल और एमएल को पढ़ा रहे थे। मुझे यकीन है कि कार्नेगी मेलन, एमआईटी, स्टैनफोर्ड, और अन्य अच्छे स्कूल जैसे स्थान इसे छात्रों के सामने पेश कर रहे हैं।
मैं सहमत हूं कि अधिकांश "वेब पर रिलेशनल डेटाबेस को उजागर करते हैं" ऐप लंबे समय तक उस नस में जारी रहेंगे। Java EE, .NET, RoR और PHP ने उस समस्या के कुछ बहुत अच्छे समाधान विकसित किए हैं।
आप किसी महत्वपूर्ण चीज पर चोट कर रहे हैं: यह समस्या हो सकती है जिसे अन्य तरीकों से आसानी से हल नहीं किया जा सकता है जो कार्यात्मक प्रोग्रामिंग को बढ़ावा देगा। वो क्या हो सकता है?
क्या बड़े पैमाने पर मल्टीकोर हार्डवेयर और क्लाउड कंप्यूटिंग उन्हें साथ धकेलेंगे?
क्योंकि एफपी की उत्पादकता, विश्वसनीयता और स्थिरता के संदर्भ में महत्वपूर्ण लाभ हैं। कई-कोर एक किलर ऐप हो सकते हैं जो अंततः विरासत कोड के बड़े संस्करणों के बावजूद स्विच करने के लिए बड़े निगम हो जाते हैं। इसके अलावा, यहां तक कि सी # जैसी बड़ी व्यावसायिक भाषाएं कई-कोर चिंताओं के परिणामस्वरूप एक अलग कार्यात्मक स्वाद ले रही हैं - साइड इफेक्ट्स संगामिति और समानता के साथ अच्छी तरह से फिट नहीं है।
मैं इस बात से सहमत नहीं हूँ कि "सामान्य" प्रोग्रामर इसे समझ नहीं पाएंगे। वे, जैसे वे अंततः ओओपी को समझ गए (जो उतना ही रहस्यमय और अजीब है, यदि ऐसा नहीं है तो)।
इसके अलावा, अधिकांश विश्वविद्यालय एफपी सिखाते हैं, कई इसे पहले प्रोग्रामिंग कोर्स के रूप में भी पढ़ाते हैं।
वाह - यह एक दिलचस्प चर्चा है। इस पर मेरे अपने विचार:
FP कुछ कार्यों को अपेक्षाकृत सरल बनाता है (किसी भी FP भाषा की तुलना में)। एफपी से कोई भी एफपी भाषा पहले से ही विचारों को लेने के लिए शुरू नहीं कर रहा है, इसलिए मुझे संदेह है कि यह प्रवृत्ति जारी रहेगी और हम अधिक मर्ज देखेंगे जो लोगों को एफपी को आसान बनाने में मदद करेगा।
मुझे नहीं पता कि यह पकड़ा जाएगा या नहीं, लेकिन मेरी जांच से, एक कार्यात्मक भाषा लगभग निश्चित रूप से सीखने लायक है, और आपको एक बेहतर प्रोग्रामर बनाएगी। बस संदर्भात्मक पारदर्शिता को समझना बहुत सारे डिज़ाइन निर्णयों को इतना आसान बना देता है- और परिणामी कार्यक्रमों के बारे में तर्क करने में बहुत आसान है। मूल रूप से, यदि आप किसी समस्या में भाग लेते हैं, तो यह केवल एक फ़ंक्शन के आउटपुट के साथ एक समस्या है, बजाय एक असंगत राज्य के साथ एक समस्या के साथ, जो सैकड़ों वर्गों / विधियों / कार्यों में से किसी के कारण हो सकता है। दुष्प्रभाव के साथ एक अभेद्य भाषा में।
एफपी की स्टेटलेस प्रकृति वेब के स्टेटलेस प्रकृति के लिए अधिक स्वाभाविक रूप से मैप करती है, और इस प्रकार कार्यात्मक भाषाएं खुद को अधिक सुरुचिपूर्ण, रेस्टफुल वेबैप्स पर आसानी से उधार देती हैं। JAVA और .NET फ्रेमवर्क के साथ कंट्रास्ट करें, जो एप्लिकेशन स्टेट को बनाए रखने के लिए, और (कभी-कभार काफी टपका हुआ) एब्सट्रेक्ट जैसे स्टेटसिव लोजिश फंक्शनल प्लेटफॉर्म जैसे वेब पर अनिवार्य रूप से देखने के लिए VIEWSTATE और SESSION की तरह बुरी तरह से HACKS का सहारा लेना पड़ता है।
और यह भी, जितना अधिक आपके आवेदन को उतना ही बेकार किया जाएगा, उतना ही यह आसानी से समानांतर प्रसंस्करण के लिए उधार दे सकता है। वेब के लिए बहुत महत्वपूर्ण है, अगर आपकी वेबसाइट लोकप्रिय होने के लिए होती है। बेहतर प्रदर्शन पाने के लिए किसी साइट पर अधिक हार्डवेयर जोड़ना हमेशा सीधा नहीं होता है।
मेरा विचार यह है कि अब यह पकड़ लेगा कि Microsoft ने इसे मुख्यधारा में आगे बढ़ा दिया है। मेरे लिए यह आकर्षक है क्योंकि यह हमारे लिए क्या कर सकता है, क्योंकि यह एक नई चुनौती है और नौकरी के अवसरों के कारण यह भविष्य के लिए मायने रखता है।
एक बार महारत हासिल करने के बाद यह प्रोग्रामर के रूप में हमें और अधिक उत्पादक बनाने में मदद करने के लिए एक और उपकरण होगा।
चर्चा में एक बिंदु चूक गया कि समकालीन एफपी भाषाओं में सबसे अच्छी प्रकार की प्रणालियां पाई जाती हैं। क्या अधिक है, संकलक स्वचालित रूप से सभी (या कम से कम सबसे) प्रकारों का अनुमान लगा सकते हैं।
यह दिलचस्प है कि कोई जावा प्रोग्रामिंग करते समय आधा समय टाइप नाम लिखता है, फिर भी जावा बहुत सुरक्षित नहीं है। हालांकि आप कभी भी हास्केल प्रोग्राम में टाइप नहीं कर सकते (सिवाय एक तरह के कंपाइलर चेक किए हुए डॉक्यूमेंटेशन के) और कोड 100% सुरक्षित है।
अन्य उत्तरों के अलावा, शुद्ध कार्यात्मक शब्दों में समाधान की कास्टिंग समस्या को बेहतर ढंग से समझने के लिए मजबूर करती है। इसके विपरीत, एक कार्यात्मक शैली में सोचने से बेहतर * समस्या निवारण कौशल विकसित होगा।
* या तो क्योंकि कार्यात्मक प्रतिमान बेहतर है या क्योंकि यह हमले के एक अतिरिक्त कोण को वहन करेगा।