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

कंप्यूटर विज्ञान में, डिक्लेरेटिव प्रोग्रामिंग प्रोग्रामिंग प्रतिमान है - संरचना और कंप्यूटर कार्यक्रम (प्रोग्राम) के तत्वों के निर्माण की एक शैली - जो इसके नियंत्रण प्रवाह का वर्णन किए बिना गणना के तर्क को व्यक्त करती है।

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

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

सामान्य घोषणात्मक भाषाओं में डाटाबेस क्वेरी भाषाएँ (जैसे, एसक्यूएल, एक्सक्वेरी), नियमित अभिव्यक्तियाँ, तर्क कार्यरचना, कार्यात्मक कार्यरचना और समाकृतिक प्रबंधन डेटाबेस प्रणाली शामिल हैं।

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

लिस्प में तत्वों को निकालने और पुनर्निर्माण करने का कार्य है। फलन कार (कभी-कभी पहले कहा जाता है) सूची में पहला तत्व लौटाता है। फलन cdr (कभी-कभी 'आराम' कहा जाता है) एक सूची देता है जिसमें सब कुछ होता है लेकिन पहला तत्व नहीं होता है। फलन विपक्ष एक सूची देता है जो दो डेटा तत्वों का संयोजन है। इसलिए, निम्न अभिव्यक्ति सूची X वापस कर देगी:

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

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

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

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

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

ML
ML (1973) का अर्थ "मेटा लैंग्वेज" है। ML वैधानिक रूप से टाइप किया गया है, और फलन तर्क और रिटर्न प्रकार सटीक किए जा सकते हैं।

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

यह "20: int", यानी 20, प्रकार int का मान लौटाता है।

लिस्प की तरह, ML प्रक्रिया सूचियों के अनुरूप है, हालांकि सूची के सभी तत्व एक ही प्रकार के होने चाहिए।

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

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


 * बिल्ली एक जानवर है।


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


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


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

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


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

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


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

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

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

यह भी देखें

 * प्रोग्रामिंग प्रतिमानों की तुलना
 * आगमनात्मक कार्यरचना
 * प्रकार के अनुसार कार्यरचना भाषाओं की सूची#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.