कार्यात्मक, घोषणात्मक और अनिवार्य प्रोग्रामिंग शब्द क्या हैं?
कार्यात्मक, घोषणात्मक और अनिवार्य प्रोग्रामिंग शब्द क्या हैं?
जवाबों:
इसे लिखने के समय, इस पृष्ठ पर शीर्ष वोट किए गए उत्तर विकिपीडिया को उद्धृत करने वाले उत्तर सहित, घोषणात्मक बनाम अनिवार्य परिभाषा पर गलत और अस्पष्ट हैं। कुछ उत्तर अलग-अलग तरीकों से शब्दों को स्वीकार कर रहे हैं।
स्प्रैडशीट प्रोग्रामिंग डिक्लेरेटिव क्यों है, इस बात की भी मेरी व्याख्या देखें कि फ़ार्मुलों कोशिकाओं को म्यूट करते हैं या नहीं।
इसके अलावा, कई उत्तर दावा करते हैं कि कार्यात्मक प्रोग्रामिंग को घोषणापत्र का सबसेट होना चाहिए। उस बिंदु पर यह निर्भर करता है कि क्या हम "कार्यविधि" से "फ़ंक्शन" को अलग करते हैं। पहले अनिवार्य बनाम घोषणात्मक को संभालने देता है।
घोषणात्मक अभिव्यक्ति की परिभाषा
केवल विशेषता है कि संभवतः एक अंतर कर सकते हैं कथात्मक एक से अभिव्यक्ति अनिवार्य अभिव्यक्ति इसके उप-भाव के संदर्भ पारदर्शिता (आरटी) है। अन्य सभी विशेषताओं को या तो दोनों प्रकार के अभिव्यक्तियों के बीच साझा किया जाता है, या आरटी से प्राप्त किया जाता है।
एक 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
सच नहीं है क्योंकि बाईं ओर की समाप्ति, और दाईं ओर की नहीं है।
जबकि, उत्सुक न तो पक्ष समाप्त हो जाता है, इसलिए समानता परीक्षण कभी नहीं पहुंचता है। इस प्रकार आलसी, असंतुष्ट कॉपोड्रेट्स के साथ बहुत आलसी होता है, और उन मामलों में उत्सुकता से अधिक काम करने के बाद (रनटाइम अपवाद सहित) समाप्त करने में विफल रहता है।
[ १० ] घोषणात्मक निरंतरता और श्रेणीबद्ध द्वंद्व, फिलिंस्की, धारा २.४.४ सीबीवी और सीबीएन की तुलना, और एससीएल में ३.६.१ सीबीवी और सीबीएन।
[ ११ ] घोषणात्मक निरंतरता और श्रेणीबद्ध द्वंद्व, फिलिंस्की, धारा २.२.१ उत्पाद और प्रतिपिंड, २.२.२ टर्मिनल और प्रारंभिक वस्तुएं, २.२.२ सीबीवी आलसी उत्पादों के साथ, और २.३.३ सीबीएन उत्सुक प्रतिपदों के साथ।
इनके लिए वास्तव में कोई भी गैर-अस्पष्ट, वस्तुनिष्ठ परिभाषा नहीं है। यहां बताया गया है कि मैं उन्हें कैसे परिभाषित करूंगा:
जरूरी - ध्यान क्या कदम कंप्यूटर कंप्यूटर होगा क्या बजाय लेना चाहिए पर है करना (उदा। सी, सी ++, जावा)।
घोषणापत्र - कंप्यूटर क्या करना चाहिए (पूर्व SQL) के बजाय क्या करना चाहिए पर ध्यान केंद्रित है।
कार्यात्मक - घोषणात्मक भाषाओं का एक सबसेट, जिसमें पुनरावृत्ति पर भारी ध्यान दिया गया है
अनिवार्य और घोषणात्मक प्रोग्रामिंग की दो विरोधी शैलियों का वर्णन करते हैं। अनिवार्य पारंपरिक "स्टेप बाय स्टेप रेसिपी" दृष्टिकोण है जबकि घोषणात्मक अधिक है "यह वही है जो मैं चाहता हूं, अब आप वर्कआउट कैसे करें"।
ये दो दृष्टिकोण पूरे प्रोग्रामिंग में होते हैं - एक ही भाषा और एक ही कार्यक्रम के साथ भी। आम तौर पर घोषणात्मक दृष्टिकोण को बेहतर माना जाता है, क्योंकि यह प्रोग्रामर को इतने सारे विवरण निर्दिष्ट करने से मुक्त करता है, जबकि बग के लिए कम मौका भी होता है (यदि आप चाहते हैं कि परिणाम का वर्णन करें, और कुछ अच्छी तरह से परीक्षण की गई स्वचालित प्रक्रिया उस से पीछे की ओर काम कर सकती है। फिर चरणों को परिभाषित करें आप उम्मीद कर सकते हैं कि चीजें हाथ से प्रत्येक चरण को निर्दिष्ट करने की तुलना में अधिक विश्वसनीय हैं)।
दूसरी ओर, एक अनिवार्यता आपको निम्न स्तर का नियंत्रण प्रदान करती है - यह प्रोग्रामिंग के लिए "माइक्रोमानेर दृष्टिकोण" है। और जो प्रोग्रामर को अधिक कुशल उत्तर देने के लिए समस्या के बारे में ज्ञान का दोहन करने की अनुमति दे सकता है। इसलिए यह किसी कार्यक्रम के कुछ हिस्सों के लिए अधिक घोषणात्मक शैली में लिखा जाना असामान्य नहीं है, लेकिन गति-महत्वपूर्ण भागों के लिए अधिक आवश्यक होना चाहिए।
जैसा कि आप कल्पना कर सकते हैं, एक प्रोग्राम लिखने के लिए आप जिस भाषा का उपयोग करते हैं, वह यह बताती है कि आप कितने घोषणापत्र को प्रभावित कर सकते हैं - एक ऐसी भाषा जिसमें निर्मित "स्मार्ट" में काम करने के लिए परिणाम का विवरण दिया गया हो, और अधिक घोषित करने की अनुमति देने वाला है एक से अधिक दृष्टिकोण जहां प्रोग्रामर को सबसे पहले उस तरह की बुद्धिमत्ता को जोड़ने की जरूरत है, जो शीर्ष पर एक अधिक घोषणात्मक परत बनाने में सक्षम होने से पहले आवश्यक है। इसलिए, उदाहरण के लिए, प्रोलॉग जैसी भाषा को बहुत ही घोषणात्मक माना जाता है क्योंकि इसके पास, अंतर्निहित, एक प्रक्रिया है जो उत्तर खोजती है।
अब तक, आप देखेंगे कि मैंने कार्यात्मक प्रोग्रामिंग का उल्लेख नहीं किया है। ऐसा इसलिए है क्योंकि यह एक शब्द है जिसका अर्थ तुरंत अन्य दो से संबंधित नहीं है। इसकी सबसे सरल, कार्यात्मक प्रोग्रामिंग का मतलब है कि आप कार्यों का उपयोग करते हैं। विशेष रूप से, आप "प्रथम श्रेणी मान" के रूप में फ़ंक्शंस का समर्थन करने वाली भाषा का उपयोग करते हैं - इसका मतलब है कि आप न केवल फ़ंक्शंस लिख सकते हैं, बल्कि फ़ंक्शंस लिखने वाले फ़ंक्शंस भी लिख सकते हैं (जो फ़ंक्शंस लिखते हैं ...), और फ़ंक्शंस पास करने के लिए कार्य करता है। संक्षेप में - यह कार्य उतने ही लचीले और सामान्य हैं जितने कि तार और संख्या जैसी चीजें।
यह अजीब लग सकता है, फिर, यह कार्यात्मक, अनिवार्य और घोषणात्मक अक्सर एक साथ उल्लेख किया गया है। इसका कारण कार्यात्मक प्रोग्रामिंग के विचार को "चरम" पर ले जाने का परिणाम है। एक फ़ंक्शन, यह सबसे शुद्ध अर्थ में है, गणित से कुछ है - एक प्रकार का "ब्लैक बॉक्स" जो कुछ इनपुट लेता है और हमेशा एक ही आउटपुट देता है। और उस तरह के व्यवहार को बदलते चर को संग्रहीत करने की आवश्यकता नहीं होती है। इसलिए यदि आप एक प्रोग्रामिंग भाषा डिज़ाइन करते हैं जिसका उद्देश्य कार्यात्मक प्रोग्रामिंग के एक बहुत ही शुद्ध, गणितीय रूप से प्रभावित विचार को लागू करना है, तो आप अस्वीकार कर देते हैं, मोटे तौर पर, उन मूल्यों का विचार बदल सकता है (एक निश्चित, सीमित, तकनीकी अर्थ में)।
और अगर आप ऐसा करते हैं - यदि आप सीमित करते हैं कि चर कैसे बदल सकते हैं - तो दुर्घटना से लगभग आप प्रोग्रामर को मजबूर कर देते हैं कि वे ऐसे प्रोग्राम लिख सकें, जो अधिक घोषणात्मक हैं, क्योंकि अनिवार्यता प्रोग्रामिंग का एक बड़ा हिस्सा यह वर्णन कर रहा है कि चर कैसे बदलते हैं, और आप अब नहीं रह सकते हैं वो करें! इसलिए यह पता चलता है कि कार्यात्मक प्रोग्रामिंग - विशेष रूप से, एक कार्यात्मक भाषा में प्रोग्रामिंग - अधिक घोषणात्मक कोड देने के लिए जाता है।
संक्षेप में, तब:
प्रोग्रामिंग की दो विरोधी शैलियों की अनिवार्यता और घोषणा है (समान नाम प्रोग्रामिंग भाषाओं के लिए उपयोग किए जाते हैं जो उन शैलियों को प्रोत्साहित करते हैं)
कार्यात्मक प्रोग्रामिंग प्रोग्रामिंग की एक शैली है जहाँ कार्य बहुत महत्वपूर्ण हो जाते हैं और, परिणामस्वरूप, बदलते मूल्य कम महत्वपूर्ण हो जाते हैं। मूल्यों में परिवर्तन को सीमित करने की सीमित क्षमता एक अधिक घोषित शैली को मजबूर करती है।
इसलिए "कार्यात्मक प्रोग्रामिंग" को अक्सर "घोषणात्मक" के रूप में वर्णित किया जाता है।
संक्षेप में:
एक अनिवार्य भाषा निर्देशों की एक श्रृंखला को निर्दिष्ट करती है जो कंप्यूटर अनुक्रम में निष्पादित करता है (यह करें, फिर ऐसा करें)।
एक घोषणात्मक भाषा नियमों का एक सेट घोषित करती है कि आउटपुट किस इनपुट से उत्पन्न होने चाहिए (उदाहरण के लिए यदि आपके पास ए है, तो परिणाम बी है)। एक इंजन इन नियमों को इनपुट पर लागू करेगा, और एक आउटपुट देगा।
एक कार्यात्मक भाषा गणितीय / तार्किक कार्यों का एक सेट घोषित करती है जो यह परिभाषित करती है कि आउटपुट में अनुवाद कैसे किया जाता है। जैसे। f (y) = y * y। यह एक प्रकार की घोषणात्मक भाषा है।
अभिप्रेरित: कैसे हमारे लक्ष्य को प्राप्त करने के लिए
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
इंपीरियल प्रोग्रामिंग का अर्थ है प्रोग्रामिंग की कोई भी शैली जहां आपके प्रोग्राम को यह निर्देश देकर संरचित किया जाता है कि कंप्यूटर द्वारा किए गए ऑपरेशन कैसे होंगे ।
Declarative Programming का अर्थ है प्रोग्रामिंग की कोई भी शैली जहाँ आपका प्रोग्राम समस्या या समाधान का विवरण है - लेकिन यह स्पष्ट रूप से नहीं बताता है कि कार्य कैसे किया जाएगा ।
कार्यात्मक प्रोग्रामिंग कार्यों और कार्यों के कार्यों का मूल्यांकन करके प्रोग्रामिंग कर रहा है ... जैसा (सख्ती से परिभाषित) कार्यात्मक प्रोग्रामिंग का मतलब साइड-इफ़ेक्ट फ्री गणितीय कार्यों को परिभाषित करके प्रोग्रामिंग करना है, इसलिए यह घोषणात्मक प्रोग्रामिंग का एक रूप है, लेकिन यह घोषणात्मक प्रोग्रामिंग का एकमात्र प्रकार नहीं है ।
लॉजिक प्रोग्रामिंग (उदाहरण के लिए प्रोलॉग में) घोषणात्मक प्रोग्रामिंग का दूसरा रूप है। इसमें यह तय करके कंप्यूटिंग शामिल है कि क्या कोई तार्किक कथन सही है (या क्या वह संतुष्ट हो सकता है)। कार्यक्रम आम तौर पर तथ्यों और नियमों की एक श्रृंखला है - अर्थात निर्देशों की एक श्रृंखला के बजाय एक विवरण।
शब्द का पुनर्लेखन (उदाहरण के लिए CASL) घोषणात्मक प्रोग्रामिंग का दूसरा रूप है। इसमें बीजगणितीय शब्दों का सांकेतिक परिवर्तन शामिल है। यह तर्क प्रोग्रामिंग और कार्यात्मक प्रोग्रामिंग से पूरी तरह से अलग है।
अनिवार्यता - अभिव्यक्तियों को करने के लिए क्रियाओं के क्रम का वर्णन (साहचर्य)
घोषणात्मक - अभिव्यक्तियाँ ऐसी घोषणाएँ हैं जो कार्यक्रम के व्यवहार में योगदान देती हैं (साहचर्य, वैधानिक, उदासीन, एकरस)
कार्यात्मक - भावों में केवल प्रभाव के रूप में मूल्य होता है; शब्दार्थ समतुल्य तर्क का समर्थन करते हैं
जब से मैंने अपना पूर्व उत्तर लिखा है, मैंने घोषणा की गई संपत्ति की एक नई परिभाषा तैयार की है जो नीचे उद्धृत की गई है। मैंने भी अनिवार्य प्रोग्रामिंग को दोहरी संपत्ति के रूप में परिभाषित किया है।
यह परिभाषा उस व्यक्ति से बेहतर है जिसे मैंने अपने पूर्व उत्तर में प्रदान किया है, क्योंकि यह संक्षिप्त है और यह अधिक सामान्य है। लेकिन इसे टटोलना अधिक कठिन हो सकता है, क्योंकि प्रोग्रामिंग और जीवन में सामान्य रूप से लागू अपूर्णता प्रमेयों का निहितार्थ मनुष्य के लिए अपने मन को लपेटना मुश्किल है।
परिभाषा के उद्धृत स्पष्टीकरण में भूमिकात्मक शुद्ध प्रोग्रामिंग प्रोग्रामिंग में भूमिका की घोषणा की गई है।
सभी विदेशी प्रकार की प्रोग्रामिंग घोषणात्मक बनाम अनिवार्य के निम्नलिखित वर्गीकरण में फिट होती है, क्योंकि निम्नलिखित परिभाषा का दावा है कि वे दोहरे हैं।
घोषणात्मक बनाम इंपेरेटिव
घोषणात्मक संपत्ति अजीब, अप्रिय, और तकनीकी रूप से सटीक परिभाषा में कैप्चर करने के लिए मुश्किल है जो सामान्य बनी हुई है और अस्पष्ट नहीं है, क्योंकि यह एक भोली धारणा है कि हम बिना अनपेक्षित दुष्प्रभावों के कार्यक्रम के अर्थ (उर्फ शब्दार्थ) की घोषणा कर सकते हैं। अर्थ की अभिव्यक्ति और अनपेक्षित प्रभावों से बचने के बीच एक अंतर्निहित तनाव है, और यह तनाव वास्तव में प्रोग्रामिंग और हमारे ब्रह्मांड के अधूरे सिद्धांत से निकलता है।
यह ओवरसाइम्प्लिफिकेशन है, तकनीकी रूप से असाध्य है, और अक्सर " क्या करना है " और " कैसे करना है " के रूप में जरूरी के रूप में घोषणात्मक को परिभाषित करने के लिए अस्पष्ट है । एक अस्पष्ट मामला " क्या " प्रोग्राम में " कैसे " है जो एक प्रोग्राम को संकलित करता है- एक संकलक।
जाहिर तौर पर अनबाउंड रिक्वायरमेंट जो किसी भाषा को ट्यूरिंग को पूर्ण बनाती है , वह भी शब्दार्थ में समान रूप से है - न केवल मूल्यांकन की वाक्य रचना में (उर्फ ऑपरेशनल शब्दार्थ)। यह तार्किक रूप से गोदेल की प्रमेय के अनुरूप एक उदाहरण है- " स्वयंसिद्ध कोई भी पूर्ण प्रणाली भी असंगत है "। उस बोली के विरोधाभासी अजीबता को टटोलें! यह एक उदाहरण भी है जो दर्शाता है कि शब्दार्थ की अभिव्यक्ति के लिए एक योग्य बाध्य नहीं है, इस प्रकार हम 2 को साबित नहीं कर सकते हैं कि एक कार्यक्रम (और इसके मूल रूप से) ने उर्फ हॉल्टिंग प्रमेय को रोक दिया।
अधूरापन प्रमेय हमारे ब्रह्मांड की मूल प्रकृति से प्राप्त होता है, जो कि थर्मोडायनामिक्स के दूसरे नियम में कहा गया है, " एन्ट्रापी (उर्फ स्वतंत्र संभावनाओं का #) अधिकतम हमेशा के लिए ट्रेंड कर रहा है "। किसी प्रोग्राम का कोडिंग और डिज़ाइन कभी भी समाप्त नहीं होता है - यह जीवित है! - क्योंकि यह एक वास्तविक दुनिया की जरूरत को संबोधित करने का प्रयास करता है, और वास्तविक दुनिया के शब्दार्थ हमेशा बदल रहे हैं और अधिक संभावनाओं के लिए रुझान हैं। मनुष्य कभी भी नई चीजों की खोज करना बंद नहीं करता (कार्यक्रमों में त्रुटियों सहित ;-)
सटीक और तकनीकी रूप से इस विचित्र ब्रह्मांड के भीतर इस कथित वांछित धारणा को पकड़ने के लिए जिसमें कोई किनारा नहीं है (विचार है कि! हमारे ब्रह्मांड का कोई "बाहर" नहीं है), एक स्पष्ट, लेकिन भ्रामक-सरल-सरल परिभाषा की आवश्यकता है जो तब तक ध्वनि करेगा जब तक इसे समझाया नहीं जाता। गहरा।
परिभाषा:
घोषणात्मक संपत्ति वह है जहां बयानों का केवल एक ही संभव सेट मौजूद हो सकता है जो प्रत्येक विशिष्ट मॉड्यूलर अर्थ को व्यक्त कर सकता है।
अनिवार्य संपत्ति 3 दोहरी है, जहां शब्दार्थ रचना के तहत असंगत हैं और / या बयानों के सेट के रूपांतरों के साथ व्यक्त किए जा सकते हैं।
घोषणात्मक की यह परिभाषा अर्थिक दायरे में विशिष्ट रूप से स्थानीय है, जिसका अर्थ है कि यह आवश्यक है कि एक मॉड्यूलर शब्दार्थ अपने सुसंगत अर्थ को बनाए रखे, भले ही यह कहाँ और कैसे वैश्विक स्तर पर त्वरित और नियोजित हो । इस प्रकार प्रत्येक घोषणात्मक मॉड्यूलर सिमेंटिक सभी संभव दूसरों के लिए आंतरिक रूप से ऑर्थोगोनल होना चाहिए- और एक असंभव (अपूर्णता प्रमेयों के कारण) वैश्विक एल्गोरिथ्म या निरंतरता देखने के लिए मॉडल, जो कि रॉबर्ट हार्पर, प्रोफेसर द्वारा " अधिक हमेशा बेहतर नहीं " का बिंदु है। कंप्यूटर विज्ञान में कार्नेगी मेलन विश्वविद्यालय, मानक एमएल के डिजाइनरों में से एक।
इन मॉड्यूलर घोषणात्मक शब्दार्थों के उदाहरणों में श्रेणी सिद्धांत रूपांतरक शामिल हैं। उदाहरण के लिए
Applicative
, नाममात्र टाइपिंग, नामस्थान, फ़ील्ड्स, और शब्दार्थ के परिचालन स्तर के लिए wrt तब शुद्ध कार्यात्मक प्रोग्रामिंग।इस प्रकार अच्छी तरह से डिजाइन की गई घोषणात्मक भाषाएँ अधिक स्पष्ट रूप से अर्थ व्यक्त कर सकती हैं, जो कि व्यक्त की जा सकने वाली व्यापकता के कुछ नुकसान के साथ हो सकती है, फिर भी आंतरिक स्थिरता के साथ जो व्यक्त किया जा सकता है उसमें एक लाभ।
उपर्युक्त परिभाषा का एक उदाहरण एक स्प्रेडशीट प्रोग्राम की कोशिकाओं में सूत्र का सेट है- जो अलग कॉलम और पंक्ति कोशिकाओं में स्थानांतरित होने पर समान अर्थ देने की उम्मीद नहीं है, अर्थात सेल पहचानकर्ता बदल गए। सेल आइडेंटिफ़ायर का एक हिस्सा है और न कि इच्छित अर्थ के लिए अतिशयोक्ति है। इसलिए प्रत्येक स्प्रेडशीट परिणाम सूत्र के एक सेट में सेल पहचानकर्ताओं के लिए अद्वितीय wrt है। इस मामले में लगातार मॉड्यूलर सिमेंटिक सेल फॉर्मूलर्स का उपयोग सेल फ़ार्मुलों के लिए शुद्ध कार्यों के इनपुट और आउटपुट के रूप में होता है (नीचे देखें)।
हाइपर टेक्स्ट मार्कअप लैंग्वेज उर्फ एचटीएमएल- स्टेटिक वेब पेजों के लिए भाषा- एक उच्च (लेकिन पूरी तरह से 3 नहीं ) घोषणात्मक भाषा का एक उदाहरण है (कम से कम एचटीएमएल 5 से पहले) गतिशील व्यवहार को व्यक्त करने की कोई क्षमता नहीं थी। HTML शायद सबसे आसान भाषा है। गतिशील व्यवहार के लिए, जावास्क्रिप्ट जैसी एक अनिवार्य स्क्रिप्टिंग भाषा को आमतौर पर HTML के साथ जोड़ा गया था। जावास्क्रिप्ट के बिना HTML घोषणात्मक परिभाषा को फिट करता है क्योंकि प्रत्येक नाममात्र प्रकार (यानी टैग) वाक्य रचना के नियमों के भीतर रचना के तहत अपने सुसंगत अर्थ को बनाए रखता है।
घोषणात्मक के लिए एक प्रतिस्पर्धात्मक परिभाषा अर्थपूर्ण बयानों के कम्यूटेटिव और बेमिसाल गुण हैं, अर्थात उन बयानों को फिर से दोहराया जा सकता है और अर्थ को बदले बिना दोहराया जा सकता है। उदाहरण के लिए, नाम दिए गए फ़ील्ड में मान निर्दिष्ट करने वाले कथन को प्रोग्राम के अर्थ को बदले बिना दोहराया और दोहराया जा सकता है, यदि वे नाम किसी भी निहित क्रम में मॉड्यूलर wrt हैं। नाम कभी-कभी एक आदेश देते हैं, उदाहरण के लिए सेल पहचानकर्ताओं में उनके कॉलम और पंक्ति की स्थिति शामिल होती है- स्प्रेडशीट पर कुल मिलाकर इसका अर्थ बदल जाता है। अन्यथा, इन गुणों को स्पष्ट रूप से वैश्विक की आवश्यकता होती हैशब्दार्थ की संगति। आमतौर पर बयानों के शब्दार्थ को डिजाइन करना असंभव होता है, इसलिए यदि वे यादृच्छिक रूप से आदेशित या दोहराए जाते हैं तो वे सुसंगत रहते हैं, क्योंकि क्रम और दोहराव शब्दार्थ के लिए आंतरिक होते हैं। उदाहरण के लिए, "फू मौजूद है" (या निर्माण) और "फू मौजूद नहीं है" (और विनाश)। यदि कोई अभीष्ट शब्दार्थ के यादृच्छिक असंगतता को मानता है, तो कोई इस परिभाषा को सामान्य घोषित संपत्ति के लिए पर्याप्त मानता है। संक्षेप में यह परिभाषा एक सामान्यीकृत परिभाषा के रूप में खाली है क्योंकि यह अर्थविज्ञान के लिए स्थिरता ऑर्थोगोनल बनाने का प्रयास करती है, अर्थात इस तथ्य को टालने के लिए कि शब्दार्थ का ब्रह्मांड गतिशील रूप से अप्राप्य है और इसे वैश्विक सुसंगत प्रतिमान में कैद नहीं किया जा सकता है ।
निचले स्तर के परिचालन शब्दार्थों के (संरचनात्मक मूल्यांकन आदेश) के लिए कम्यूटेटिव और बेमिसाल गुणों की आवश्यकता होती है, जो क्रियात्मक अर्थों को एक घोषित स्थानीयकृत मॉड्यूलर अर्थ में परिवर्तित करता है , जैसे शुद्ध कार्यात्मक प्रोग्रामिंग (अनिवार्य छोरों के बजाय पुनरावृत्ति सहित)। तब कार्यान्वयन विवरणों का परिचालन क्रम उच्च स्तर के शब्दार्थों की संगति (अर्थात विश्व स्तर पर फैलता है) को प्रभावित नहीं करता है । उदाहरण के लिए, स्प्रेडशीट फ़ार्मुलों के (और सैद्धांतिक रूप से भी दोहराव) के मूल्यांकन का क्रम मायने नहीं रखता है क्योंकि आउटपुट को इनपुटों की प्रतिलिपि नहीं दी जाती है जब तक कि सभी आउटपुट की गणना नहीं की जाती है, अर्थात शुद्ध कार्यों के अनुरूप।
सी, जावा, सी ++, सी #, पीएचपी और जावास्क्रिप्ट विशेष रूप से घोषणात्मक नहीं हैं। कॉप्यूट के सिंटैक्स और पाइथन के सिंटैक्स को घोषित परिणामों के मुकाबले अधिक घोषित किया जाता है , अर्थात सुसंगत सिंटेक्टिक शब्दार्थ जो विलुप्त को खत्म करते हैं इसलिए एक कोड को आसानी से समझने के बाद वे इसे भूल सकते हैं। कॉप्यूट और हास्केल परिचालन शब्दार्थों के निर्धारण को लागू करते हैं और " खुद को दोहराएं नहीं " (डीआरवाई) को प्रोत्साहित करते हैं , क्योंकि वे केवल शुद्ध कार्यात्मक प्रतिमान की अनुमति देते हैं।
2 यहां तक कि जहां हम किसी प्रोग्राम के शब्दार्थ को साबित कर सकते हैं, जैसे कि भाषा कोक के साथ, यह शब्दार्थ में सीमित है जो टाइपिंग में व्यक्त किए गए हैं , और टाइपिंग कभी भी प्रोग्राम के सभी शब्दार्थों पर कब्जा नहीं कर सकता है - जो भाषाओं के लिए भी नहीं हैं पूर्ण रूप से ट्यूरिंग नहीं, उदाहरण के लिए HTML + CSS के साथ असंगत संयोजनों को व्यक्त करना संभव है जो इस प्रकार अपरिभाषित शब्दार्थ हैं।
3 कई स्पष्टीकरण गलत तरीके से दावा करते हैं कि केवल अनिवार्य प्रोग्रामिंग में वाक्यविन्यास आदेश दिए गए हैं। मैंने अनिवार्य और कार्यात्मक प्रोग्रामिंग के बीच इस भ्रम को स्पष्ट किया । उदाहरण के लिए, HTML कथनों का क्रम उनके अर्थ की स्थिरता को कम नहीं करता है।
संपादित करें: मैंने रॉबर्ट हार्पर के ब्लॉग पर निम्नलिखित टिप्पणी पोस्ट की :
कार्यात्मक प्रोग्रामिंग में ... एक चर की भिन्नता की सीमा एक प्रकार है
इस बात पर निर्भर करता है कि कोई व्यक्ति कैसे कार्यात्मक प्रोग्रामिंग से अलग होता है, एक अनिवार्य कार्यक्रम में आपके 'असाइन करने योग्य' का प्रकार उसकी परिवर्तनशीलता पर एक बाध्यता भी हो सकता है।
केवल गैर-मुडल्ड परिभाषा जो मैं वर्तमान में कार्यात्मक प्रोग्रामिंग के लिए सराहना करता हूं) क) प्रथम श्रेणी की वस्तुओं और प्रकारों के रूप में कार्य करता है, ख) छोरों पर पुनरावृत्ति के लिए वरीयता, और / या सी) शुद्ध कार्य- अर्थात वे कार्य जो वांछित शब्दार्थ को प्रभावित नहीं करते हैं। प्रोग्राम जब ज्ञापन ( इस प्रकार पूरी तरह से शुद्ध कार्यात्मक प्रोग्रामिंग परिचालन अर्थार्थिक्स , जैसे मेमोरी आवंटन के प्रभाव के कारण एक सामान्य उद्देश्य के अर्थ शब्दार्थ में मौजूद नहीं है )।
एक शुद्ध कार्य की आदर्श संपत्ति का मतलब है कि इसके चर पर फ़ंक्शन कॉल को इसके मूल्य द्वारा प्रतिस्थापित किया जा सकता है, जो आम तौर पर एक अनिवार्य प्रक्रिया के तर्कों के लिए मामला नहीं है। शुद्ध कार्य इनपुट और परिणाम प्रकारों के बीच अनियोजित राज्य संक्रमणों के लिए घोषणात्मक wrt प्रतीत होते हैं।
लेकिन शुद्ध कार्यों की संरचना ऐसी किसी भी स्थिरता को बनाए नहीं रखती है, क्योंकि शुद्ध कार्यात्मक प्रोग्रामिंग भाषा में साइड-इफेक्ट (वैश्विक राज्य) की अनिवार्य प्रक्रिया को मॉडल करना संभव है, उदाहरण के लिए हास्केल का इमोनाड और इसके अलावा इसे रोकने के लिए पूरी तरह से असंभव है किसी भी ट्यूरिंग पूर्ण शुद्ध कार्यात्मक प्रोग्रामिंग भाषा।
जैसा कि मैंने 2012 में लिखा था जो आपके हाल के ब्लॉग में टिप्पणियों की समान सहमति के लिए प्रतीत होता है , कि घोषणात्मक प्रोग्रामिंग इस धारणा को पकड़ने का प्रयास है कि इच्छित शब्दार्थ कभी अपारदर्शी नहीं हैं। अपारदर्शी शब्दार्थ के उदाहरण क्रम पर निर्भरता हैं, संचालन शब्दार्थ परत पर उच्च-स्तरीय शब्दार्थ के उन्मूलन पर निर्भरता (जैसे जातें रूपांतरण नहीं हैं और सामान्यीकृत उच्च स्तर के शब्दार्थ को सीमित करते हैं ), और चर मानों पर निर्भरता की जाँच की जा सकती है (सिद्ध नहीं की जा सकती) सही) प्रोग्रामिंग भाषा द्वारा।
इस प्रकार मैंने यह निष्कर्ष निकाला है कि केवल गैर-ट्यूरिंग पूर्ण भाषाएं घोषणात्मक हो सकती हैं।
इस प्रकार एक घोषणात्मक भाषा की एक स्पष्ट और विशिष्ट विशेषता यह हो सकती है कि इसका उत्पादन जनरेटिव नियमों के कुछ असंख्य सेटों को मानने के लिए सिद्ध किया जा सकता है। उदाहरण के लिए, किसी भी विशिष्ट एचटीएमएल प्रोग्राम के लिए (व्याख्या करने वाले तरीकों में अंतर की अनदेखी करना) जो कि स्क्रिप्टेड नहीं है (यानी ट्यूरिंग पूर्ण नहीं है) तो इसका आउटपुट परिवर्तनशीलता असंख्य हो सकती है। या अधिक संक्षेप में एक HTML प्रोग्राम इसकी परिवर्तनशीलता का एक शुद्ध कार्य है। Ditto एक स्प्रेडशीट प्रोग्राम इसके इनपुट चर का एक शुद्ध कार्य है।
तो यह मुझे प्रतीत होता है कि घोषणात्मक भाषाएँ अनबिके पुनरावृत्ति का प्रतिपादक हैं , अर्थात गोडेल की दूसरी अपूर्णता प्रमेय आत्म-संदर्भित प्रमेयों को सिद्ध नहीं किया जा सकता है।
लेसी लैम्पपोर्ट ने इस बारे में एक कहानी लिखी कि यूक्लिड ने गोडेल के अधूरे सिद्धांत के बारे में कैसे काम किया होगा, जो प्रोग्रामिंग भाषा के संदर्भ में गणित के प्रमाणों पर लागू होता है, प्रकार और तर्क (करी-हावर्ड पत्राचार, आदि) के बीच बधाई देने के लिए।
इम्पीरेटिव प्रोग्रामिंग: "मशीन" को यह बताना कि कुछ कैसे करना है, और परिणामस्वरूप आप जो होना चाहते हैं वह होगा।
घोषणात्मक प्रोग्रामिंग: "मशीन" को बताना कि आप क्या करना चाहते हैं, और कंप्यूटर को यह बताने का तरीका दें कि यह कैसे करना है।
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);
}
नोट: अंतर संक्षिप्तता या जटिलता या अमूर्तता में से एक नहीं है। जैसा कि कहा गया है, अंतर कैसे बनाम क्या है ।
पहल / घोषणात्मक / कार्यात्मक पहलुओं अतीत में अच्छा सामान्य भाषाओं वर्गीकृत करने के लिए गया था, लेकिन आजकल सभी "बड़ी भाषा" में कुछ विकल्प (आमतौर पर है (जावा, अजगर, जावास्क्रिप्ट, आदि) चौखटे ) "अन्य फोकस" के साथ व्यक्त करने के लिए इसकी मुख्य एक (सामान्य अनिवार्यता), और समानांतर प्रक्रियाओं, घोषणात्मक कार्यों, लंबोदर, आदि को व्यक्त करने के लिए।
तो इस सवाल का एक अच्छा संस्करण है "आज फ्रेमवर्क को वर्गीकृत करने के लिए क्या पहलू अच्छा है?" ... एक महत्वपूर्ण पहलू यह है कि हम "प्रोग्रामिंग शैली" लेबल कर सकते हैं ...
एक अच्छा उदाहरण समझाने के लिए। जैसा कि आप विकिपीडिया पर jQuery के बारे में पढ़ सकते हैं ,
JQuery की मुख्य विशेषताओं का सेट - DOM एलिमेंट सिलेक्शन, ट्रैवर्सल और मैनिपुलेशन -, इसके सिलेक्टर इंजन (...) द्वारा सक्षम, एक नया "प्रोग्रामिंग स्टाइल" बनाया, एल्गोरिथम और DOM-डेटा-स्ट्रक्चर्स
तो jQuery एक "नई प्रोग्रामिंग शैली" पर ध्यान केंद्रित करने का सबसे अच्छा (लोकप्रिय) उदाहरण है , जो न केवल ऑब्जेक्ट ओरिएंटेशन है, " फ़्यूज़िंग एल्गोरिदम और डेटा-स्ट्रक्चर " है। jQuery स्प्रेडशीट के रूप में कुछ हद तक प्रतिक्रियाशील है, लेकिन "सेल-ओरिएंटेड" नहीं है, " डोम-नोड ओरिएंटेड " है ... इस संदर्भ में मुख्य शैलियों की तुलना :
कोई संलयन नहीं : सभी "बड़ी भाषाओं" में, किसी भी कार्यात्मक / घोषणा / अभिव्यक्ति की अभिव्यक्ति में, सामान्य रूप से डेटा और एल्गोरिथ्म का "कोई संलयन" नहीं होता है, केवल कुछ ऑब्जेक्ट-ओरिएंटेशन को छोड़कर, जो कि सख्त बीजगणितीय संरचना बिंदु पर एक संलयन है ।
कुछ संलयन : संलयन की सभी क्लासिक रणनीतियाँ, आजकल कुछ प्रतिमानों में इसका उपयोग प्रतिमान के रूप में किया जाता है ... डेटाफ्लो , इवेंट-संचालित प्रोग्रामिंग (या पुराने डोमेन विशिष्ट भाषाओं जैसे कि awk और XSLT ) ... आधुनिक स्प्रेडशीट के साथ प्रोग्रामिंग की तरह, वे भी हैं प्रतिक्रियाशील प्रोग्रामिंग शैली के उदाहरण ।
बड़ा संलयन : "jQuery की शैली" है ... jQuery एक डोमेन विशिष्ट भाषा है जो " फ़्यूज़िंग एल्गोरिदम और DOM-डेटा-स्ट्रक्चर्स " पर केंद्रित है ।
पुनश्च: अन्य "क्वेरी भाषाएँ", XQuery के रूप में, SQL (PL के साथ अनिवार्य अभिव्यक्ति विकल्प) भी डेटा-एल्गोरिथ्म-संलयन उदाहरण हैं, लेकिन वे द्वीप हैं , अन्य सिस्टम मॉड्यूल के साथ कोई संलयन नहीं ... वसंत- का उपयोग करते find()
समय और विशिष्टता खंड, एक और अच्छा संलयन उदाहरण है।
घोषणात्मक प्रोग्रामिंग इनपुट और आउटपुट के बीच कुछ कालातीत तर्क व्यक्त करके प्रोग्रामिंग कर रहा है, उदाहरण के लिए, छद्मकोड में, निम्न उदाहरण घोषणात्मक होगा:
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
किसी भी मूल्य को परिवर्तित नहीं करता है।
विख्यात "प्रकार" के बारे में यहाँ कुछ अच्छे उत्तर हैं।
मैं कुछ अतिरिक्त, अधिक "विदेशी" अवधारणाओं को प्रस्तुत करता हूं जो अक्सर कार्यात्मक प्रोग्रामिंग भीड़ से जुड़ी होती हैं:
मुझे लगता है कि आपकी टैक्सोनोमी गलत है। दो विपरीत प्रकार के अनिवार्य और घोषणात्मक हैं। कार्यात्मक केवल घोषणात्मक का एक उपप्रकार है। BTW, विकिपीडिया एक ही तथ्य बताता है।
संक्षेप में, अधिक प्रोग्रामिंग शैली जोर देती है कि क्या (कैसे करना है) कैसे (कैसे करना है) के विवरण को अलग करना उस शैली को घोषणात्मक माना जाता है। अनिवार्य के लिए विपरीत सच है। कार्यात्मक प्रोग्रामिंग, घोषणात्मक शैली के साथ जुड़ा हुआ है।