डिक्लेरेटिव प्रोग्रामिंग (घोषणात्मक प्रोग्रामिंग)

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

परिभाषा
घोषणात्मक प्रोग्रामिंग को अक्सर प्रोग्रामिंग की किसी भी शैली के रूप में परिभाषित किया जाता है जो अनिवार्य प्रोग्रामिंग नहीं है। कई अन्य सामान्य परिभाषाएँ इसे अनिवार्य प्रोग्रामिंग के साथ तुलना करके इसे परिभाषित करने का प्रयास करती हैं। उदाहरण के लिए:

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

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

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

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

उप-प्रतिमान
घोषणात्मक प्रोग्रामिंग एक व्यापक शब्द है जिसमें कई बेहतर ज्ञात प्रोग्रामिंग प्रतिमान शामिल हैं।

बाधा प्रोग्रामिंग
बाधा प्रोग्रामिंग बाधाओं के रूप में चर के बीच संबंध बताती है जो लक्ष्य समाधान के गुणों को निर्दिष्ट करती है। व्यवरोधों का समुच्चय सॉल्वर (कंप्यूटर विज्ञान) है जिसमें प्रत्येक चर को एक मान दिया जाता है ताकि समाधान व्यवरोधों की अधिकतम संख्या के अनुरूप हो। बाधा प्रोग्रामिंग अक्सर अन्य प्रतिमानों का पूरक होता है: कार्यात्मक, तार्किक या यहां तक ​​कि अनिवार्य प्रोग्रामिंग।

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

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

, कुछ सॉफ्टवेयर सिस्टम पारंपरिक उपयोगकर्ता-इंटरफ़ेस मार्कअप भाषाओं (जैसे HTML) को घोषणात्मक मार्कअप के साथ संयोजित करें जो परिभाषित करता है कि बैक-एंड सर्वर सिस्टम को घोषित इंटरफ़ेस का समर्थन करने के लिए क्या करना चाहिए (लेकिन कैसे नहीं)। ऐसी प्रणालियाँ, आमतौर पर एक डोमेन-विशिष्ट XML नाम स्थान का उपयोग करते हुए, SQL डेटाबेस सिंटैक्स के सार या प्रतिनिधित्वात्मक राज्य हस्तांतरण (REST) ​​और SOAP का उपयोग करके वेब सेवाओं के लिए पैरामीटरयुक्त कॉल शामिल कर सकती हैं।

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

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

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

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

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

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

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

एमएल
एमएल (प्रोग्रामिंग भाषा) (1973) मेटा भाषा के लिए खड़ा है। एमएल वैधानिक रूप से टाइप किया गया है, और फ़ंक्शन तर्क और रिटर्न प्रकार एनोटेट किए जा सकते हैं।

एमएल लिस्प की तरह कोष्ठक-विलक्षण नहीं है। निम्नलिखित का एक आवेदन है :

टाइम्स_10 2

यह 20 लौटाता है: int, यानी,, प्रकार का मान. लिस्प की तरह, एमएल प्रक्रिया सूची के अनुरूप है, सूची के सभी तत्वों के माध्यम से एक ही प्रकार होना चाहिए।

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

सेट (गणित) तथ्यों को सेट में ऑब्जेक्ट निर्दिष्ट करके बनाया जाता है। वाक्य-विन्यास है
 * बिल्ली एक जानवर है।


 * चूहा एक जानवर है।


 * टॉम एक बिल्ली है।


 * जेरी एक चूहा है।

विशेषण तथ्यों का उपयोग करके बनाया जाता है
 * बिल्ली बड़ी है।


 * चूहा छोटा होता है।

कोष्ठक के अंदर कई मदों का उपयोग करके संबंध बनाए जाते हैं। हमारे उदाहरण में हमारे पास है  और.
 * चूहा पनीर खाता है।


 * बड़े जानवर छोटे जानवर को खा जाते हैं।

सभी तथ्यों और संबंधों को दर्ज करने के बाद, एक प्रश्न पूछा जा सकता है:
 * क्या टॉम जेरी खाएगा?

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

यह भी देखें

 * प्रोग्रामिंग प्रतिमानों की तुलना
 * आगमनात्मक प्रोग्रामिंग
 * प्रकार के अनुसार प्रोग्रामिंग भाषाओं की सूची#Declarative_languages

बाहरी संबंध

 * Frans Coenen. Characteristics of declarative programming languages. 1999.
 * Robert Harper.
 * What, If Anything, Is A Declarative Language?. 2013.
 * There Is Such A Thing As A Declarative Language, and It’s The World’s Best DSL. 2013.
 * Olof Torgersson. A Note on Declarative Programming Paradigms and the Future of Definitional Programming. 1996.