डिक्लेरेटिव प्रोग्रामिंग (घोषणात्मक प्रोग्रामिंग)
This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages)
(Learn how and when to remove this template message)
|
कंप्यूटर विज्ञान में, घोषणात्मक प्रोग्रामिंग एक प्रोग्रामिंग प्रतिमान है - संरचना और कंप्यूटर प्रोग्राम के तत्वों के निर्माण की एक शैली - जो इसके नियंत्रण प्रवाह का वर्णन किए बिना गणना के तर्क को व्यक्त करती है।[1] कई भाषाएं जो इस शैली को लागू करती हैं, यह वर्णन करके साइड इफेक्ट (कंप्यूटर साइंस) को कम करने या समाप्त करने का प्रयास करती हैं कि प्रोग्राम को डोमेन ज्ञान के संदर्भ में क्या हासिल करना चाहिए, बजाय यह वर्णन करने के कि इसे प्रोग्रामिंग भाषा आदिम के अनुक्रम के रूप में कैसे पूरा किया जाए।[2] (कैसे भाषा की प्रोग्रामिंग भाषा कार्यान्वयन के लिए छोड़ दिया जा रहा है)। यह अनिवार्य प्रोग्रामिंग के विपरीत है, जो कलन विधि को स्पष्ट चरणों में लागू करता है।[3] घोषणात्मक प्रोग्रामिंग अक्सर कार्यक्रम (मशीन) को गणितीय_लॉजिक # फॉर्मल_लॉजिकल_सिस्टम के सिद्धांतों के रूप में मानती है, और उस लॉजिक स्पेस में गणनाओं को कटौती के रूप में मानती है। घोषणात्मक प्रोग्रामिंग समानांतर कंप्यूटिंग लिखने को बहुत आसान बना सकती है।[4] सामान्य घोषणात्मक भाषाओं में क्वेरी भाषाएँ (जैसे, SQL, XQuery), नियमित अभिव्यक्तियाँ, तर्क प्रोग्रामिंग, कार्यात्मक प्रोग्रामिंग और कॉन्फ़िगरेशन प्रबंधन डेटाबेस सिस्टम शामिल हैं।
परिभाषा
घोषणात्मक प्रोग्रामिंग को अक्सर प्रोग्रामिंग की किसी भी शैली के रूप में परिभाषित किया जाता है जो अनिवार्य प्रोग्रामिंग नहीं है। कई अन्य सामान्य परिभाषाएँ इसे अनिवार्य प्रोग्रामिंग के साथ तुलना करके इसे परिभाषित करने का प्रयास करती हैं। उदाहरण के लिए:
- एक उच्च-स्तरीय कार्यक्रम जो वर्णन करता है कि एक संगणना को क्या करना चाहिए।
- कोई भी प्रोग्रामिंग लैंग्वेज जिसमें साइड इफेक्ट (कंप्यूटर साइंस) का अभाव है (या अधिक विशेष रूप से, संदर्भित पारदर्शिता है)
- गणितीय तर्क के स्पष्ट पत्राचार वाली भाषा।[5]
ये परिभाषाएँ काफी हद तक ओवरलैप करती हैं।
घोषणात्मक प्रोग्रामिंग प्रोग्रामिंग की एक गैर-अनिवार्य शैली है जिसमें प्रोग्राम स्पष्ट रूप से सूचीबद्ध आदेशों या चरणों को सूचीबद्ध किए बिना अपने वांछित परिणामों का वर्णन करते हैं जिन्हें निष्पादित किया जाना चाहिए। कार्यात्मक प्रोग्रामिंग और तार्किक प्रोग्रामिंग भाषाओं की एक घोषणात्मक प्रोग्रामिंग शैली की विशेषता है। लॉजिक प्रोग्रामिंग में, प्रोग्राम में लॉजिकल स्टेटमेंट होते हैं, और प्रोग्राम स्टेटमेंट के प्रूफ की खोज करके निष्पादित करता है।
एक शुद्ध कार्यात्मक भाषा में, जैसे कि हास्केल (प्रोग्रामिंग भाषा), सभी कार्य शुद्ध कार्य हैं, और राज्य परिवर्तन केवल ऐसे कार्यों के रूप में प्रस्तुत किए जाते हैं जो राज्य को बदलते हैं, जिसे स्पष्ट रूप से प्रथम श्रेणी के नागरिक के रूप में दर्शाया जाता है। कार्यक्रम। हालांकि शुद्ध कार्यात्मक भाषाएं गैर-अनिवार्य हैं, वे अक्सर किसी फ़ंक्शन के प्रभाव को चरणों की एक श्रृंखला के रूप में वर्णित करने के लिए एक सुविधा प्रदान करती हैं। अन्य कार्यात्मक भाषाएँ, जैसे लिस्प (प्रोग्रामिंग भाषा), OCaml और Erlang (प्रोग्रामिंग भाषा), प्रक्रियात्मक और कार्यात्मक प्रोग्रामिंग के मिश्रण का समर्थन करती हैं।
कुछ तार्किक प्रोग्रामिंग भाषाएं, जैसे कि प्रोलॉग, और डेटाबेस क्वेरी भाषाएं, जैसे कि SQL, जबकि सैद्धांतिक रूप से घोषणात्मक हैं, प्रोग्रामिंग की एक प्रक्रियात्मक शैली का भी समर्थन करती हैं।
उप-प्रतिमान
घोषणात्मक प्रोग्रामिंग एक व्यापक शब्द है जिसमें कई बेहतर ज्ञात प्रोग्रामिंग प्रतिमान शामिल हैं।
बाधा प्रोग्रामिंग
बाधा प्रोग्रामिंग बाधाओं के रूप में चर के बीच संबंध बताती है जो लक्ष्य समाधान के गुणों को निर्दिष्ट करती है। व्यवरोधों का समुच्चय सॉल्वर (कंप्यूटर विज्ञान) है जिसमें प्रत्येक चर को एक मान दिया जाता है ताकि समाधान व्यवरोधों की अधिकतम संख्या के अनुरूप हो। बाधा प्रोग्रामिंग अक्सर अन्य प्रतिमानों का पूरक होता है: कार्यात्मक, तार्किक या यहां तक कि अनिवार्य प्रोग्रामिंग।
डोमेन-विशिष्ट भाषाएं
घोषणात्मक डोमेन-विशिष्ट भाषाओं (DSL) के प्रसिद्ध उदाहरणों में yacc पार्सर जनरेटर इनपुट भाषा, QML, मेक (सॉफ़्टवेयर) बिल्ड विनिर्देशन भाषा, कठपुतली (सॉफ़्टवेयर) की कॉन्फ़िगरेशन प्रबंधन भाषा, रेगुलर एक्सप्रेशन और SQL का एक सबसेट शामिल हैं (चयन प्रश्न, उदाहरण के लिए)। डीएसएल के पास उपयोगी होने का लाभ है जबकि ट्यूरिंग-पूर्ण होने की आवश्यकता नहीं है, जिससे किसी भाषा के लिए विशुद्ध रूप से घोषणात्मक होना आसान हो जाता है।
कई मार्कअप भाषाएँ जैसे HTML, MXML, XAML, XSLT या अन्य उपयोगकर्ता-इंटरफ़ेस मार्कअप भाषाएँ अक्सर घोषणात्मक होती हैं। उदाहरण के लिए, HTML केवल यह बताता है कि वेबपेज पर क्या दिखाई देना चाहिए - यह न तो किसी पेज को प्रस्तुत करने के लिए नियंत्रण प्रवाह और न ही पेज के संभावित ह्यूमन कंप्यूटर इंटरेक्शन को निर्दिष्ट करता है।
As of 2013[update], कुछ सॉफ्टवेयर सिस्टम[which?] पारंपरिक उपयोगकर्ता-इंटरफ़ेस मार्कअप भाषाओं (जैसे HTML) को घोषणात्मक मार्कअप के साथ संयोजित करें जो परिभाषित करता है कि बैक-एंड सर्वर सिस्टम को घोषित इंटरफ़ेस का समर्थन करने के लिए क्या करना चाहिए (लेकिन कैसे नहीं)। ऐसी प्रणालियाँ, आमतौर पर एक डोमेन-विशिष्ट XML नाम स्थान का उपयोग करते हुए, SQL डेटाबेस सिंटैक्स के सार या प्रतिनिधित्वात्मक राज्य हस्तांतरण (REST) और SOAP का उपयोग करके वेब सेवाओं के लिए पैरामीटरयुक्त कॉल शामिल कर सकती हैं।[citation needed]
कार्यात्मक प्रोग्रामिंग
हास्केल (प्रोग्रामिंग लैंग्वेज), स्कीम (प्रोग्रामिंग लैंग्वेज), और मानक एमएल जैसी फंक्शनल प्रोग्रामिंग लैंग्वेज फंक्शन एप्लिकेशन के जरिए एक्सप्रेशन का मूल्यांकन करती हैं। प्रक्रियात्मक प्रोग्रामिंग के संबंधित लेकिन अधिक अनिवार्य प्रोग्रामिंग प्रतिमान के विपरीत, कार्यात्मक प्रोग्रामिंग स्पष्ट अनुक्रमण पर बहुत कम जोर देती है। उदाहरण के लिए, स्कीम (प्रोग्रामिंग लैंग्वेज) में, कई प्रकार के उप-अभिव्यक्तियों के मूल्यांकन का क्रम अपरिभाषित या निहित है।[6] इसके बजाय, संगणनाओं को विभिन्न प्रकार के पुनरावर्ती उच्च-क्रम फ़ंक्शन एप्लिकेशन और फ़ंक्शन संरचना (कंप्यूटर विज्ञान) द्वारा चित्रित किया जाता है, और इस तरह इसे केवल Domain_of_a_functions और कोडोमेन के बीच मैपिंग के एक सेट के रूप में माना जा सकता है। एमएल और लिस्प परिवारों में अधिकांश सहित कई कार्यात्मक भाषाएं, विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग नहीं हैं, और इस प्रकार कार्यक्रमों में साइड इफेक्ट (कंप्यूटर विज्ञान) की शुरुआत की अनुमति देती हैं, हालांकि जब संभव हो तो आमतौर पर इससे बचा जाता है।
संकर भाषाएं
Makefiles, उदाहरण के लिए, एक घोषणात्मक फैशन में निर्भरता निर्दिष्ट करें,[7] लेकिन कार्रवाई करने के लिए अनिवार्य सूची भी शामिल करें। इसी तरह, yacc घोषणात्मक रूप से एक संदर्भ मुक्त व्याकरण निर्दिष्ट करता है, लेकिन इसमें एक मेजबान भाषा से कोड स्निपेट शामिल होता है, जो आमतौर पर अनिवार्य होता है (जैसे सी (प्रोग्रामिंग भाषा))।
तर्क प्रोग्रामिंग
लॉजिक प्रोग्रामिंग लैंग्वेज जैसे प्रोलॉग स्टेट और क्वेरी रिलेशंस। इन प्रश्नों का उत्तर कैसे दिया जाता है, इसकी बारीकियों के कार्यान्वयन और इसके प्रमेय पर निर्भर है, लेकिन आम तौर पर किसी प्रकार के एकीकरण (कंप्यूटिंग) का रूप लेते हैं। कार्यात्मक प्रोग्रामिंग की तरह, कई तर्क प्रोग्रामिंग भाषाएं साइड इफेक्ट्स की अनुमति देती हैं, और परिणामस्वरूप कड़ाई से घोषणात्मक नहीं होती हैं।
मॉडलिंग
भौतिक प्रणालियों के मॉडल, या गणितीय अभ्यावेदन, कंप्यूटर कोड में लागू किए जा सकते हैं जो घोषणात्मक है। कोड में कई समीकरण हैं, अनिवार्य कार्य नहीं हैं, जो व्यवहार संबंधों का वर्णन (घोषणा) करते हैं। जब इस औपचारिकता में एक मॉडल व्यक्त किया जाता है, तो एक कंप्यूटर समाधान एल्गोरिथ्म को सर्वोत्तम रूप से तैयार करने के लिए बीजगणितीय जोड़तोड़ करने में सक्षम होता है। गणितीय कार्य-कारण आमतौर पर भौतिक प्रणाली की सीमाओं पर लगाया जाता है, जबकि प्रणाली का व्यवहारिक विवरण स्वयं घोषणात्मक या आकस्मिक होता है। घोषणात्मक मॉडलिंग भाषाओं और वातावरण में एनालिटिका (सॉफ्टवेयर), नमूना और सिमिल (कंप्यूटिंग) शामिल हैं।[8]
उदाहरण
लिस्प
लिस्प (प्रोग्रामिंग लैंग्वेज) (1958) लिस्ट प्रोसेसर के लिए है।[9] यह प्रक्रिया सूची (सार डेटा प्रकार) के अनुरूप है। सूचियों की सूची बनाकर एक डेटा संरचना बनाई जाती है। स्मृति में, यह एक वृक्ष (डेटा संरचना) बनाता है। आंतरिक रूप से, विशिष्ट लिस्प डेटा की वृक्ष संरचना रिकर्सन (कंप्यूटर विज्ञान) कार्यों के साथ प्रसंस्करण के लिए खुद को अच्छी तरह से उधार देती है।[10] ट्री बनाने का सिंटैक्स व्हॉट्सएप से अलग किए गए तत्व (गणित) को कोष्ठक में बंद करना है। निम्नलिखित तीन तत्वों की एक सूची है। पहले दो तत्व स्वयं दो तत्वों की सूची हैं:
((A B) (HELLO WORLD) 94)
लिस्प में तत्वों को निकालने और पुनर्निर्माण करने का कार्य है।Cite error: Closing </ref>
missing for <ref>
tag आधुनिक लिस्प एकीकृत विकास पर्यावरण कोष्ठक मिलान सुनिश्चित करने में मदद करता है। एक तरफ के रूप में, लिस्प असाइनमेंट स्टेटमेंट और गोटो लूप्स के अनिवार्य भाषा संचालन का समर्थन करता है।Cite error: Closing </ref>
missing for <ref>
tag मेटा भाषा के लिए खड़ा है। एमएल वैधानिक रूप से टाइप किया गया है, और फ़ंक्शन तर्क और रिटर्न प्रकार एनोटेट किए जा सकते हैं।Cite error: Closing </ref>
missing for <ref>
tag प्रोलॉग प्रोग्राम के बिल्डिंग ब्लॉक ऑब्जेक्ट (दर्शन) और अन्य वस्तुओं के साथ उनके संबंध हैं। वस्तुओं का निर्माण उनके बारे में सही तथ्य बताते हुए किया जाता है।[11]
सेट (गणित) तथ्यों को सेट में ऑब्जेक्ट निर्दिष्ट करके बनाया जाता है। वाक्य-विन्यास है setName(object).
- बिल्ली एक जानवर है।
animal(cat).
- चूहा एक जानवर है।
animal(mouse).
- टॉम एक बिल्ली है।
cat(tom).
- जेरी एक चूहा है।
mouse(jerry).
विशेषण तथ्यों का उपयोग करके बनाया जाता है adjective(object).
- बिल्ली बड़ी है।
big(cat).
- चूहा छोटा होता है।
small(mouse).
कोष्ठक के अंदर कई मदों का उपयोग करके संबंध बनाए जाते हैं। हमारे उदाहरण में हमारे पास है verb(object,object)
और verb(adjective,adjective)
.
- चूहा पनीर खाता है।
eat(mouse,cheese).
- बड़े जानवर छोटे जानवर को खा जाते हैं।
eat(big,small).
सभी तथ्यों और संबंधों को दर्ज करने के बाद, एक प्रश्न पूछा जा सकता है:
- क्या टॉम जेरी खाएगा?
?- eat(tom,jerry).
प्रोलॉग का उपयोग लक्ष्य-उन्मुख भाषा बनने के लिए विस्तारित हुआ है।[12] लक्ष्य-उन्मुख अनुप्रयोग में, लक्ष्य को उप-लक्ष्यों की एक सूची प्रदान करके परिभाषित किया जाता है। फिर प्रत्येक उप-लक्ष्य को उसके उप-लक्ष्यों आदि की एक सूची प्रदान करके परिभाषित किया जाता है। यदि उप-लक्ष्यों का एक मार्ग समाधान खोजने में विफल रहता है, तो वह उप-लक्ष्य पीछे हट रहा है और दूसरे पथ का व्यवस्थित रूप से प्रयास किया जाता है।[11] व्यावहारिक अनुप्रयोगों में सबसे छोटी पथ समस्या को हल करना शामिल है[13]और परिवार के पेड़ का उत्पादन।<ref name="cpl_3rd-ch10-247">Wilson, Leslie B. (2001). तुलनात्मक प्रोग्रामिंग भाषाएँ, तीसरा संस्करण. Addison-Wesley. p. 247. ISBN 0-201-71012-9.</रेफरी>
यह भी देखें
- प्रोग्रामिंग प्रतिमानों की तुलना
- आगमनात्मक प्रोग्रामिंग
- प्रकार के अनुसार प्रोग्रामिंग भाषाओं की सूची#Declarative_languages
संदर्भ
- ↑ Lloyd, J.W., Practical Advantages of Declarative Programming
- ↑ "declarative language". FOLDOC. 17 May 2004. Retrieved 26 January 2020.
- ↑ Sebesta, Robert (2016). Concepts of programming languages. Boston: Pearson. ISBN 978-0-13-394302-3. OCLC 896687896.
- ↑ "DAMP 2009: Workshop on Declarative Aspects of Multicore Programming". Cse.unsw.edu.au. 20 January 2009. Retrieved 15 August 2013.
- ↑ Chakravarty, Manuel M. T. (14 February 1997). On the Massively Parallel Execution of Declarative Programs (Doctoral dissertation). Technical University of Berlin. Retrieved 26 February 2015.
In this context, the criterion for calling a programming language declarative is the existence of a clear, mathematically established correspondence between the language and mathematical logic such that a declarative semantics for the language can be based on the model or the proof theory (or both) of the logic.
- ↑ "Revised7 Report on the Algorithmic Language Scheme" (PDF). Scheme Working Group 1. Retrieved 2020-12-05.
- ↑ [1] Archived October 23, 2007, at the Wayback Machine
- ↑ "Declarative modelling". Simulistics. Retrieved 15 August 2013.
- ↑ Jones, Robin; Maynard, Clive; Stewart, Ian (December 6, 2012). The Art of Lisp Programming. Springer Science & Business Media. p. 2. ISBN 9781447117193.
- ↑ Wilson, Leslie B. (2001). तुलनात्मक प्रोग्रामिंग भाषाएँ, तीसरा संस्करण. Addison-Wesley. p. 220. ISBN 0-201-71012-9.
- ↑ 11.0 11.1 Wilson, Leslie B. (2001). तुलनात्मक प्रोग्रामिंग भाषाएँ, तीसरा संस्करण. Addison-Wesley. p. 246. ISBN 0-201-71012-9.
- ↑ Wilson, Leslie B. (2001). तुलनात्मक प्रोग्रामिंग भाषाएँ, तीसरा संस्करण. Addison-Wesley. p. 245. ISBN 0-201-71012-9.
- ↑ Cite error: Invalid
<ref>
tag; no text was provided for refs namedPrologHistory
बाहरी संबंध
- Frans Coenen. Characteristics of declarative programming languages. 1999.
- Robert Harper.
- Olof Torgersson. A Note on Declarative Programming Paradigms and the Future of Definitional Programming. 1996.