मैं कई अलग-अलग संदर्भों में इस शब्द को सुनता रहा। यह क्या है?
मैं कई अलग-अलग संदर्भों में इस शब्द को सुनता रहा। यह क्या है?
जवाबों:
घोषणात्मक प्रोग्रामिंग तब होती है जब आप अपना कोड इस तरह से लिखते हैं कि यह वर्णन करता है कि आप क्या करना चाहते हैं, और यह नहीं कि आप इसे कैसे करना चाहते हैं। यह कैसे पता लगाने के लिए संकलक के लिए छोड़ दिया जाता है।
घोषणात्मक प्रोग्रामिंग भाषाओं के उदाहरण एसक्यूएल और प्रोलॉग हैं।
अन्य उत्तर पहले से ही एक शानदार काम कर रहे हैं, जिसमें बताया गया है कि घोषणात्मक प्रोग्रामिंग क्या है, इसलिए मैं बस कुछ उदाहरण प्रदान करने जा रहा हूं कि क्यों उपयोगी हो सकते हैं।
घोषणात्मक कार्यक्रम संदर्भ-स्वतंत्र हैं । क्योंकि वे केवल घोषणा करते हैं कि अंतिम लक्ष्य क्या है, लेकिन उस लक्ष्य तक पहुंचने के लिए मध्यस्थ कदम नहीं, एक ही कार्यक्रम को विभिन्न संदर्भों में उपयोग किया जा सकता है। यह अनिवार्य कार्यक्रमों के साथ करना मुश्किल है , क्योंकि वे अक्सर संदर्भ (जैसे छिपे हुए राज्य) पर निर्भर करते हैं।
yacc
एक उदाहरण के रूप में लें । यह एक पार्सर जनरेटर उर्फ है। संकलक संकलक, एक भाषा के व्याकरण का वर्णन करने के लिए एक बाहरी घोषणात्मक डीएसएल, ताकि उस भाषा के लिए एक पार्सर स्वचालित रूप से विवरण से उत्पन्न हो सके। इसकी संदर्भ स्वतंत्रता के कारण, आप इस तरह के व्याकरण के साथ कई अलग-अलग काम कर सकते हैं:
yacc
)और बहुत सारे …
क्योंकि आप उस कंप्यूटर को नहीं लिखते हैं जो कदम उठाता है और किस क्रम में, यह आपके प्रोग्राम को अधिक स्वतंत्र रूप से पुनर्व्यवस्थित कर सकता है, शायद समानांतर में कुछ कार्यों को निष्पादित भी करता है। एक अच्छा उदाहरण एक SQL डेटाबेस के लिए क्वेरी योजनाकार और क्वेरी ऑप्टिमाइज़र है। अधिकांश SQL डेटाबेस आपको उस क्वेरी को प्रदर्शित करने की अनुमति देते हैं जो वे वास्तव में निष्पादित कर रहे हैं बनाम जिस क्वेरी को आपने उन्हें निष्पादित करने के लिए कहा है। अक्सर, उन प्रश्नों में कुछ भी नहीं दिखता हैएक दुसरे के जैसे। क्वेरी प्लानर उन चीजों को ध्यान में रखता है जो आपने सपने में भी नहीं सोची होंगी: डिस्क प्लेटर की घूर्णी विलंबता, उदाहरण के लिए या इस तथ्य के लिए कि पूरी तरह से अलग उपयोगकर्ता के लिए कुछ पूरी तरह से अलग आवेदन बस एक समान क्वेरी और उस तालिका को निष्पादित करता है जो आप हैं के साथ जुड़ना और जिसे आपने लोड करने से बचने के लिए बहुत मेहनत की है, वैसे भी पहले से ही मेमोरी में है।
यहां एक दिलचस्प व्यापार बंद है: मशीन को यह पता लगाने के लिए कड़ी मेहनत करनी पड़ती है कि किसी अपूर्ण भाषा में उससे कुछ कैसे करना है, लेकिन जब वह इसका पता लगाता है, तो उसके पास अनुकूलन के लिए बहुत अधिक स्वतंत्रता और बहुत अधिक जानकारी होती है मंच।
शिथिल:
घोषणात्मक प्रोग्रामिंग की ओर जाता है: -
इंपीरियल प्रोग्रामिंग की ओर जाता है: -
नतीजतन, एक अनिवार्य शैली पाठक को मैकेनिक्स को समझने में मदद करती है कि सिस्टम वास्तव में क्या कर रहा है, लेकिन इस समस्या को थोड़ा अंतर्दृष्टि दे सकता है जिसे हल करने का इरादा है। दूसरी ओर, एक घोषणात्मक शैली पाठक को समस्या डोमेन और दृष्टिकोण को समझने में मदद करती है कि प्रणाली समस्या के समाधान की ओर ले जाती है, लेकिन यांत्रिकी के मामले में कम जानकारीपूर्ण है।
वास्तविक कार्यक्रम (यहां तक कि भाषाओं में लिखे गए हैं जो स्पेक्ट्रम के छोरों का समर्थन करते हैं, जैसे कि प्रोलॉग या सी) दोनों शैलियों के पास विभिन्न बिंदुओं पर मौजूद हैं, जो टुकड़े की बदलती जटिलताओं और संचार जरूरतों को पूरा करते हैं। एक शैली दूसरे से बेहतर नहीं है; वे बस विभिन्न उद्देश्यों की सेवा करते हैं, और, जीवन में कई चीजों के साथ, संयम महत्वपूर्ण है।
यहाँ एक उदाहरण है।
CSS में (HTML पेजों को स्टाइल करने के लिए उपयोग किया जाता है), यदि आप चाहते हैं कि एक छवि तत्व 100 पिक्सेल ऊंचा और 100 पिक्सेल चौड़ा हो, तो आप बस "घोषणा" करें कि आप इस प्रकार चाहते हैं:
#myImageId {
height: 100px;
width: 100px;
}
आप सीएसएस को एक घोषणात्मक "स्टाइल शीट" भाषा मान सकते हैं।
ब्राउज़र सीएसएस जो इस सीएसएस को पढ़ता है और उसकी व्याख्या करता है, वह इस छवि को लंबा दिखाने के लिए स्वतंत्र है और यह व्यापक रूप से इसे चाहता है। विभिन्न ब्राउज़र इंजन (जैसे, IE के लिए इंजन, क्रोम के लिए इंजन) इस कार्य को अलग तरीके से कार्यान्वित करेंगे।
उनके अद्वितीय कार्यान्वयन, निश्चित रूप से, एक घोषणात्मक भाषा में नहीं, बल्कि विधानसभा, सी, सी ++, जावा, जावास्क्रिप्ट, या पायथन जैसे प्रक्रियात्मक एक में लिखे गए हैं। वह कोड स्टेप्स स्टेप बाय स्टेप बाय स्टेप (और फंक्शन कॉल्स शामिल कर सकता है)। यह पिक्सेल मूल्यों को प्रक्षेपित करने और स्क्रीन पर प्रस्तुत करने जैसी चीजें कर सकता है।
मुझे खेद है, लेकिन मुझे कई अन्य उत्तरों से असहमत होना चाहिए। मैं घोषणात्मक प्रोग्रामिंग की परिभाषा की इस गलतफहमी को रोकना चाहूंगा।
परिभाषा
उप-अभिव्यक्तियों की प्रासंगिक पारदर्शिता (आरटी) एक घोषित प्रोग्रामिंग अभिव्यक्ति का एकमात्र आवश्यक विशेषता है , क्योंकि यह एकमात्र विशेषता है जिसे अनिवार्यता प्रोग्रामिंग के साथ साझा नहीं किया गया है।
घोषित प्रोग्रामिंग के अन्य उद्धृत गुण, इस आरटी से प्राप्त होते हैं। कृपया विस्तृत विवरण के लिए ऊपर हाइपरलिंक पर क्लिक करें।
स्प्रेडशीट का उदाहरण
स्प्रेडशीट प्रोग्रामिंग में दो उत्तरों का उल्लेख किया गया है। उन मामलों में जहां स्प्रेडशीट प्रोग्रामिंग (उर्फ फॉर्मूले) परस्पर वैश्विक स्थिति तक नहीं पहुंचते हैं , तो यह घोषणात्मक प्रोग्रामिंग है। इसका कारण यह है परिवर्तनशील कक्ष मान अखंड हैं इनपुट और आउटपुट की main()
(पूरे कार्यक्रम)। प्रत्येक सूत्र के निष्पादित होने के बाद नए मान कोशिकाओं को नहीं लिखे जाते हैं, इस प्रकार वे घोषणात्मक कार्यक्रम (स्प्रेडशीट में सभी सूत्रों का निष्पादन) के जीवन के लिए परस्पर नहीं हैं। इस प्रकार एक दूसरे के सापेक्ष, सूत्र इन उत्परिवर्तित कोशिकाओं को अपरिवर्तनीय मानते हैं। एक आर टी समारोह का उपयोग करने की अनुमति दी है अपरिवर्तनीय वैश्विक राज्य (और यह भी परिवर्तनशील स्थानीय राज्य )।
इस प्रकार प्रोग्राम समाप्त होने पर कोशिकाओं में मूल्यों को म्यूट करने की क्षमता ( main()
नियमों से आउटपुट के रूप में ), उन्हें नियमों के संदर्भ में परस्पर संग्रहित मान नहीं बनाती है। प्रमुख अंतर यह है कि प्रत्येक स्प्रेडशीट सूत्र के प्रदर्शन के बाद सेल मान अपडेट नहीं किए जाते हैं, इस प्रकार फ़ार्मुलों के प्रदर्शन का क्रम मायने नहीं रखता है। सभी घोषित फॉर्मूलों के प्रदर्शन के बाद सेल वैल्यू अपडेट की जाती है।
डिक्लेरेटिव प्रोग्रामिंग वह चित्र है, जहाँ अनिवार्य प्रोग्रामिंग उस चित्र को चित्रित करने के लिए निर्देश है।
आप एक घोषणात्मक शैली में लिख रहे हैं यदि आप "यह बता रहे हैं कि यह क्या है", इसके बजाय कंप्यूटर को उन चरणों के बारे में बताना चाहिए जहां आप इसे चाहते हैं।
जब आप डेटा को चिह्नित करने के लिए एक्सएमएल का उपयोग करते हैं, तो आप घोषणात्मक प्रोग्रामिंग का उपयोग कर रहे हैं क्योंकि आप कह रहे हैं "यह एक व्यक्ति है, यह जन्मदिन है, और एक सड़क का पता है"।
कुछ उदाहरण जहां घोषणात्मक और अनिवार्य प्रोग्रामिंग अधिक प्रभाव के लिए संयुक्त हो जाते हैं:
विंडोज प्रेजेंटेशन फाउंडेशन यूजर इंटरफेस जैसा दिखता है, और यह बताता है कि नियंत्रण और अंतर्निहित डेटा संरचनाओं के बीच क्या संबंध (बाइंडिंग) हैं, यह बताने के लिए घोषणात्मक XML सिंटैक्स का उपयोग करता है।
संरचित कॉन्फ़िगरेशन फ़ाइलों में डेटा का एक स्ट्रिंग या मान क्या है, यह पहचानने के लिए घोषणात्मक सिंटैक्स ("कुंजी = मान" जोड़े के रूप में सरल) का उपयोग किया जाता है।
HTML टैग के साथ पाठ को चिह्नित करता है जो बताता है कि पूरे दस्तावेज़ के संबंध में पाठ के प्रत्येक टुकड़े की क्या भूमिका है।
डिक्लेरेटिव प्रोग्रामिंग डिक्लेरेशन के साथ प्रोग्रामिंग है, यानी डिक्लेरेटिव वाक्यों में। घोषणात्मक वाक्यों में कई गुण होते हैं जो उन्हें अनिवार्य वाक्यों से अलग करते हैं। विशेष रूप से, घोषणाएँ हैं:
एक प्रासंगिक बिंदु यह है कि ये सभी संरचनात्मक गुण हैं और विषय वस्तु के लिए रूढ़िवादी हैं। घोषणा "क्या बनाम कैसे" के बारे में नहीं है । हम घोषणा कर सकते हैं (प्रतिनिधित्व और विवश करना) एक "कैसे" जितनी आसानी से हम "क्या" घोषित करते हैं । घोषणा संरचना के बारे में है, सामग्री से नहीं। डिक्लेरेटिव प्रोग्रामिंग का एक महत्वपूर्ण प्रभाव है कि हम अपने कोड को कैसे अमूर्त और रिफलेक्टर करते हैं, और हम इसे सबप्रोग्राम में कैसे संशोधित करते हैं, लेकिन डोमेन मॉडल पर ऐसा नहीं है।
अक्सर, हम संदर्भ जोड़कर अनिवार्य से घोषणात्मक में बदल सकते हैं। जैसे "बाएं मुड़ें। (... इसकी प्रतीक्षा करें ...) दाएँ मुड़ें।" "बॉब 11:01 पर फू और बार के चौराहे पर बाईं ओर मुड़ जाएगा। बॉब 11:06 पर बार और बाज के चौराहे पर दाएं मुड़ जाएगा।" ध्यान दें कि बाद के मामले में वाक्य निष्प्राण और प्रशंसनीय होते हैं, जबकि पूर्व मामले में वाक्यों को पुन: व्यवस्थित या दोहराते हुए कार्यक्रम के अर्थ को गंभीर रूप से बदल देंगे।
मोनोटोनिक के संबंध में , घोषणाएं बाधाओं को जोड़ सकती हैं जो संभावनाओं को घटाती हैं । लेकिन बाधाएं अभी भी जानकारी जोड़ती हैं (अधिक सटीक रूप से, बाधाएं सूचना हैं)। अगर हमें समय-भिन्न घोषणाओं की आवश्यकता है, तो यह स्पष्ट रूप से अस्थायी शब्दार्थ के साथ मॉडल के लिए विशिष्ट है - जैसे "गेंद सपाट है" से "गेंद समय पर सपाट है"। यदि हमारे पास दो विरोधाभासी घोषणाएं हैं, तो हमारे पास एक असंगत घोषणा प्रणाली है, हालांकि यह नरम बाधाओं (प्राथमिकताओं, संभावनाओं, आदि) को शुरू करने या एक असंगत तर्क का लाभ उठाकर हल किया जा सकता है ।
एक्सल पेज की कल्पना करें। टैक्स रिटर्न की गणना करने के लिए सूत्रों के साथ आबादी वाले कॉलम।
सभी तर्क कोशिकाओं में घोषित किए जाते हैं, गणना का क्रम प्रक्रियात्मक रूप से होने के बजाय सूत्र द्वारा निर्धारित होता है।
यह घोषणात्मक प्रोग्रामिंग के बारे में क्या है। आप कार्यक्रम के प्रवाह के बजाय समस्या स्थान और समाधान की घोषणा करते हैं।
Prolog एकमात्र घोषित भाषा है जिसका मैंने उपयोग किया है। इसके लिए एक अलग तरह की सोच की आवश्यकता होती है, लेकिन यह सीखने के लिए अच्छा है कि क्या आप केवल विशिष्ट प्रक्रियात्मक प्रोग्रामिंग भाषा के अलावा किसी अन्य चीज़ के लिए आपको उजागर करें।
मैंने घोषणात्मक प्रोग्रामिंग के बारे में अपनी समझ को परिष्कृत किया है, दिसंबर 2011 से जब मैंने इस प्रश्न का उत्तर प्रदान किया था। यहाँ मेरी वर्तमान समझ है।
मेरी समझ (अनुसंधान) का लंबा संस्करण इस लिंक पर विस्तृत है , जिसे आपको नीचे दिए गए सारांश की गहरी समझ हासिल करने के लिए पढ़ना चाहिए।
इम्पीरेटिव प्रोग्रामिंग वह है जहाँ उत्परिवर्तित अवस्था को संग्रहित किया जाता है और पढ़ा जाता है, इस प्रकार प्रोग्राम निर्देशों का क्रम और / दोहराव कार्यक्रम के व्यवहार (शब्दार्थ) को बदल सकता है (और बग भी पैदा कर सकता है, अर्थात अनपेक्षित व्यवहार)।
सबसे भोली और चरम अर्थ में (जो मैंने अपने पूर्व उत्तर में दिया था), घोषित प्रोग्रामिंग (डीपी) सभी संग्रहीत उत्परिवर्तनीय स्थिति से बच रहा है, इस प्रकार कार्यक्रम निर्देशों के आदेश और / या दोहराव व्यवहार (शब्दार्थ) को बदल नहीं सकते हैं ।
हालांकि, इस तरह की चरम परिभाषा वास्तविक दुनिया में बहुत उपयोगी नहीं होगी, क्योंकि लगभग हर कार्यक्रम में संग्रहीत उत्परिवर्तित अवस्था शामिल होती है। स्प्रेडशीट उदाहरण डी पी के इस चरम परिभाषा के अनुरूप है, क्योंकि पूरे कार्यक्रम कोड, इनपुट राज्य में से एक स्थिर प्रति के साथ पूरा करने चलाया जाता है इससे पहले कि नए राज्यों जमा हो जाती है। फिर अगर किसी भी राज्य को बदल दिया जाता है, तो यह दोहराया जाता है। लेकिन अधिकांश वास्तविक विश्व कार्यक्रम राज्य परिवर्तनों के ऐसे अखंड मॉडल तक सीमित नहीं हो सकते हैं।
डीपी की एक अधिक उपयोगी परिभाषा यह है कि प्रोग्रामिंग निर्देशों के आदेश और / या दोहराव किसी भी अपारदर्शी शब्दार्थ को नहीं बदलते हैं। दूसरे शब्दों में, शब्दार्थ में होने वाले यादृच्छिक परिवर्तन छिपे नहीं हैं- प्रोग्राम इंस्ट्रक्शन ऑर्डर और / या दोहराव के किसी भी परिवर्तन से प्रोग्राम के व्यवहार में केवल इच्छित और पारदर्शी परिवर्तन होते हैं।
अगला कदम डीपी में कौन से प्रोग्रामिंग मॉडल या प्रतिमान सहायता के बारे में बात करना होगा, लेकिन यहां यह सवाल नहीं है।
Functional programming
इन दिनों एक चर्चा शब्द है जो मूल रूप से घोषित प्रोग्रामिंग का सबसेट है। LINQ in C # भाषा कार्यात्मक प्रोग्रामिंग का एक तत्व है जब भाषा स्वभाव से ही अनिवार्य है। तो C # उस परिभाषा के अनुसार हाइब्रिड हो जाता है।
यह प्रोग्रामिंग का एक तरीका है जो यह वर्णन करता है कि कुछ काम करना चाहिए या इसके बजाय यह वर्णन करना चाहिए कि यह कैसे काम करना चाहिए।
दूसरे शब्दों में, आप भावों से बने एल्गोरिदम को नहीं लिखते हैं, आप सिर्फ लेआउट करते हैं कि आप चीजों को कैसे चाहते हैं। दो अच्छे उदाहरण HTML और WPF हैं।
यह विकिपीडिया लेख एक अच्छा अवलोकन है: http://en.wikipedia.org/wiki/Declarative_programming
जब से मैंने अपना पूर्व उत्तर लिखा है, मैंने घोषणा की गई संपत्ति की एक नई परिभाषा तैयार की है जो नीचे उद्धृत की गई है। मैंने भी अनिवार्य प्रोग्रामिंग को दोहरी संपत्ति के रूप में परिभाषित किया है।
यह परिभाषा उस व्यक्ति से बेहतर है जिसे मैंने अपने पूर्व उत्तर में प्रदान किया है, क्योंकि यह संक्षिप्त है और यह अधिक सामान्य है। लेकिन इसे टटोलना अधिक कठिन हो सकता है, क्योंकि प्रोग्रामिंग और जीवन में सामान्य रूप से लागू अपूर्णता प्रमेयों का निहितार्थ मनुष्य के लिए अपने मन को लपेटना मुश्किल है।
परिभाषा की उद्धृत व्याख्या, भूमिकात्मक प्रोग्रामिंग में शुद्ध कार्यात्मक प्रोग्रामिंग नाटकों की भूमिका पर चर्चा करती है।
घोषणात्मक बनाम इंपेरेटिव
घोषणात्मक संपत्ति अजीब, अप्रिय, और तकनीकी रूप से सटीक परिभाषा में कैप्चर करने के लिए मुश्किल है जो सामान्य बनी हुई है और अस्पष्ट नहीं है, क्योंकि यह एक भोली धारणा है कि हम बिना अनपेक्षित दुष्प्रभावों के कार्यक्रम के अर्थ (उर्फ शब्दार्थ) की घोषणा कर सकते हैं। अर्थ की अभिव्यक्ति और अनपेक्षित प्रभावों से बचने के बीच एक अंतर्निहित तनाव है, और यह तनाव वास्तव में प्रोग्रामिंग और हमारे ब्रह्मांड के अधूरे सिद्धांत से निकलता है।
यह ओवरसाइम्प्लिफिकेशन, तकनीकी रूप से असंभव है, और अक्सर " क्या करना है " और " कैसे करना है " के रूप में जरूरी के रूप में घोषणात्मक को परिभाषित करने के लिए अस्पष्ट है । एक अस्पष्ट मामला " क्या " प्रोग्राम में " कैसे " है जो एक प्रोग्राम को संकलित करता है- एक संकलक।
जाहिर तौर पर अनबाउंड रिक्वायरमेंट जो किसी भाषा को ट्यूरिंग को पूर्ण बनाती है , वह भी शब्दार्थ में समान रूप से है - न केवल मूल्यांकन की वाक्य रचना में (उर्फ ऑपरेशनल शब्दार्थ)। यह तार्किक रूप से गोदेल की प्रमेय के अनुरूप एक उदाहरण है- " स्वयंसिद्ध कोई भी पूर्ण प्रणाली भी असंगत है "। उस बोली के विरोधाभासी अजीबता को टटोलें! यह एक उदाहरण भी है जो दर्शाता है कि शब्दार्थ की अभिव्यक्ति के लिए एक योग्य बाध्य नहीं है, इस प्रकार हम 2 को साबित नहीं कर सकते हैं कि एक कार्यक्रम (और इसके मूल रूप से) ने उर्फ हॉल्टिंग प्रमेय को रोक दिया।
अधूरापन प्रमेय हमारे ब्रह्मांड की मूल प्रकृति से प्राप्त होता है, जो कि थर्मोडायनामिक्स के दूसरे नियम में कहा गया है, " एन्ट्रापी (उर्फ स्वतंत्र संभावनाओं का #) अधिकतम हमेशा के लिए ट्रेंड कर रहा है "। किसी प्रोग्राम का कोडिंग और डिज़ाइन कभी भी समाप्त नहीं होता है - यह जीवित है! - क्योंकि यह एक वास्तविक दुनिया की जरूरत को संबोधित करने का प्रयास करता है, और वास्तविक दुनिया के शब्दार्थ हमेशा बदल रहे हैं और अधिक संभावनाओं के लिए रुझान हैं। मनुष्य कभी भी नई चीजों की खोज करना बंद नहीं करता है (कार्यक्रमों में त्रुटियां; ;-))।
सटीक और तकनीकी रूप से इस विचित्र ब्रह्मांड के भीतर इस कथित वांछित धारणा को पकड़ने के लिए जिसमें कोई किनारा नहीं है (विचार है कि! हमारे ब्रह्मांड का कोई "बाहर" नहीं है), एक स्पष्ट, लेकिन भ्रामक-सरल-सरल परिभाषा की आवश्यकता है जो तब तक ध्वनि करेगा जब तक इसे समझाया नहीं जाता। गहरा।
परिभाषा:
घोषणात्मक संपत्ति वह है जहां बयानों का एक ही संभव सेट मौजूद हो सकता है जो प्रत्येक विशिष्ट मॉड्यूलर अर्थ को व्यक्त कर सकता है।
अनिवार्य संपत्ति 3 दोहरी है, जहां शब्दार्थ रचना के तहत असंगत हैं और / या बयानों के सेट के रूपांतरों के साथ व्यक्त किए जा सकते हैं।
घोषणात्मक की यह परिभाषा अर्थिक दायरे में विशिष्ट रूप से स्थानीय है, जिसका अर्थ है कि यह आवश्यक है कि एक मॉड्यूलर शब्दार्थ अपने सुसंगत अर्थ को बनाए रखे, भले ही यह कहाँ और कैसे वैश्विक स्तर पर त्वरित और नियोजित हो । इस प्रकार प्रत्येक घोषणात्मक मॉड्यूलर सिमेंटिक सभी संभव दूसरों के लिए आंतरिक रूप से रूढ़िवादी होना चाहिए- और एक असंभव (अपूर्णता प्रमेयों के कारण) वैश्विक एल्गोरिथ्म या निरंतरता देखने के लिए मॉडल, जो कि रॉबर्ट हार्पर, प्रोफेसर द्वारा " अधिक हमेशा बेहतर नहीं " का बिंदु है। कंप्यूटर विज्ञान में कार्नेगी मेलन विश्वविद्यालय, मानक एमएल के डिजाइनरों में से एक।
इन मॉड्यूलर घोषणात्मक शब्दार्थों के उदाहरणों में श्रेणी सिद्धांत रूपांतरक शामिल हैं। उदाहरण के लिए
Applicative
, नाममात्र टाइपिंग, नामस्थान, फ़ील्ड्स, और शब्दार्थ के परिचालन स्तर पर फिर शुद्ध कार्यात्मक प्रोग्रामिंग।इस प्रकार अच्छी तरह से डिजाइन की गई घोषणात्मक भाषाएं स्पष्ट रूप से अर्थ व्यक्त कर सकती हैं, जो कि व्यक्त की जा सकने वाली सामान्यता के कुछ नुकसान के साथ, फिर भी आंतरिक स्थिरता के साथ व्यक्त की जा सकती है।
उपर्युक्त परिभाषा का एक उदाहरण एक स्प्रेडशीट प्रोग्राम की कोशिकाओं में सूत्र का सेट है- जो अलग कॉलम और पंक्ति कोशिकाओं में स्थानांतरित होने पर समान अर्थ देने की उम्मीद नहीं है, अर्थात सेल पहचानकर्ता बदल गए। सेल आइडेंटिफ़ायर का एक हिस्सा है और न कि इच्छित अर्थ के लिए अतिशयोक्ति है। इसलिए प्रत्येक स्प्रेडशीट परिणाम सूत्र के एक सेट में सेल पहचानकर्ताओं के लिए अद्वितीय wrt है। इस मामले में लगातार मॉड्यूलर सिमेंटिक सेल फॉर्मूलर्स का उपयोग सेल फ़ार्मुलों के लिए शुद्ध कार्यों के इनपुट और आउटपुट के रूप में होता है (नीचे देखें)।
हाइपर टेक्स्ट मार्कअप लैंग्वेज उर्फ एचटीएमएल- स्टेटिक वेब पेजों के लिए भाषा- एक उच्च (लेकिन पूरी तरह से 3 नहीं ) घोषणात्मक भाषा का एक उदाहरण है (कम से कम एचटीएमएल 5 से पहले) गतिशील व्यवहार को व्यक्त करने की कोई क्षमता नहीं थी। HTML शायद सबसे आसान भाषा है। गतिशील व्यवहार के लिए, जावास्क्रिप्ट जैसी एक अनिवार्य स्क्रिप्टिंग भाषा को आमतौर पर HTML के साथ जोड़ा गया था। जावास्क्रिप्ट के बिना HTML घोषणात्मक परिभाषा फिट बैठता है क्योंकि प्रत्येक नाममात्र प्रकार (यानी टैग) वाक्य रचना के नियमों के भीतर रचना के तहत अपने सुसंगत अर्थ को बनाए रखता है।
घोषणात्मक के लिए एक प्रतिस्पर्धात्मक परिभाषा अर्थपूर्ण बयानों के कम्यूटेटिव और बेमिसाल गुण हैं, अर्थात बयानों को बिना मतलब बदले बिना दोहराया और दोहराया जा सकता है। उदाहरण के लिए, नामित क्षेत्रों में मान निर्दिष्ट करने वाले बयानों को कार्यक्रम के अर्थ को बदले बिना दोहराया और दोहराया जा सकता है, यदि वे नाम किसी भी निहित क्रम में मॉड्यूलर wrt हैं। नाम कभी-कभी एक आदेश देते हैं, उदाहरण के लिए सेल पहचानकर्ताओं में उनके कॉलम और पंक्ति की स्थिति शामिल होती है- स्प्रेडशीट पर कुल मिलाकर इसका अर्थ बदल जाता है। अन्यथा, इन गुणों को स्पष्ट रूप से वैश्विक की आवश्यकता होती हैशब्दार्थ की संगति। बयानों के शब्दार्थ को डिजाइन करना आम तौर पर असंभव है, इसलिए यदि वे यादृच्छिक रूप से आदेशित या दोहराए जाते हैं तो वे सुसंगत रहते हैं, क्योंकि क्रम और दोहराव शब्दार्थ के लिए आंतरिक होते हैं। उदाहरण के लिए, "फू मौजूद है" (या निर्माण) और "फू मौजूद नहीं है" (और विनाश)। यदि कोई अभीष्ट शब्दार्थ के यादृच्छिक असंगतता को मानता है, तो कोई इस परिभाषा को सामान्य घोषित संपत्ति के लिए पर्याप्त मानता है। संक्षेप में यह परिभाषा एक सामान्यीकृत परिभाषा के रूप में खाली है क्योंकि यह अर्थविज्ञान के लिए स्थिरता ऑर्थोगोनल बनाने का प्रयास करती है, अर्थात इस तथ्य को टालने के लिए कि शब्दार्थ का ब्रह्मांड गतिशील रूप से अप्राप्य है और इसे वैश्विक सुसंगत प्रतिमान में कैद नहीं किया जा सकता है ।
निचले स्तर के परिचालन शब्दार्थों के (संरचनात्मक मूल्यांकन क्रम) के लिए कम्यूटेटिव और बेमिसाल गुणों की आवश्यकता होती है, जो क्रियात्मक अर्थों को एक घोषित स्थानीयकृत मॉड्यूलर अर्थ में परिवर्तित करता है , जैसे शुद्ध कार्यात्मक प्रोग्रामिंग (अनिवार्य छोरों के बजाय पुनरावृत्ति सहित)। फिर कार्यान्वयन विवरणों का परिचालन क्रम उच्च स्तर के शब्दार्थों की संगति (अर्थात विश्व स्तर पर फैलता है) को प्रभावित नहीं करता है । उदाहरण के लिए, स्प्रेडशीट फ़ार्मुलों के (और सैद्धांतिक रूप से भी दोहराव) के मूल्यांकन का क्रम मायने नहीं रखता है क्योंकि आउटपुट को इनपुटों की प्रतिलिपि नहीं दी जाती है जब तक कि सभी आउटपुट की गणना नहीं की जाती है, अर्थात शुद्ध कार्यों के अनुरूप।
सी, जावा, सी ++, सी #, पीएचपी और जावास्क्रिप्ट विशेष रूप से घोषणात्मक नहीं हैं। कॉप्यूट के सिंटैक्स और पाइथन के सिंटैक्स को घोषित परिणामों के मुकाबले अधिक घोषित किया जाता है , अर्थात सुसंगत सिंटेक्टिक शब्दार्थ जो विलुप्त को खत्म करते हैं इसलिए एक कोड को आसानी से समझने के बाद वे इसे भूल सकते हैं। कॉप्यूट और हास्केल परिचालन शब्दार्थों के निर्धारण को लागू करते हैं और " खुद को दोहराएं नहीं " (डीआरवाई) को प्रोत्साहित करते हैं , क्योंकि वे केवल शुद्ध कार्यात्मक प्रतिमान की अनुमति देते हैं।
2 यहां तक कि जहां हम किसी प्रोग्राम के शब्दार्थ को साबित कर सकते हैं, जैसे कि भाषा कोक के साथ, यह शब्दार्थ में सीमित है जो टाइपिंग में व्यक्त किए गए हैं , और टाइपिंग कभी भी प्रोग्राम के सभी शब्दार्थों पर कब्जा नहीं कर सकता है - जो भाषाओं के लिए भी नहीं हैं पूर्ण रूप से ट्यूरिंग नहीं, उदाहरण के लिए HTML + CSS के साथ असंगत संयोजनों को व्यक्त करना संभव है जो इस प्रकार अपरिभाषित शब्दार्थ हैं।
3 कई स्पष्टीकरण गलत तरीके से दावा करते हैं कि केवल अनिवार्य प्रोग्रामिंग में वाक्यविन्यास आदेश दिए गए हैं। मैंने अनिवार्य और कार्यात्मक प्रोग्रामिंग के बीच इस भ्रम को स्पष्ट किया । उदाहरण के लिए, HTML कथनों का क्रम उनके अर्थ की स्थिरता को कम नहीं करता है।
संपादित करें: मैंने रॉबर्ट हार्पर के ब्लॉग पर निम्नलिखित टिप्पणी पोस्ट की :
कार्यात्मक प्रोग्रामिंग में ... एक चर की भिन्नता की सीमा एक प्रकार है
इस बात पर निर्भर करता है कि कोई व्यक्ति कैसे कार्यात्मक प्रोग्रामिंग से अलग होता है, एक अनिवार्य कार्यक्रम में आपके 'असाइन करने योग्य' का प्रकार उसकी परिवर्तनशीलता पर एक बाध्यता भी हो सकता है।
केवल गैर-मुडल्ड परिभाषा जो मैं वर्तमान में कार्यात्मक प्रोग्रामिंग के लिए सराहना करता हूं) क) प्रथम श्रेणी की वस्तुओं और प्रकारों के रूप में कार्य करता है, ख) छोरों पर पुनरावृत्ति के लिए वरीयता, और / या सी) शुद्ध कार्य- अर्थात वे कार्य जो वांछित शब्दार्थ को प्रभावित नहीं करते हैं। प्रोग्राम जब ज्ञापन ( इस प्रकार पूरी तरह से शुद्ध कार्यात्मक प्रोग्रामिंग परिचालन अर्थार्थिक्स , जैसे मेमोरी आवंटन के प्रभाव के कारण एक सामान्य उद्देश्य के अर्थ शब्दार्थ में मौजूद नहीं है )।
एक शुद्ध कार्य की आदर्श संपत्ति का मतलब है कि इसके चर पर फ़ंक्शन कॉल को इसके मूल्य द्वारा प्रतिस्थापित किया जा सकता है, जो आम तौर पर एक अनिवार्य प्रक्रिया के तर्कों के लिए मामला नहीं है। शुद्ध कार्य इनपुट और परिणाम प्रकारों के बीच अनियोजित राज्य संक्रमणों के लिए घोषणात्मक wrt प्रतीत होते हैं।
लेकिन शुद्ध कार्यों की संरचना ऐसी किसी भी स्थिरता को बनाए नहीं रखती है, क्योंकि शुद्ध कार्यात्मक प्रोग्रामिंग भाषा में साइड-इफेक्ट (वैश्विक राज्य) की अनिवार्य प्रक्रिया को मॉडल करना संभव है, उदाहरण के लिए हास्केल का इमोनाड और इसके अलावा इसे रोकने के लिए पूरी तरह से असंभव है किसी भी ट्यूरिंग पूर्ण शुद्ध कार्यात्मक प्रोग्रामिंग भाषा।
जैसा कि मैंने 2012 में लिखा था जो आपके हाल के ब्लॉग में टिप्पणियों की समान सहमति के लिए लगता है , कि घोषणात्मक प्रोग्रामिंग इस धारणा को पकड़ने की कोशिश है कि इच्छित शब्दार्थ कभी अपारदर्शी नहीं हैं। अपारदर्शी शब्दार्थ के उदाहरण क्रम पर निर्भरता हैं, संचालन शब्दार्थ परत पर उच्च-स्तरीय शब्दार्थ के उन्मूलन पर निर्भरता (जैसे जातें रूपांतरण नहीं हैं और सामान्यीकृत उच्च स्तर के शब्दार्थ को सीमित करते हैं ), और चर मानों पर निर्भरता की जाँच की जा सकती है (सिद्ध नहीं की जा सकती) सही) प्रोग्रामिंग भाषा द्वारा।
इस प्रकार मैंने यह निष्कर्ष निकाला है कि केवल गैर-ट्यूरिंग पूर्ण भाषाएं घोषणात्मक हो सकती हैं।
इस प्रकार एक घोषणात्मक भाषा की एक स्पष्ट और विशिष्ट विशेषता यह हो सकती है कि इसका उत्पादन जनरेटिव नियमों के कुछ असंख्य सेटों को मानने के लिए सिद्ध किया जा सकता है। उदाहरण के लिए, किसी भी विशिष्ट एचटीएमएल प्रोग्राम के लिए (व्याख्या करने वाले तरीकों में अंतर की अनदेखी करना) जो कि स्क्रिप्टेड नहीं है (यानी ट्यूरिंग पूर्ण नहीं है) तो इसकी आउटपुट परिवर्तनशीलता असंख्य हो सकती है। या अधिक संक्षेप में एक HTML प्रोग्राम इसकी परिवर्तनशीलता का एक शुद्ध कार्य है। Ditto एक स्प्रेडशीट प्रोग्राम इसके इनपुट चर का एक शुद्ध कार्य है।
इसलिए यह मुझे प्रतीत होता है कि घोषणात्मक भाषाएँ अनबिके पुनरावृत्ति की विरोधी हैं , यानी गोडेल की दूसरी अपूर्णता प्रमेय आत्म-संदर्भित प्रमेयों को सिद्ध नहीं किया जा सकता है।
लेसी लामपोर्ट ने इस बारे में एक कहानी लिखी कि यूक्लिड ने गॉडल के अधूरे सिद्धांत के बारे में कैसे काम किया होगा, जो प्रोग्रामिंग भाषा के संदर्भ में गणित के प्रमाणों पर लागू होता है, प्रकार और तर्क (करी-हावर्ड पत्राचार, आदि) के बीच बधाई देने के लिए।
घोषणात्मक प्रोग्रामिंग "भाषाओं में प्रोग्रामिंग का कार्य है जो मशीन के परिचालन मॉडल के बजाय डेवलपर के मानसिक मॉडल के अनुरूप है"।
घोषित और अनिवार्य प्रोग्रामिंग के बीच अंतर को संरचित डेटा को पार्स करने की समस्या से अच्छी तरह से समझा जाता है।
एक अनिवार्य कार्यक्रम इनपुट और डेटा उत्पन्न करने के लिए पारस्परिक रूप से पुनरावर्ती कार्यों का उपयोग करेगा। एक घोषणात्मक कार्यक्रम एक व्याकरण व्यक्त करेगा जो डेटा की संरचना को परिभाषित करता है ताकि इसे तब पार्स किया जा सके।
इन दो दृष्टिकोणों के बीच अंतर यह है कि घोषित कार्यक्रम एक नई भाषा बनाता है जो समस्या के मानसिक मॉडल की तुलना में अधिक निकटता से मैप की जाती है, जो कि इसकी मेजबान भाषा है।
मैं इसे समझाता हूं क्योंकि डीपी व्यक्त करने का एक तरीका है
... और जहां एक डिडक्ट इंजन होता है, आमतौर पर लक्ष्यों को खोजने के लिए एक एकीकरण एल्गोरिथ्म के साथ काम करना ।
जहाँ तक मैं बता सकता हूँ, इसका इस्तेमाल प्रोग्ल जैसे प्रोग्रामिंग सिस्टम का वर्णन करने के लिए किया जाने लगा, क्योंकि प्रोलॉग (माना जाता है) एक अमूर्त तरीके से चीजों को घोषित करने के बारे में है।
इसका तेजी से मतलब बहुत कम है, क्योंकि इसमें ऊपर के उपयोगकर्ताओं द्वारा दी गई परिभाषा है। यह स्पष्ट होना चाहिए कि एचकेएस की घोषित प्रोग्रामिंग के विपरीत, हास्केल की घोषित प्रोग्रामिंग के बीच एक खाई है।
घोषणात्मक प्रोग्रामिंग के कुछ अन्य उदाहरण:
डिक्लेरेटिव प्रोग्रामिंग अच्छा है क्योंकि यह आपके मानसिक मॉडल * कोड को सरल बनाने में मदद कर सकता है , और क्योंकि यह अंततः अधिक स्केलेबल हो सकता है।
उदाहरण के लिए, मान लें कि आपके पास एक ऐसा फंक्शन है, जो एरे या लिस्ट में प्रत्येक एलिमेंट को कुछ करता है। पारंपरिक कोड इस तरह दिखेगा:
foreach (object item in MyList)
{
DoSomething(item);
}
वहां कोई बड़ी बात नहीं। लेकिन क्या होगा यदि आप अधिक-घोषणात्मक वाक्यविन्यास का उपयोग करते हैं और इसके बजाय DoSomething () को एक क्रिया के रूप में परिभाषित करते हैं? तो आप इसे इस तरह से कह सकते हैं:
MyList.ForEach(DoSometing);
यह, ज़ाहिर है, अधिक संक्षिप्त है। लेकिन मुझे यकीन है कि आपको यहां और वहां कोड की दो लाइनों को बचाने की तुलना में अधिक चिंताएं हैं। उदाहरण के लिए प्रदर्शन। पुराने तरीके से, प्रसंस्करण अनुक्रम में किया जाना था। क्या होगा यदि .ForEach () विधि में आपके लिए यह संकेत करने का एक तरीका है कि यह समानांतर में, स्वचालित रूप से प्रसंस्करण को संभाल सकता है? अब अचानक आपने अपने कोड को बहुत ही सुरक्षित तरीके से बहु-सूत्रित कर दिया है और केवल एक पंक्ति का कोड बदल दिया है। और, वास्तव में, .Net के लिए एक एक्सटेंशन है जो आपको बस ऐसा करने देता है।
यह इस बात पर निर्भर करता है कि आप पाठ का उत्तर कैसे प्रस्तुत करते हैं। कुल मिलाकर आप कार्यक्रम को एक निश्चित दृष्टिकोण से देख सकते हैं लेकिन यह निर्भर करता है कि आप समस्या को किस कोण पर देखते हैं। मैं आपको कार्यक्रम के साथ आरंभ करूंगा: डिम बस, कार, समय, ऊंचाई के रूप में अखंड
फिर से यह निर्भर करता है कि समस्या समग्र रूप से क्या है। कार्यक्रम के कारण आपको इसे छोटा करना पड़ सकता है। आशा है कि यह मदद करता है और प्रतिक्रिया की जरूरत है अगर यह नहीं करता है। धन्यवाद।