कार्यात्मक, घोषणात्मक और इंपीरियल प्रोग्रामिंग [बंद]


466

कार्यात्मक, घोषणात्मक और अनिवार्य प्रोग्रामिंग शब्द क्या हैं?


3
यहाँ कुछ महान जवाब हैं। एक दिलचस्प बात यह है कि पूरी तरह से स्पष्ट नहीं है कि है कथात्मक और अनिवार्य सिर्फ अलग अलग शैलियों या अधिक से अधिक पूरक और सहजीवी कर रहे हैं, क्या बनाम कैसे
किट

1
@ किट इमो, इस पृष्ठ के कुछ उत्तर शर्तों को स्वीकार कर रहे हैं। DP == संदर्भात्मक पारदर्शिता (RT)। DP और IP विपरीत हैं, इस प्रकार afaics संपूर्ण का पूरक नहीं है, अर्थात पूरे कार्यक्रम को किसी भी शैली में लिखा जा सकता है। किसी फ़ंक्शन का कॉल डीपी (आरटी) या आईपी हो सकता है, इसका कार्यान्वयन या तो हो सकता है या मिश्रण हो सकता है। वे इस अर्थ में सहजीवन नहीं हैं कि एक डीपी फ़ंक्शन में आईपी फ़ंक्शन के लिए कॉल डीपी फ़ंक्शन के कॉल को आईपी बना सकता है। वे इस अर्थ में सहजीवी हैं कि वास्तविक दुनिया (जैसे कार्यात्मक प्रतिक्रियाशील) कार्यक्रम एक मिश्रण को नियोजित कर सकते हैं, जैसे आईपी डीपी कार्यों में शीर्ष स्तर के कॉल।
शेल्बी मूर तृतीय 19

विकि को विकि के साथ जोड़ा जाता है या विकी के समान कुछ पर एक कड़ी दी जाती है। यहाँ विकिपीडिया en.wikipedia.org/wiki/Comparison_of_programming_paradigms
जो


1
इस सवाल पर मेटा पर चर्चा की जा रही है: meta.stackoverflow.com/q/342784/2751851
duplode

जवाबों:


262

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

स्प्रैडशीट प्रोग्रामिंग डिक्लेरेटिव क्यों है, इस बात की भी मेरी व्याख्या देखें कि फ़ार्मुलों कोशिकाओं को म्यूट करते हैं या नहीं।

इसके अलावा, कई उत्तर दावा करते हैं कि कार्यात्मक प्रोग्रामिंग को घोषणापत्र का सबसेट होना चाहिए। उस बिंदु पर यह निर्भर करता है कि क्या हम "कार्यविधि" से "फ़ंक्शन" को अलग करते हैं। पहले अनिवार्य बनाम घोषणात्मक को संभालने देता है।

घोषणात्मक अभिव्यक्ति की परिभाषा

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

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

आरटी अभिव्यक्ति की परिभाषा

आरटी को अक्सर "कोई साइड-इफेक्ट" नहीं होने के रूप में संदर्भित किया जाता है। शब्द प्रभाव की सटीक परिभाषा नहीं है, इसलिए कुछ लोग इस बात से सहमत नहीं हैं कि "कोई साइड-इफेक्ट" आरटी के समान नहीं है। RT की एक सटीक परिभाषा है

चूंकि प्रत्येक उप-अभिव्यक्ति अवधारणात्मक रूप से एक फ़ंक्शन कॉल है, इसलिए RT को आवश्यकता होती है कि एक फ़ंक्शन (यानी एक्सप्रेशन (s) जिसे फंक्शन के अंदर कहा जाता है) का क्रियान्वयन उस पारस्परिक स्थिति तक नहीं पहुंच सकता है जो फ़ंक्शन के लिए बाहरी है (जो परस्पर स्थानीय स्थिति तक पहुंच है) अनुमति है)। सीधे शब्दों में कहें, फ़ंक्शन (कार्यान्वयन) शुद्ध होना चाहिए ।

शुद्ध कार्य की परिभाषा

एक शुद्ध कार्य को अक्सर "कोई दुष्प्रभाव नहीं" कहा जाता है। शब्द प्रभाव की सटीक परिभाषा नहीं है, इसलिए कुछ लोग सहमत नहीं हैं।

शुद्ध कार्यों के निम्नलिखित गुण हैं।

  • केवल अवलोकनीय आउटपुट रिटर्न वैल्यू है।
  • केवल आउटपुट निर्भरता तर्क है।
  • किसी भी आउटपुट के उत्पन्न होने से पहले तर्क पूरी तरह से निर्धारित होते हैं।

याद रखें कि आरटी अभिव्यक्तियों (जिसमें फ़ंक्शन कॉल भी शामिल है) और शुद्धता (कार्यों के कार्यान्वयन) पर लागू होती है।

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

आरटी के व्युत्पन्न गुण

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

ध्यान दें, बाहरी मूल्यों की अपरिवर्तनीयता आरटी के लिए आवश्यकताओं का एक सबसेट है।

  • घोषणात्मक भाषाओं नियंत्रण संरचनाओं, जैसे पाशन नहीं है forऔर while, क्योंकि अचल स्थिति की वजह से , लूप हालत परिवर्तन नहीं करता।

  • घोषित भाषाएं नेस्टेड फ़ंक्शन ऑर्डर (उर्फ तार्किक निर्भरता) के अलावा नियंत्रण-प्रवाह को व्यक्त नहीं करती हैं, क्योंकि अपरिवर्तनीयता के कारण , मूल्यांकन आदेश के अन्य विकल्प परिणाम नहीं बदलते हैं (नीचे देखें)।

  • घोषणात्मक भाषाएं तार्किक "चरण" (यानी नेस्टेड आरटी फ़ंक्शन कॉल ऑर्डर) व्यक्त करती हैं, लेकिन क्या प्रत्येक फ़ंक्शन कॉल उच्च स्तर का शब्दार्थ है (यानी "क्या करना है") घोषित प्रोग्रामिंग की आवश्यकता नहीं है। अनिवार्य से अंतर यह है कि अपरिवर्तनीयता (यानी आमतौर पर आरटी) के कारण, ये "चरण" उत्परिवर्तनीय स्थिति पर निर्भर नहीं कर सकते हैं, बल्कि केवल व्यक्त तर्क के रिलेशनल ऑर्डर (यानी फ़ंक्शन कॉल के घोंसले का क्रम, उर्फ ​​उप-अभिव्यक्ति) )।

    उदाहरण के लिए, HTML पैराग्राफ <p>को तब तक प्रदर्शित नहीं किया जा सकता है जब तक कि पैराग्राफ में उप-एक्सप्रेशन (यानी टैग) का मूल्यांकन नहीं किया जाता है। कोई उत्परिवर्ती राज्य नहीं है, केवल टैग पदानुक्रम (उप-अभिव्यक्तियों के घोंसले, जो अनुरूप रूप से नेस्टेड फ़ंक्शन कॉल हैं ) के तार्किक संबंध के कारण एक आदेश निर्भरता है ।

  • इस प्रकार अपरिवर्तनीयता (अधिक सामान्यतः आरटी) की व्युत्पन्न विशेषता है, जो कि घोषणात्मक अभिव्यक्तियाँ, केवल घटक भागों (यानी उप-अभिव्यक्ति फ़ंक्शन तर्कों) के तार्किक रिश्तों को व्यक्त करती हैं और न कि पारस्परिक राज्य संबंधों को।

मूल्यांकन आदेश

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

उदाहरण के लिए, कुछ नेस्टेड एक्सप्रेशन दिए गए हैं, उदाहरण के लिए, f( g(a, b), h(c, d) )फ़ंक्शन तर्कों के उत्सुक और आलसी मूल्यांकन यदि कार्य करते हैं f, तो वही परिणाम देंगे g, और hशुद्ध होंगे।

जबकि, यदि फ़ंक्शन f, gऔर hशुद्ध नहीं हैं, तो मूल्यांकन आदेश का विकल्प एक अलग परिणाम दे सकता है।

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

स्पर्शरेखीय, अगर सब पहचानकर्ता, जैसे a, b, c, d, कर रहे हैं अपरिवर्तनीय हर जगह, राज्य कार्यक्रम के लिए बाहरी पहुँचा नहीं जा सकता है (यानी आई / ओ), और कोई अमूर्त परत टूटना है, तो कार्यों हमेशा शुद्ध कर रहे हैं।

वैसे, हास्केल, एक अलग वाक्यविन्यास है f (g a b) (h c d)

मूल्यांकन क्रम विवरण

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

ईगर मूल्यांकन का अर्थ है फ़ंक्शन को कॉल करने से पहले फ़ंक्शन के तर्कों का मूल्यांकन किया जाता है, और आलसी मूल्यांकन का अर्थ है कि तर्क का मूल्यांकन तब तक नहीं किया जाता है जब तक (और यदि वे फ़ंक्शन के भीतर एक्सेस नहीं होते हैं)।

परिभाषा : फ़ंक्शन मापदंडों को फ़ंक्शन परिभाषा साइट पर घोषित किया जाता है , और फ़ंक्शन कॉल साइट पर फ़ंक्शन तर्क दिए जाते हैं । पैरामीटर और तर्क के बीच अंतर को जानें ।

वैचारिक रूप से, सभी भाव स्थिरांक आदानों के बिना काम करता है कर रहे हैं, एकल ऑपरेटरों एक इनपुट के साथ कार्य हैं, द्विआधारी इन्फ़िक्स ऑपरेटरों दो जानकारी के साथ कार्य हैं, कंस्ट्रक्टर्स काम करता है, और यहां तक कि नियंत्रण बयान कर रहे हैं (उदाहरण के लिए (की एक रचना) फ़ंक्शन कॉल, जैसे हैं if, for, while) कार्यों के साथ मॉडलिंग की जा सकती है। आदेश है कि इन तर्क कार्यों (नेस्टेड समारोह कॉल आदेश के साथ नहीं भ्रमित करते हैं) का मूल्यांकन किया जाता वाक्य रचना द्वारा घोषित नहीं किया गया है, जैसे f( g() )उत्सुकता का मूल्यांकन कर सकता है gतो fपर gके परिणाम या इसे का मूल्यांकन कर सकता है fऔर केवल lazily का मूल्यांकन gजब उसके परिणाम के भीतर की जरूरत है f

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

कार्यात्मक प्रोग्रामिंग

क्योंकि घोषणात्मक प्रोग्रामिंग में लूप नहीं हो सकते हैं, तो पुनरावृति का एकमात्र तरीका कार्यात्मक पुनरावृत्ति है। यह इस अर्थ में है कि कार्यात्मक प्रोग्रामिंग घोषणात्मक प्रोग्रामिंग से संबंधित है।

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

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

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

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

समानता

प्रथम श्रेणी के कार्यों के साथ यह कार्यात्मक रचना स्वतंत्र कार्य को अलग करके समानता में गहराई को व्यक्त कर सकती है ।

ब्रेंट का सिद्धांत: काम डब्ल्यू और डेप्थ डी के साथ गणना एक पी-प्रोसेसर PRAM में समय ओ (अधिकतम (w / p, d)) में लागू किया जा सकता है।

समवर्ती और समानांतरवाद दोनों को घोषित प्रोग्रामिंग , यानी अपरिवर्तनीयता और आरटी की आवश्यकता होती है

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

एफपी मूल्यांकन आदेश

ध्यान दें कि मूल्यांकन आदेश कार्यात्मक रचना की समाप्ति और प्रदर्शन के दुष्प्रभावों को भी प्रभावित करता है।

ईगर (CBV) और आलसी (CBN) श्रेणीबद्ध युगल [ 10 ] हैं, क्योंकि उन्होंने मूल्यांकन क्रम को उलट दिया है, अर्थात क्रमशः बाहरी या आंतरिक कार्यों का पहले मूल्यांकन किया जाता है। एक उल्टा पेड़ की कल्पना करें, फिर फ़ंक्शन ट्री शाखा से उत्सुकता का मूल्यांकन करता है जो शाखा पदानुक्रम को शीर्ष-स्तरीय फ़ंक्शन ट्रंक तक ले जाता है; जबकि, आलसी नीचे ट्रंक से शाखा सुझावों तक का मूल्यांकन करता है। उत्सुक के पास संयुग्मक उत्पाद नहीं हैं ("और", a / k / a श्रेणीबद्ध "उत्पादों") और आलसी के पास असम्बद्ध प्रतिलिपि नहीं है ("या", a / k / a श्रेणीबद्ध "sums") [ 11 ]।

प्रदर्शन

  • उत्सुक

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

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

  • आलसी

    नॉन-टर्मिनेशन के साथ, आलसी डिस्जैक्टिव फंक्शनल कंपोजिशन के साथ बहुत आलसी है, यानी कोइंडिक्टिव फाइनली बाद में आवश्यकता से अधिक हो सकता है, जिसके परिणामस्वरूप अनावश्यकता और लेटनेस का गैर-निर्धारण दोनों होता है जो उत्सुकता के साथ नहीं होता है [ 10 ] [ 11 ] । अंतिमता के उदाहरण राज्य, समय, गैर-समाप्ति और रनटाइम अपवाद हैं। ये अनिवार्य दुष्प्रभाव हैं, लेकिन यहां तक ​​कि एक शुद्ध घोषणात्मक भाषा (जैसे हास्केल) में भी अनिवार्य है IO मोनाड (नोट: सभी भिक्षु अनिवार्य नहीं हैं!) अंतरिक्ष आवंटन में निहित है, और समय अनिवार्यता के सापेक्ष है! असली दुनिया। आलसी का उपयोग करना, यहां तक ​​कि वैकल्पिक उत्सुक प्रतिरूपों के साथ "आलस्य" को आंतरिक प्रतिरूपों में लीक कर देता है, क्योंकि आलसी के साथ आलस्य की गलतता बाहरी कार्य से उत्पन्न होती है(गैर-समाप्ति अनुभाग में उदाहरण देखें, जहां == एक बाहरी बाइनरी ऑपरेटर फ़ंक्शन है)। इसका कारण यह है कि कॉपीराइट अंतिम वस्तु [ 11 ] पर अंतिम बीजगणित के साथ अंतिम रूप से अर्थात सहवर्ती प्रकार से बंधे होते हैं ।

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

गैर समाप्ति

संकलन-समय पर, ट्यूरिंग पूरी भाषा में हॉल्टिंग समस्या और पारस्परिक पुनरावृत्ति के कारण, कार्यों को आम तौर पर समाप्त करने की गारंटी नहीं दी जा सकती है।

  • उत्सुक

    साथ उत्सुक लेकिन आलसी नहीं, के संयोजन के रूप के लिए Head"और" Tail, अगर या तो Headया Tailसमाप्त नहीं करता है, तो या तो क्रमशः List( Head(), Tail() ).tail == Tail()या List( Head(), Tail() ).head == Head()क्योंकि बाएँ पक्ष नहीं है सच नहीं है, और दाईं ओर, को समाप्त करता है।

    जबकि, आलसी के साथ दोनों पक्ष समाप्त हो जाते हैं। इस प्रकार उत्सुक उन उत्पादों के साथ बहुत उत्सुक है, और उन मामलों में गैर-टर्मिनेट (रनटाइम अपवाद सहित) जहां यह आवश्यक नहीं है।

  • आलसी

    आलसी के साथ, लेकिन उत्सुक नहीं है, 1"या" के विघटन के लिए 2, यदि fसमाप्त नहीं होता है, तो List( f ? 1 : 2, 3 ).tail == (f ? List( 1, 3 ) : List( 2, 3 )).tailसच नहीं है क्योंकि बाईं ओर की समाप्ति, और दाईं ओर की नहीं है।

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

[ १० ] घोषणात्मक निरंतरता और श्रेणीबद्ध द्वंद्व, फिलिंस्की, धारा २.४.४ सीबीवी और सीबीएन की तुलना, और एससीएल में ३.६.१ सीबीवी और सीबीएन।

[ ११ ] घोषणात्मक निरंतरता और श्रेणीबद्ध द्वंद्व, फिलिंस्की, धारा २.२.१ उत्पाद और प्रतिपिंड, २.२.२ टर्मिनल और प्रारंभिक वस्तुएं, २.२.२ सीबीवी आलसी उत्पादों के साथ, और २.३.३ सीबीएन उत्सुक प्रतिपदों के साथ।


घोषणात्मक बाधा प्रोग्रामिंग के साथ भी, सॉल्वर समाधान नहीं ढूंढ रहा है, जबकि बाधाएं म्यूट नहीं होती हैं। यह स्पष्ट है क्योंकि उन्हें बदलने के लिए एक समय निर्दिष्ट करने का कोई तरीका नहीं है। समाधान खोजने के लिए सॉल्वर को चलाने से पहले भी सभी रेस्ट्रॉन्ट्स की कमी बताई गई है। यह स्प्रेडशीट में घोषणात्मक सूत्रों के अनुरूप है ।
शेल्बी मूर III 21

3
संक्षिप्तिकरण का अर्थ परिभाषा नहीं है। जहाँ मैंने लिखा है "RT को अक्सर 'नो साइड-इफ़ेक्ट्स' कहा जाता है, इसका मतलब यह नहीं है कि RT की परिभाषा" कोई साइड-इफ़ेक्ट "नहीं है, क्योंकि लोगों में 'इफ़ेक्ट्स' के लिए अलग-अलग परिभाषाएँ हो सकती हैं। अगर मैं इसके बजाय "RT अक्सर संक्षिप्त" xyz '"कहा जाता है, अर्थहीन प्रतीक RT को कोई परिभाषा नहीं देता है। RT की एक सटीक परिभाषा है जो कभी नहीं बदलती है, कोई फर्क नहीं पड़ता कि कोई प्रतीक इसे संदर्भित करने के लिए क्या उपयोग करता है।
शेल्बी मूर III

मैं अपने दावे का प्रति-उदाहरण नहीं पा रहा हूं कि हर प्रकार की डीपी आरटी है। उदाहरण के लिए, संदर्भ-संवेदी व्याकरण की शर्तों का अर्थ (अर्थात मान) व्याकरण के भीतर एक अलग समय या स्थिति में उत्परिवर्तित नहीं होता है। ऊपर मेरी बाधा प्रोग्रामिंग टिप्पणी देखें।
शेल्बी मूर III

1
राज्य मठ में आरटी के साथ ईएसपी शैली में सी की समानता , अमान्य है , क्योंकि प्रत्येक सी स्टेटमेंट वैश्विक स्थिति को म्यूट कर सकता है, जबकि राज्य के "मोनड" के अनुसार प्रत्येक संबंधित स्टेटमेंट राज्य की एक COPY (इसलिए संशोधित) उत्पन्न करता है । बाद वाला RT-- पूर्व नहीं है। मोनाडिक रचना हमेशा आरटी होती है। डीपी == आरपी डीपी के लिए एकमात्र अर्थ है जो विशेषताओं का एक असंबद्ध सेट है (गणित प्रमाण मैं सही हूं, अन्यथा डीपी अर्थहीन है)।
शेल्बी मूर III

1
काश मैं इस अतीत को पहला वाक्य समझ पाता। मैं DAX के लिए मैनुअल पढ़ रहा था जिसने संकेत दिया कि यह एक 'कार्यात्मक भाषा' है। इसका क्या मतलब है? मुझे नहीं पता कि अपना पॉप पूछें।
Nick.McD मत्स्यांगना

103

इनके लिए वास्तव में कोई भी गैर-अस्पष्ट, वस्तुनिष्ठ परिभाषा नहीं है। यहां बताया गया है कि मैं उन्हें कैसे परिभाषित करूंगा:

जरूरी - ध्यान क्या कदम कंप्यूटर कंप्यूटर होगा क्या बजाय लेना चाहिए पर है करना (उदा। सी, सी ++, जावा)।

घोषणापत्र - कंप्यूटर क्या करना चाहिए (पूर्व SQL) के बजाय क्या करना चाहिए पर ध्यान केंद्रित है।

कार्यात्मक - घोषणात्मक भाषाओं का एक सबसेट, जिसमें पुनरावृत्ति पर भारी ध्यान दिया गया है


1
कुछ बातों को ध्यान में रखें: 1) स्पष्टीकरण का उद्देश्य सभी समावेशी 2 के बजाय सरल होना है) जैसे मैंने कहा, इन भाषाओं को परिभाषित करने के कई तरीके हैं। इस प्रकार, जवाब आपके लिए गलत हो सकता है और किसी और के लिए सही हो सकता है।
जेसन बेकर

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

5
@ शेहेल्बोइमोरहाइ - मैं इस पर एरिक मीजर से सहमत हूं। वास्तव में "गैर-शुद्ध कार्यात्मक भाषा" जैसी कोई चीज नहीं है। जहाँ तक मेरा सवाल है, Ocaml, F #, और कार्यात्मक डेटा संरचनाओं के साथ समान भाषाएं हैं। लेकिन जैसा कि मैंने अपने उत्तर में कहा था, मुझे विश्वास नहीं है कि इस प्रश्न का कोई उद्देश्य, गैर-अस्पष्ट उत्तर है। चीजों को परिभाषित करने के कई तरीके हैं।
जेसन बेकर

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

21
@ शेहेलबोमेहोर - मैं यह धारणा बना रहा था कि ओपी अंग्रेजी में अपना जवाब चाहता है, नट नर्ड-एसे। अगर यह एक अमान्य धारणा थी, तो मेरी माफी।
जेसन बेकर

54

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

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

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

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

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

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

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

संक्षेप में, तब:

  • प्रोग्रामिंग की दो विरोधी शैलियों की अनिवार्यता और घोषणा है (समान नाम प्रोग्रामिंग भाषाओं के लिए उपयोग किए जाते हैं जो उन शैलियों को प्रोत्साहित करते हैं)

  • कार्यात्मक प्रोग्रामिंग प्रोग्रामिंग की एक शैली है जहाँ कार्य बहुत महत्वपूर्ण हो जाते हैं और, परिणामस्वरूप, बदलते मूल्य कम महत्वपूर्ण हो जाते हैं। मूल्यों में परिवर्तन को सीमित करने की सीमित क्षमता एक अधिक घोषित शैली को मजबूर करती है।

इसलिए "कार्यात्मक प्रोग्रामिंग" को अक्सर "घोषणात्मक" के रूप में वर्णित किया जाता है।


5
अब तक की सर्वश्रेष्ठ व्याख्या। ऐसा लगता है कि कार्यात्मक और ओओपी इम्पीरेटिव और डिक्लेरेटिव के लिए रूढ़िवादी हैं।
डिडियर ए।

क्या आप कहेंगे लॉजिक प्रोग्रामिंग डिक्लेरेटिव है? या यह स्वयं ऑर्थोगोनल है?
डिडियर ए।

51

संक्षेप में:

एक अनिवार्य भाषा निर्देशों की एक श्रृंखला को निर्दिष्ट करती है जो कंप्यूटर अनुक्रम में निष्पादित करता है (यह करें, फिर ऐसा करें)।

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

एक कार्यात्मक भाषा गणितीय / तार्किक कार्यों का एक सेट घोषित करती है जो यह परिभाषित करती है कि आउटपुट में अनुवाद कैसे किया जाता है। जैसे। f (y) = y * y। यह एक प्रकार की घोषणात्मक भाषा है।


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

23

अभिप्रेरित: कैसे हमारे लक्ष्य को प्राप्त करने के लिए

   Take the next customer from a list.
   If the customer lives in Spain, show their details.
   If there are more customers in the list, go to the beginning

घोषणा: हम क्या हासिल करना चाहते हैं

   Show customer details of every customer living in Spain

आप कार्यात्मक प्रोग्रामिंग बनाम गैर-एफपी का वर्णन कर रहे हैं, न कि घोषणात्मक बनाम अनिवार्य प्रोग्रामिंग। कार्यात्मक प्रोग्रामिंग अनिवार्य और घोषणात्मक प्रोग्रामिंग के बीच ध्रुवीयता के लिए रूढ़िवादी है। घोषणात्मक प्रोग्रामिंग में संग्रहीत मूल्यों की अपरिहार्यता की आवश्यकता होती है, अशुद्ध कार्यात्मक प्रोग्रामिंग नहीं करता है। मेरा जवाब देखिए ।
शेल्बी मूर III

22

इंपीरियल प्रोग्रामिंग का अर्थ है प्रोग्रामिंग की कोई भी शैली जहां आपके प्रोग्राम को यह निर्देश देकर संरचित किया जाता है कि कंप्यूटर द्वारा किए गए ऑपरेशन कैसे होंगे

Declarative Programming का अर्थ है प्रोग्रामिंग की कोई भी शैली जहाँ आपका प्रोग्राम समस्या या समाधान का विवरण है - लेकिन यह स्पष्ट रूप से नहीं बताता है कि कार्य कैसे किया जाएगा

कार्यात्मक प्रोग्रामिंग कार्यों और कार्यों के कार्यों का मूल्यांकन करके प्रोग्रामिंग कर रहा है ... जैसा (सख्ती से परिभाषित) कार्यात्मक प्रोग्रामिंग का मतलब साइड-इफ़ेक्ट फ्री गणितीय कार्यों को परिभाषित करके प्रोग्रामिंग करना है, इसलिए यह घोषणात्मक प्रोग्रामिंग का एक रूप है, लेकिन यह घोषणात्मक प्रोग्रामिंग का एकमात्र प्रकार नहीं है

लॉजिक प्रोग्रामिंग (उदाहरण के लिए प्रोलॉग में) घोषणात्मक प्रोग्रामिंग का दूसरा रूप है। इसमें यह तय करके कंप्यूटिंग शामिल है कि क्या कोई तार्किक कथन सही है (या क्या वह संतुष्ट हो सकता है)। कार्यक्रम आम तौर पर तथ्यों और नियमों की एक श्रृंखला है - अर्थात निर्देशों की एक श्रृंखला के बजाय एक विवरण।

शब्द का पुनर्लेखन (उदाहरण के लिए CASL) घोषणात्मक प्रोग्रामिंग का दूसरा रूप है। इसमें बीजगणितीय शब्दों का सांकेतिक परिवर्तन शामिल है। यह तर्क प्रोग्रामिंग और कार्यात्मक प्रोग्रामिंग से पूरी तरह से अलग है।


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

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

मैंने अपना उत्तर संपादित किया , और "कार्यात्मक प्रोग्रामिंग" अनुभाग के तहत, मैंने एक परिदृश्य जोड़ा जहां हम तर्क दे सकते हैं कि एफपी हमेशा शुद्ध होता है, और एफपी वास्तव में "प्रक्रियात्मक प्रोग्रामिंग" है। पहले उस व्याख्या को शामिल न करने के लिए क्षमा याचना।
शेल्बी मूर तृतीय

13

अनिवार्यता - अभिव्यक्तियों को करने के लिए क्रियाओं के क्रम का वर्णन (साहचर्य)

घोषणात्मक - अभिव्यक्तियाँ ऐसी घोषणाएँ हैं जो कार्यक्रम के व्यवहार में योगदान देती हैं (साहचर्य, वैधानिक, उदासीन, एकरस)

कार्यात्मक - भावों में केवल प्रभाव के रूप में मूल्य होता है; शब्दार्थ समतुल्य तर्क का समर्थन करते हैं


1
घोषणात्मक अभिव्यक्तियाँ कार्यक्रम के इच्छित व्यवहार में योगदान करती हैं, अनिवार्यता अभिप्रेत या अनपेक्षित में योगदान कर सकती है। यदि यह जानबूझकर शब्दार्थ है, तो घोषणापत्र को सराहनीय और उदासीन होने की आवश्यकता नहीं है। मुझे आपका संक्षिप्त सार कार्यात्मक पसंद है, इसलिए मैंने इसे उकेरा।
शेल्बी मूर III

10

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

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

परिभाषा के उद्धृत स्पष्टीकरण में भूमिकात्मक शुद्ध प्रोग्रामिंग प्रोग्रामिंग में भूमिका की घोषणा की गई है।

सभी विदेशी प्रकार की प्रोग्रामिंग घोषणात्मक बनाम अनिवार्य के निम्नलिखित वर्गीकरण में फिट होती है, क्योंकि निम्नलिखित परिभाषा का दावा है कि वे दोहरे हैं।

घोषणात्मक बनाम इंपेरेटिव

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

यह ओवरसाइम्प्लिफिकेशन है, तकनीकी रूप से असाध्य है, और अक्सर " क्या करना है " और " कैसे करना है " के रूप में जरूरी के रूप में घोषणात्मक को परिभाषित करने के लिए अस्पष्ट है । एक अस्पष्ट मामला " क्या " प्रोग्राम में " कैसे " है जो एक प्रोग्राम को संकलित करता है- एक संकलक।

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

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

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

परिभाषा:


घोषणात्मक संपत्ति वह है जहां बयानों का केवल एक ही संभव सेट मौजूद हो सकता है जो प्रत्येक विशिष्ट मॉड्यूलर अर्थ को व्यक्त कर सकता है।

अनिवार्य संपत्ति 3 दोहरी है, जहां शब्दार्थ रचना के तहत असंगत हैं और / या बयानों के सेट के रूपांतरों के साथ व्यक्त किए जा सकते हैं।


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

इन मॉड्यूलर घोषणात्मक शब्दार्थों के उदाहरणों में श्रेणी सिद्धांत रूपांतरक शामिल हैं। उदाहरण के लिएApplicative , नाममात्र टाइपिंग, नामस्थान, फ़ील्ड्स, और शब्दार्थ के परिचालन स्तर के लिए wrt तब शुद्ध कार्यात्मक प्रोग्रामिंग।

इस प्रकार अच्छी तरह से डिजाइन की गई घोषणात्मक भाषाएँ अधिक स्पष्ट रूप से अर्थ व्यक्त कर सकती हैं, जो कि व्यक्त की जा सकने वाली व्यापकता के कुछ नुकसान के साथ हो सकती है, फिर भी आंतरिक स्थिरता के साथ जो व्यक्त किया जा सकता है उसमें एक लाभ।

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

हाइपर टेक्स्ट मार्कअप लैंग्वेज उर्फ ​​एचटीएमएल- स्टेटिक वेब पेजों के लिए भाषा- एक उच्च (लेकिन पूरी तरह से 3 नहीं ) घोषणात्मक भाषा का एक उदाहरण है (कम से कम एचटीएमएल 5 से पहले) गतिशील व्यवहार को व्यक्त करने की कोई क्षमता नहीं थी। HTML शायद सबसे आसान भाषा है। गतिशील व्यवहार के लिए, जावास्क्रिप्ट जैसी एक अनिवार्य स्क्रिप्टिंग भाषा को आमतौर पर HTML के साथ जोड़ा गया था। जावास्क्रिप्ट के बिना HTML घोषणात्मक परिभाषा को फिट करता है क्योंकि प्रत्येक नाममात्र प्रकार (यानी टैग) वाक्य रचना के नियमों के भीतर रचना के तहत अपने सुसंगत अर्थ को बनाए रखता है।

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

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

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


2 यहां तक ​​कि जहां हम किसी प्रोग्राम के शब्दार्थ को साबित कर सकते हैं, जैसे कि भाषा कोक के साथ, यह शब्दार्थ में सीमित है जो टाइपिंग में व्यक्त किए गए हैं , और टाइपिंग कभी भी प्रोग्राम के सभी शब्दार्थों पर कब्जा नहीं कर सकता है - जो भाषाओं के लिए भी नहीं हैं पूर्ण रूप से ट्यूरिंग नहीं, उदाहरण के लिए HTML + CSS के साथ असंगत संयोजनों को व्यक्त करना संभव है जो इस प्रकार अपरिभाषित शब्दार्थ हैं।

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


संपादित करें: मैंने रॉबर्ट हार्पर के ब्लॉग पर निम्नलिखित टिप्पणी पोस्ट की :

कार्यात्मक प्रोग्रामिंग में ... एक चर की भिन्नता की सीमा एक प्रकार है

इस बात पर निर्भर करता है कि कोई व्यक्ति कैसे कार्यात्मक प्रोग्रामिंग से अलग होता है, एक अनिवार्य कार्यक्रम में आपके 'असाइन करने योग्य' का प्रकार उसकी परिवर्तनशीलता पर एक बाध्यता भी हो सकता है।

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

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

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

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

इस प्रकार मैंने यह निष्कर्ष निकाला है कि केवल गैर-ट्यूरिंग पूर्ण भाषाएं घोषणात्मक हो सकती हैं।

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

तो यह मुझे प्रतीत होता है कि घोषणात्मक भाषाएँ अनबिके पुनरावृत्ति का प्रतिपादक हैं , अर्थात गोडेल की दूसरी अपूर्णता प्रमेय आत्म-संदर्भित प्रमेयों को सिद्ध नहीं किया जा सकता है।

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


रॉबर्ट हार्पर घोषणा की अधिकांश परिभाषाओं की व्यर्थता के बारे में मुझसे सहमत प्रतीत होता है , फिर भी मुझे नहीं लगता कि उसने ऊपर मेरा देखा है। वह मेरी परिभाषा के करीब जाता है, जहां वह शब्दार्थ शब्दार्थ पर चर्चा करता है, फिर भी वह मेरी परिभाषा में नहीं आता है। मॉडल (denotational अर्थ विज्ञान) उच्च स्तर की है
शेल्बी मूर तृतीय

7

इम्पीरेटिव प्रोग्रामिंग: "मशीन" को यह बताना कि कुछ कैसे करना है, और परिणामस्वरूप आप जो होना चाहते हैं वह होगा।

घोषणात्मक प्रोग्रामिंग: "मशीन" को बताना कि आप क्या करना चाहते हैं, और कंप्यूटर को यह बताने का तरीका दें कि यह कैसे करना है।

अनिवार्यता का उदाहरण

function makeWidget(options) {
    const element = document.createElement('div');
    element.style.backgroundColor = options.bgColor;
    element.style.width = options.width;
    element.style.height = options.height;
    element.textContent = options.txt;

    return element;
}

घोषणात्मक का उदाहरण

function makeWidget(type, txt) {
    return new Element(type, txt);
}

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


2
यदि आप दोनों के लिए कम से कम एक उदाहरण प्रदान करते हैं तो अच्छा है लेकिन बेहतर है!
परदीप जैन

4

आजकल, नया ध्यान: हमें पुराने वर्गीकरणों की आवश्यकता है?

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

तो इस सवाल का एक अच्छा संस्करण है "आज फ्रेमवर्क को वर्गीकृत करने के लिए क्या पहलू अच्छा है?" ... एक महत्वपूर्ण पहलू यह है कि हम "प्रोग्रामिंग शैली" लेबल कर सकते हैं ...

एल्गोरिथ्म के साथ डेटा के संलयन पर ध्यान दें

एक अच्छा उदाहरण समझाने के लिए। जैसा कि आप विकिपीडिया पर jQuery के बारे में पढ़ सकते हैं ,

JQuery की मुख्य विशेषताओं का सेट - DOM एलिमेंट सिलेक्शन, ट्रैवर्सल और मैनिपुलेशन -, इसके सिलेक्टर इंजन (...) द्वारा सक्षम, एक नया "प्रोग्रामिंग स्टाइल" बनाया, एल्गोरिथम और DOM-डेटा-स्ट्रक्चर्स

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

  1. कोई संलयन नहीं : सभी "बड़ी भाषाओं" में, किसी भी कार्यात्मक / घोषणा / अभिव्यक्ति की अभिव्यक्ति में, सामान्य रूप से डेटा और एल्गोरिथ्म का "कोई संलयन" नहीं होता है, केवल कुछ ऑब्जेक्ट-ओरिएंटेशन को छोड़कर, जो कि सख्त बीजगणितीय संरचना बिंदु पर एक संलयन है ।

  2. कुछ संलयन : संलयन की सभी क्लासिक रणनीतियाँ, आजकल कुछ प्रतिमानों में इसका उपयोग प्रतिमान के रूप में किया जाता है ... डेटाफ्लो , इवेंट-संचालित प्रोग्रामिंग (या पुराने डोमेन विशिष्ट भाषाओं जैसे कि awk और XSLT ) ... आधुनिक स्प्रेडशीट के साथ प्रोग्रामिंग की तरह, वे भी हैं प्रतिक्रियाशील प्रोग्रामिंग शैली के उदाहरण ।

  3. बड़ा संलयन : "jQuery की शैली" है ... jQuery एक डोमेन विशिष्ट भाषा है जो " फ़्यूज़िंग एल्गोरिदम और DOM-डेटा-स्ट्रक्चर्स " पर केंद्रित है ।
    पुनश्च: अन्य "क्वेरी भाषाएँ", XQuery के रूप में, SQL (PL के साथ अनिवार्य अभिव्यक्ति विकल्प) भी डेटा-एल्गोरिथ्म-संलयन उदाहरण हैं, लेकिन वे द्वीप हैं , अन्य सिस्टम मॉड्यूल के साथ कोई संलयन नहीं ... वसंत- का उपयोग करते find()समय और विशिष्टता खंड, एक और अच्छा संलयन उदाहरण है।


3

घोषणात्मक प्रोग्रामिंग इनपुट और आउटपुट के बीच कुछ कालातीत तर्क व्यक्त करके प्रोग्रामिंग कर रहा है, उदाहरण के लिए, छद्मकोड में, निम्न उदाहरण घोषणात्मक होगा:

def factorial(n):
  if n < 2:
    return 1
  else:
    return factorial(n-1)

output = factorial(argvec[0])

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

एक अनिवार्य शैली में एक ही परिणाम होगा:

a = 1
b = argvec[0]
while(b < 2):
  a * b--

output = a

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

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

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


आपने कार्यात्मक प्रोग्रामिंग को परिभाषित नहीं किया है। आपने गलत तरीके से निहित है, "कुछ 'विशुद्ध रूप से' घोषणात्मक भाषा", कि घोषणात्मक प्रोग्रामिंग अशुद्ध हो सकती है । घोषणात्मक प्रोग्रामिंग में संग्रहीत मूल्यों की अपरिहार्यता की आवश्यकता होती है, अनिवार्य प्रोग्रामिंग नहीं होती है। मेरा जवाब देखिए । अपरिवर्तनीयता "कालातीत" गुणवत्ता है - देखें कि आपका घोषणापत्र factorialकिसी भी मूल्य को परिवर्तित नहीं करता है।
शेल्बी मूर III 7

3

विख्यात "प्रकार" के बारे में यहाँ कुछ अच्छे उत्तर हैं।

मैं कुछ अतिरिक्त, अधिक "विदेशी" अवधारणाओं को प्रस्तुत करता हूं जो अक्सर कार्यात्मक प्रोग्रामिंग भीड़ से जुड़ी होती हैं:

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

3

मुझे लगता है कि आपकी टैक्सोनोमी गलत है। दो विपरीत प्रकार के अनिवार्य और घोषणात्मक हैं। कार्यात्मक केवल घोषणात्मक का एक उपप्रकार है। BTW, विकिपीडिया एक ही तथ्य बताता है।


+1: हां, प्रतिमान सेब और संतरे हैं।
निखिल चेलिया

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

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

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

2

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


मेरी टिप्पणियों को अन्य उत्तरों के नीचे देखें। एफपी हमेशा घोषणात्मक नहीं होता है। IP बनाम DP के लिए गलत टैक्सोनॉमी क्या है बनाम, क्योंकि DP और IP दोनों में तर्क है कि क्या और कैसे शामिल है।
शेल्बी मूर तृतीय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.