घोषणात्मक और अनिवार्य प्रोग्रामिंग के बीच अंतर क्या है? [बन्द है]


541

मैं घोषणात्मक और अनिवार्य प्रोग्रामिंग के लिए परिभाषा खोज रहा हूं जो मेरे लिए कुछ प्रकाश डालेगा। हालाँकि, कुछ भाषाएं जो मैंने पाई हैं उनमें से कुछ का इस्तेमाल किया गया है, उदाहरण के लिए विकिपीडिया पर यह चुनौतीपूर्ण है । क्या किसी के पास वास्तविक दुनिया उदाहरण है कि वे मुझे दिखा सकते हैं कि इस विषय में कुछ परिप्रेक्ष्य ला सकते हैं (शायद सी # में)?


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

जवाबों:


786

घोषणात्मक बनाम अनिवार्य प्रोग्रामिंग का एक महान सी # उदाहरण LINQ है।

अनिवार्य प्रोग्रामिंग के साथ , आप संकलक को बताते हैं कि आप क्या करना चाहते हैं, चरण दर चरण।

उदाहरण के लिए, आइए इस संग्रह से शुरू करें, और विषम संख्या चुनें:

List<int> collection = new List<int> { 1, 2, 3, 4, 5 };

अनिवार्य प्रोग्रामिंग के साथ, हम इसके माध्यम से कदम उठाएंगे, और तय करेंगे कि हमें क्या चाहिए:

List<int> results = new List<int>();
foreach(var num in collection)
{
    if (num % 2 != 0)
          results.Add(num);
}

यहाँ, हम कह रहे हैं:

  1. परिणाम संग्रह बनाएं
  2. संग्रह में प्रत्येक संख्या के माध्यम से कदम
  3. संख्या की जाँच करें, यदि यह विषम है, तो इसे परिणामों में जोड़ें

घोषणात्मक प्रोग्रामिंग के साथ , दूसरी ओर, आप ऐसा कोड लिखते हैं जो यह बताता है कि आप क्या चाहते हैं, लेकिन जरूरी नहीं कि इसे कैसे प्राप्त करें (अपने वांछित परिणाम घोषित करें, लेकिन चरण-दर-चरण नहीं):

var results = collection.Where( num => num % 2 != 0);

यहाँ, हम कह रहे हैं, नहीं "हमें सब कुछ है, जहां यह अजीब है दे दो" "संग्रह के माध्यम से कदम। इस मद की जाँच करें, अगर यह अजीब है, एक परिणाम के संग्रह में जोड़ें।"

कई मामलों में, कोड दोनों डिजाइनों का मिश्रण होगा, भी, इसलिए यह हमेशा काला-सफेद नहीं होता है।


8
+1। हालाँकि, आप पहले LINQ का उल्लेख करते हैं, लेकिन उसके साथ क्या करने के लिए उदाहरण हैं?
ज़ोनो

15
संग्रह.क्या घोषणात्मक LINQ एक्सटेंशन विधियों का उपयोग कर रहा है। यह C # भाषा सुविधाओं का उपयोग नहीं कर रहा है, बल्कि घोषणात्मक API है। मैं यहां संदेश नहीं मिलाना चाहता था, यही कारण है कि मैंने घोषणात्मक विधियों के शीर्ष पर निर्मित भाषा परिवर्धन से परहेज किया।
रीड कोपसे

241
यह मुझे लगता है कि घोषणात्मक प्रोग्रामिंग अमूर्तता की एक परत से अधिक कुछ नहीं है।
Drazen Bjelovuk

8
यह एक अच्छा जवाब है, लेकिन यह अशुद्ध कार्यात्मक और अनिवार्य प्रोग्रामिंग के बीच अंतर का जवाब दे रहा है। collection.Whereघोषणात्मक वाक्यविन्यास का उपयोग नहीं कर रहा है Linq प्रदान करता है - उदाहरण के लिए msdn.microsoft.com/en-us/library/bb397906.aspx देखें , from item in collection where item%2 != 0 select itemघोषणात्मक रूप होगा। किसी फ़ंक्शन को कॉल करना केवल घोषित प्रोग्रामिंग नहीं बन जाता है क्योंकि यह फ़ंक्शन System.Linq नाम स्थान पर है।
पीट किर्कम

30
@PeteKirkham आपके द्वारा उपयोग किया जाने वाला वाक्यविन्यास समस्या नहीं है - घोषणात्मक बनाम अनिवार्यता यह घोषित करने के बारे में अधिक है कि आप क्या करना चाहते हैं बनाम यह समझाने की आवश्यकता है कि वास्तव में यह कैसे होता है। एकीकृत सिंटैक्स या एक्सटेंशन विधि सिंटैक्स का उपयोग करना एक अलग मुद्दा है।
रीड कोपसे

145

घोषणात्मक प्रोग्रामिंग वह है जब आप कहते हैं कि आप क्या चाहते हैं, और अनिवार्य भाषा वह है जब आप कहते हैं कि आप जो चाहते हैं उसे कैसे प्राप्त करें।

पायथन में एक सरल उदाहरण:

# Declarative
small_nums = [x for x in range(20) if x < 5]

# Imperative
small_nums = []
for i in range(20):
    if i < 5:
        small_nums.append(i)

पहला उदाहरण घोषणात्मक है क्योंकि हम सूची बनाने के किसी भी "कार्यान्वयन विवरण" को निर्दिष्ट नहीं करते हैं।

एक सी # उदाहरण में टाई करने के लिए, आम तौर पर, एक घोषणात्मक शैली में LINQ परिणामों का उपयोग करते हुए, क्योंकि आप यह नहीं कह रहे हैं कि आप जो चाहते हैं उसे कैसे प्राप्त करें; आप केवल वही कह रहे हैं जो आप चाहते हैं। आप SQL के बारे में भी यही कह सकते हैं।

डिक्लेरेटिव प्रोग्रामिंग का एक लाभ यह है कि यह कंपाइलर को निर्णय लेने की अनुमति देता है जिसके परिणामस्वरूप बेहतर कोड हो सकता है जो आप हाथ से बना सकते हैं। SQL उदाहरण के साथ चल रहा है, अगर आपके पास एक क्वेरी जैसी थी

SELECT score FROM games WHERE id < 100;

SQL "कंपाइलर" इस ​​क्वेरी को "ऑप्टिमाइज़" कर सकता है क्योंकि यह जानता है कि idयह एक अनुक्रमित फ़ील्ड है - या शायद इसे अनुक्रमित नहीं किया गया है, इस स्थिति में इसे पूरे डेटा सेट पर वैसे भी चलना होगा। या हो सकता है कि एसक्यूएल इंजन जानता है कि तेजी से समानांतर खोज के लिए सभी 8 कोर का उपयोग करने का यह सही समय है। आप एक प्रोग्रामर के रूप में, उन स्थितियों में से किसी के साथ चिंतित नहीं हैं, और आपको उस तरह से किसी विशेष मामले को संभालने के लिए अपना कोड लिखने की आवश्यकता नहीं है।


30
वह पायथन उदाहरण घोषित नहीं है।
जुआनजो कोंटी

18
@Juanjo: यह है decalarative।
लापताफैक्टर

3
यहाँ पहला बयान दूसरे की तुलना में अधिक कैसे घोषित किया गया है?
zenna

17
जुआनज़ो और ज़ेना के साथ सहमति - एक पाश निर्माण जादुई रूप से एक घोषणात्मक कार्यक्रम में परिवर्तित नहीं होता है जब एक छोटे संकेतन में रिफैक्ट किया जाता है।
फेलिक्स फ्रैंक

11
@FelixFrank से असहमत होना, और @ लापताफैक्टर के "साहसिक" कथन की ओर झुकाव। ऐसा करने के लिए पारंपरिक, "पूरी तरह से" घोषणात्मक तरीका है filter(lambda x: x < 5, range(20)), एक छोटी संकेतन में सिर्फ एक और refactoring है। यह सूची बोध अभिव्यक्ति (जिसमें स्पष्ट "मानचित्र" और "फ़िल्टर" अनुभाग हैं) से अलग किसी भी सार्थक तरीके से नहीं है, जो कि अधिक संक्षिप्त संकेतन बनाने के लिए स्पष्ट इरादे के साथ बनाया गया था ( pep 202 देखें )। और इस सूची की समझ इस मामले में अधिक स्पष्ट / मुहावरेदार होगी।
yoniLavi

100

घोषणात्मक बनाम इंपेरेटिव

एक प्रोग्रामिंग प्रतिमान कंप्यूटर प्रोग्रामिंग की एक मौलिक शैली है। चार मुख्य प्रतिमान हैं: अनिवार्य, घोषणात्मक, क्रियात्मक (जिसे घोषित प्रतिमान का सबसेट माना जाता है) और वस्तु-उन्मुख।

घोषणात्मक प्रोग्रामिंग : एक प्रोग्रामिंग प्रतिमान है जो अपने नियंत्रण प्रवाह (कैसे करते हैं) का वर्णन किए बिना एक संगणना के तर्क को व्यक्त करता है (क्या करें)। घोषणात्मक डोमेन विशिष्ट भाषाओं (डीएसएल) के कुछ प्रसिद्ध उदाहरणों में सीएसएस, नियमित अभिव्यक्तियाँ और एसक्यूएल का एक उपसमुच्चय शामिल हैं (उदाहरण के लिए क्वेरीज़, उदाहरण के लिए) HTML, MXML, XAML, XSLT ... जैसे कई मार्कअप भाषाएं अक्सर उपयोगी होती हैं। घोषणात्मक प्रोग्रामिंग निर्देशों के एक सेट के रूप में एक कार्यक्रम के बीच अंतर को धुंधला करने की कोशिश करता है और वांछित जवाब के बारे में एक जोर के रूप में एक कार्यक्रम।

इम्पीरेटिव प्रोग्रामिंग : एक प्रोग्रामिंग प्रतिमान है जो प्रोग्राम स्टेट को बदलने वाले कथनों के संदर्भ में गणना का वर्णन करता है। घोषणात्मक कार्यक्रमों को प्रोग्रामिंग कमांड या गणितीय अभिकथन के रूप में देखा जा सकता है।

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

MSDN में अनिवार्य प्रोग्रामिंग का निम्नलिखित उदाहरण , संख्या 1 से 10 के माध्यम से लूप करता है, और सम संख्या को पाता है।

var numbersOneThroughTen = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//With imperative programming, we'd step through this, and decide what we want:
var evenNumbers = new List<int>();
foreach (var number in numbersOneThroughTen)
{    if (number % 2 == 0)
    {
        evenNumbers.Add(number);
    }
}
//The following code uses declarative programming to accomplish the same thing.
// Here, we're saying "Give us everything where it's odd"
var evenNumbers = numbersOneThroughTen.Select(number => number % 2 == 0);

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


7
क्या आप ऑब्जेक्ट-ओरिएंटेड के लिए विवरण जोड़ सकते हैं?
mbigras


54

उपरोक्त सभी उत्तर और अन्य ऑनलाइन पोस्ट निम्नलिखित हैं:

  • घोषणात्मक प्रोग्रामिंग के साथ , आप कोड लिखते हैं जो बताता है कि आप क्या चाहते हैं, लेकिन जरूरी नहीं कि इसे कैसे प्राप्त करें
  • आपको अनिवार्य प्रोग्रामिंग पर घोषणात्मक प्रोग्रामिंग पसंद करना चाहिए

उन्होंने हमें जो नहीं बताया है, उसे कैसे हासिल किया जाए । कार्यक्रम का हिस्सा अधिक घोषित होने के लिए, अन्य हिस्सों को कार्यान्वयन विवरण (जो अनिवार्य कोड हैं) को छिपाने के लिए अमूर्तता प्रदान करनी चाहिए ।

  • उदाहरण के लिए, LINQ लूप्स (जैसे, जबकि, आदि) की तुलना में अधिक घोषणात्मक है, उदाहरण के लिए, आप list.Where()एक नई फ़िल्टर की गई सूची प्राप्त करने के लिए उपयोग कर सकते हैं । इस काम के लिए, Microsoft ने LINQ abstraction के पीछे सभी भारी उठाने का काम किया है।

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

किसी भी कार्यक्रम में, आपके पास हमेशा अनिवार्य और घोषणात्मक कोड होंगे, जो आपको लक्ष्य करना चाहिए, जो कि सभी अनिवार्य कोड को अमूर्त के पीछे छिपाना है , ताकि कार्यक्रम के अन्य भाग उन्हें घोषणात्मक रूप से उपयोग कर सकें ।

अंत में, हालांकि कार्यात्मक प्रोग्रामिंग और LINQ आपके प्रोग्राम को अधिक घोषणात्मक बना सकती है, आप हमेशा अधिक सार प्रदान करके इसे और भी अधिक घोषणात्मक बना सकते हैं। उदाहरण के लिए:

// JavaScript example

// Least declarative
const bestProducts = [];
for(let i = 0; i < products.length; i++) {
    let product = products[i];
    if (product.rating >= 5 && product.price < 100) {
        bestProducts.push(product);
    }
}


// More declarative
const bestProducts = products.filter(function(product) {
    return product.rating >= 5 && product.price < 100;
});

// Most declarative, implementation details are hidden in a function
const bestProducts = getBestProducts();

पुनश्च कथात्मक प्रोग्रामिंग के चरम नए डोमेन विशिष्ट भाषाओं (डीएसएल) का आविष्कार करने की है:

  1. स्ट्रिंग सर्च : कस्टम अनिवार्यता कोड के बजाय नियमित अभिव्यक्ति
  2. React.js : प्रत्यक्ष DOM हेरफेर के बजाय JSX
  3. AWS CloudFormation : CLI के बजाय YAML
  4. रिलेशनल डाटाबेस : पुराने पढ़े-लिखे एपीआई जैसे कि ISAM या VSAM के बजाय SQL।

वहाँ कथात्मक programmings के कई अच्छे उदाहरण हैं: प्रतिक्रिया , CloudFormation , terraform
engineforce

तो "घोषणात्मक" प्रोग्रामिंग का मतलब सिर्फ उस कोड को स्थानांतरित करना है जो एक फ़ंक्शन को काम करता है?
गिलोयूम एफ

@GuillaumeF। यह डोमेन विशिष्ट अमूर्त बनाने के बारे में है। उदाहरण के लिए, - बैंकिंग में: आप इस तरह के रूप में कार्य करता बनाना चाहिए debit, depositआदि के बजाय दोहरा imparative कोड कीaccount.balance += depositAmount
engineforce

44

मैं एक और उदाहरण जोड़ूंगा जो शायद ही कभी घोषणात्मक / अनिवार्य प्रोग्रामिंग चर्चा में पॉप अप करता है: उपयोगकर्ता इंटरफ़ेस!

C # में, आप विभिन्न तकनीकों का उपयोग करके UI बना सकते हैं।

अनिवार्य छोर पर, आप DirectX या OpenGL का उपयोग बहुत ही अनिवार्य रूप से अपने बटन, चेकबॉक्स, आदि ... लाइन-बाय-लाइन (या वास्तव में, त्रिकोण द्वारा त्रिकोण) आकर्षित करने के लिए कर सकते हैं। यह आप पर निर्भर है कि यूजर इंटरफेस कैसे बनाएं।

घोषणात्मक अंत में, आपके पास WPF है। आप मूल रूप से कुछ एक्सएमएल (हाँ, हाँ, "एक्सएएमएल" तकनीकी रूप से लिखते हैं) और फ्रेमवर्क आपके लिए काम करता है। आप कहते हैं कि उपयोगकर्ता इंटरफ़ेस कैसा दिखता है। यह कैसे करना है यह पता लगाने के लिए सिस्टम पर निर्भर है।

वैसे भी, सिर्फ एक और बात सोचने के लिए। सिर्फ इसलिए कि एक भाषा घोषणात्मक है या अनिवार्यता का मतलब यह नहीं है कि इसमें दूसरे की कुछ विशेषताएं नहीं हैं।

साथ ही, डिक्लेक्टिव प्रोग्रामिंग का एक फायदा यह भी है कि आमतौर पर कोड को पढ़ने से उद्देश्य आसानी से समझ में आ जाता है जबकि इंप्लिमेंट आपको निष्पादन पर बेहतर नियंत्रण देता है।

यह सब का सार:

घोषणा -> whatआप चाहते हैं

अभिमंत्रित -> howआप यह चाहते हैं


27

मुझे कैम्ब्रिज पाठ्यक्रम + उनके उदाहरणों से स्पष्टीकरण पसंद आया:

  • घोषणा - निर्दिष्ट करें कि क्या करना है, कैसे नहीं करना है
    • उदाहरण: HTML यह बताता है कि वेब पेज पर क्या दिखाई देना चाहिए, न कि इसे स्क्रीन पर कैसे खींचा जाना चाहिए
  • आव्रजन - क्या और कैसे दोनों निर्दिष्ट करें
    • int x; - क्या (घोषणात्मक)
    • x=x+1; - किस तरह

"स्क्रीन पर इसे कैसे खींचा जाना चाहिए" ... तो क्या इसका मतलब यह CSSहै कि तब इम्पीरियल है ?
शेफ_कोड

11
नहीं, इसे घोषणात्मक भी माना जा सकता है क्योंकि आप सिर्फ वही कहते हैं जो आप चाहते हैं - "इस सेल को बॉर्डर ब्लू करें" । कल्पना करें कि आप समान सीमा को एक अनिवार्य दृष्टिकोण में आकर्षित करना चाहते हैं (जैसे: जावास्क्रिप्ट)। फिर आपको यह कहने की ज़रूरत है "बिंदु (X1, y1) पर जाएं, इस बिंदु और (x2, y1) के बीच एक नीली रेखा खींचें, (x2, y1) से (x2, y2) तक एक नीली रेखा खींचें, एक नीली रेखा खींचें (एक्स 2, वाई 2) से (एक्स 1, वाई 2), (एक्स 1, वाई 2) से (एक्स 1, वाई 1) तक नीली रेखा खींचते हैं
ROMANIA_engineer

@ROMANIA_engineer, मुझे इस तरह का कैम्ब्रिज कोर्स कहां मिलेगा?
परीक्षण टीम

@testteam, Google पर निम्नलिखित "cl.cam.ac.uk शिक्षण आउप्रोग" खोजें। आप URL से वर्षों को बदल सकते हैं।
ROMANIA_engineer

@ROMANIA_engineer, मिल गया, धन्यवाद
परीक्षण टीम

26

अंतर ज्यादातर अमूर्त के समग्र स्तर के साथ करना है। घोषणा के साथ, कुछ बिंदु पर, आप व्यक्तिगत चरणों से इतनी दूर हैं कि कार्यक्रम में आपके परिणाम प्राप्त करने के तरीके के बारे में बहुत कुछ है।


आप एक निरंतरता पर कहीं गिरते हुए निर्देश के हर टुकड़े को देख सकते हैं:

अमूर्त की डिग्री:

Declarative <<=====|==================>> Imperative

घोषणात्मक वास्तविक विश्व उदाहरण:

  1. लाइब्रेरियन, कृपया मुझे Moby डिक की एक प्रति देखें। (लाइब्रेरियन, अपने विवेक पर अनुरोध करने के लिए सबसे अच्छा तरीका चुनता है)

इंपीरियल रियल वर्ल्ड उदाहरण:

  1. लाइब्रेरी में जाओ
  2. बुक ऑर्गेनाइजेशन सिस्टम (कार्ड कैटलॉग - पुराना स्कूल) खोजें
  3. कार्ड कैटलॉग का उपयोग करने के लिए अनुसंधान (आप भी भूल गए, सही)
  4. पता लगाएँ कि अलमारियों को कैसे लेबल और व्यवस्थित किया जाता है।
  5. एक शेल्फ पर किताबें कैसे व्यवस्थित की जाती हैं, इसका पता लगाएं।
  6. कार्ड सिस्टम से क्रॉस-रेफरेंस बुक लोकेशन, सिस्टम बुक के साथ उक्त पुस्तक खोजने के लिए।
  7. चेक-आउट प्रणाली के लिए पुस्तक लें।
  8. पुस्तक देखें।

क्या यह घोषणा / अनिवार्यता की तुलना में अमूर्तता के बारे में अधिक नहीं है? पुस्तक लाने के लिए आप अभी भी लाइब्रेरियन को प्रेरित कर रहे हैं।
kamathln

अद्यतित उत्तर अधिक पूर्ण होने और समाधान में इस पहलू को शामिल करते हैं।
ल्यूसेंट फॉक्स

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

24

इंपीरियल प्रोग्रामिंग के लिए डेवलपर्स को कदम से कदम को परिभाषित करने की आवश्यकता होती है कि कोड को कैसे निष्पादित किया जाना चाहिए। एक अनिवार्य फैशन में निर्देश देने के लिए, आप कहते हैं, "1 स्ट्रीट पर जाएं, मुख्य पर बाएं मुड़ें, दो ब्लॉकों को ड्राइव करें, मेपल पर दाएं मुड़ें, और बाईं ओर तीसरे घर पर रुकें।" घोषणात्मक संस्करण कुछ इस तरह लग सकता है: "सू के घर पर ड्राइव करें।" एक कहता है कि कुछ कैसे करना है; दूसरे का कहना है कि क्या किया जाना चाहिए।

घोषणात्मक शैली के अनिवार्य शैली पर दो फायदे हैं:

  • यह यात्री को निर्देशों का एक लंबा सेट याद करने के लिए मजबूर नहीं करता है।
  • यह संभव होने पर यात्री को मार्ग का अनुकूलन करने की अनुमति देता है।

कैल्वर्ट, सी कुलकर्णी, डी (2009)। आवश्यक LINQ। एडिसन वेस्ले। 48।


11

इम्पीरेटिव प्रोग्रामिंग कंप्यूटर को स्पष्ट रूप से बता रहा है कि क्या करना है, और इसे कैसे करना है, जैसे ऑर्डर को निर्दिष्ट करना और ऐसे

सी#:

for (int i = 0; i < 10; i++)
{
    System.Console.WriteLine("Hello World!");
}

Declarative वह होता है जब आप कंप्यूटर को बताते हैं कि क्या करना है, लेकिन वास्तव में ऐसा नहीं करना है। Datalog / Prolog पहली भाषा है जो इस संबंध में ध्यान में आती है। मूल रूप से सब कुछ घोषणात्मक है। आप वास्तव में आदेश की गारंटी नहीं दे सकते।

C # बहुत अधिक जरूरी प्रोग्रामिंग लैंग्वेज है, लेकिन कुछ C # फीचर्स Linq की तरह ज्यादा डिक्लेक्टिव हैं

dynamic foo = from c in someCollection
           let x = someValue * 2
           where c.SomeProperty < x
           select new {c.SomeProperty, c.OtherProperty};

एक ही बात को अनिवार्य रूप से लिखा जा सकता है:

dynamic foo = SomeCollection.Where
     (
          c => c.SomeProperty < (SomeValue * 2)
     )
     .Select
     (
          c => new {c.SomeProperty, c.OtherProperty}
     )

(विकिपीडिया लिनक से उदाहरण)


2
आपके पास एक टाइपो है: लिनेक स्टेटमेंट्स घोषणात्मक हैं, न कि अत्यावश्यक (आपके पास "C # फीचर्स अधिक आवश्यक हैं, जैसे कि Linq" को घोषणात्मक पढ़ना चाहिए।
रीड कोपसे

निश्चित (कुछ समय पहले)
McKay

8

कंप्यूटर विज्ञान में, घोषणात्मक प्रोग्रामिंग एक प्रोग्रामिंग प्रतिमान है जो अपने नियंत्रण प्रवाह का वर्णन किए बिना एक संगणना के तर्क को व्यक्त करता है।

से http://en.wikipedia.org/wiki/Declarative_programming

संक्षेप में घोषणात्मक भाषा सरल है क्योंकि इसमें नियंत्रण प्रवाह (बयान, यदि कथन आदि) की जटिलता का अभाव है।

एक अच्छी तुलना ASP.Net 'कोड-पीछे' मॉडल है। आपके पास घोषणात्मक '.ASPX' फाइलें और फिर अनिवार्य 'ASPX.CS' कोड फाइलें हैं। मुझे अक्सर लगता है कि अगर मुझे स्क्रिप्ट के घोषणात्मक आधे हिस्से में मेरी ज़रूरत हो सकती है तो बहुत से लोग इस बात का अनुसरण कर सकते हैं कि क्या किया जा रहा है।


7

फिलिप रॉबर्ट्स से चोरी यहाँ :

  • इम्पीरेटिव प्रोग्रामिंग मशीन को कुछ करने का तरीका बताती है (परिणामस्वरूप आप जो करना चाहते हैं)
  • घोषणात्मक प्रोग्रामिंग मशीन को बताती है कि आप क्या करना चाहते हैं (और कंप्यूटर यह पता लगाता है कि यह कैसे करना है)

दो उदाहरण:

1. एक सरणी में सभी संख्याओं को दोगुना करना

लाजि़मी:

var numbers = [1,2,3,4,5]
var doubled = []

for(var i = 0; i < numbers.length; i++) {
  var newNumber = numbers[i] * 2
  doubled.push(newNumber)
}
console.log(doubled) //=> [2,4,6,8,10]

एलान के तौर पर:

var numbers = [1,2,3,4,5]

var doubled = numbers.map(function(n) {
  return n * 2
})
console.log(doubled) //=> [2,4,6,8,10]

2. एक सूची में सभी आइटम समेटना

लाजि़मी

var numbers = [1,2,3,4,5]
var total = 0

for(var i = 0; i < numbers.length; i++) {
  total += numbers[i]
}
console.log(total) //=> 15

एलान के तौर पर

var numbers = [1,2,3,4,5]

var total = numbers.reduce(function(sum, n) {
  return sum + n
});
console.log(total) //=> 15

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


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

4

इंपीरेटिव प्रोग्रामिंग
एक प्रोग्रामिंग लैंग्वेज है, जिसमें C / C ++, Java, COBOL, FORTRAN, पर्ल और जावास्क्रिप्ट जैसे प्रोग्रामिंग डिसिप्लिन की आवश्यकता होती है। ऐसी भाषाओं में लिखने वाले प्रोग्रामर को डेटा प्रोसेसिंग और प्रोग्रामिंग के ज्ञान के आधार पर, समस्या को हल करने के लिए कार्यों का एक उचित क्रम विकसित करना होगा।

घोषणात्मक प्रोग्रामिंग
एक कंप्यूटर भाषा जिसमें पारंपरिक प्रोग्रामिंग तर्क लिखने की आवश्यकता नहीं होती है; उपयोगकर्ता सी + या जावा जैसी प्रक्रियात्मक प्रोग्रामिंग भाषा में आवश्यक प्रोग्राम चरणों के बजाय इनपुट और आउटपुट को परिभाषित करने पर ध्यान केंद्रित करते हैं।

घोषणात्मक प्रोग्रामिंग उदाहरण CSS, HTML, XML, XSLT, RegX हैं।


2

घोषणात्मक कार्यक्रम अपने कुछ अधिक या कम "सार्वभौमिक" अनिवार्य कार्यान्वयन / वीएम के लिए एक डेटा है।

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

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

PS चौखटे DSL और अनिवार्य के बीच आधा रास्ता है। और सभी आधे रास्ते के समाधान के रूप में ... वे कमियों को जोड़ती हैं, लाभ को नहीं। वे इतने सुरक्षित नहीं हैं और इतनी तेज़ नहीं हैं :) जैक-ऑफ-ऑल-ट्रेड्स हैस्केल को देखें - यह मजबूत सरल एमएल और लचीले मेटाप्रोग प्रोलॉग के बीच आधा है और ... यह एक राक्षस क्या है। आप प्रोलॉग को बसेलियन-केवल कार्यों / विधेय के साथ हास्केल के रूप में देख सकते हैं। और हास्केल के खिलाफ इसका लचीलापन कितना सरल है ...


2

मुझे आश्चर्य है कि किसी ने C # में एक घोषित प्रोग्रामिंग टूल के रूप में एट्रीब्यूट कक्षाओं का उल्लेख क्यों नहीं किया है। इस पृष्ठ के लोकप्रिय उत्तर में LINQ के बारे में सिर्फ एक घोषणात्मक प्रोग्रामिंग टूल के रूप में बात की गई है।

विकिपीडिया के अनुसार

सामान्य घोषणात्मक भाषाओं में डेटाबेस क्वेरी भाषाओं (जैसे, SQL, XQuery), नियमित अभिव्यक्ति, तर्क प्रोग्रामिंग, कार्यात्मक प्रोग्रामिंग और कॉन्फ़िगरेशन प्रबंधन प्रणाली शामिल हैं।

तो LINQ, एक कार्यात्मक वाक्यविन्यास के रूप में, निश्चित रूप से एक घोषणा पद्धति है, लेकिन विन्यास उपकरण के रूप में C # में कक्षाओं को घोषित करें, घोषणात्मक भी हैं। यहाँ इसके बारे में अधिक पढ़ने के लिए एक अच्छा प्रारंभिक बिंदु है: C # विशेषता प्रोग्रामिंग का त्वरित अवलोकन


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

2

मोबाइल ऐप विकास के संदर्भ में बस एक और उदाहरण जोड़ना है। IOS और Android में, हमारे पास इंटरफ़ेस बिल्डर्स हैं, जहां हम ऐप्स के UI को परिभाषित कर सकते हैं।

इन बिल्डर्स का उपयोग करके तैयार किया गया UI प्रकृति में घोषणात्मक है, जहां हम घटकों को खींचते हैं और छोड़ते हैं। वास्तविक ड्राइंग फ्रेमवर्क और सिस्टम द्वारा नीचे और प्रदर्शन किया जाता है।

लेकिन हम पूरे घटकों को कोड में भी आकर्षित कर सकते हैं, और यह प्रकृति में अनिवार्य है।

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


जावा एक परिचित नहीं है BTW
मोर्दकै

1

मेरी समझ से, दर्शन में दोनों शब्दों की जड़ें हैं, ज्ञान के घोषणात्मक और अनिवार्य प्रकार हैं। घोषणात्मक ज्ञान सत्य के सिद्धांत हैं, गणित के स्वयंसिद्ध जैसे तथ्य हैं। यह आपको कुछ बताता है। इम्पीरेटिव, या प्रक्रियात्मक ज्ञान, आपको किसी चीज पर पहुंचने के तरीके के बारे में बताता है। यही एक एल्गोरिथ्म की परिभाषा अनिवार्य रूप से है। यदि आप चाहें, तो कंप्यूटर प्रोग्रामिंग भाषा की अंग्रेजी भाषा से तुलना करें। घोषणात्मक वाक्य कुछ कहते हैं। एक उबाऊ उदाहरण है, लेकिन जावा में दो नंबर एक दूसरे के बराबर हैं या नहीं, यह प्रदर्शित करने का एक घोषणात्मक तरीका है:

public static void main(String[] args)
{
    System.out.print("4 = 4.");
}

दूसरी ओर अंग्रेजी में इम्पीरियल वाक्य, एक आदेश देते हैं या किसी प्रकार का अनुरोध करते हैं। तब, इंपीरियल प्रोग्रामिंग, केवल आदेशों की एक सूची है (यह करो, ऐसा करो)। जावा में उपयोगकर्ता इनपुट को स्वीकार करते समय दो नंबर एक दूसरे के बराबर हैं या नहीं, यह प्रदर्शित करने का एक अनिवार्य तरीका है:

private static Scanner input;    

public static void main(String[] args) 
{
    input = new Scanner(System.in);
    System.out.println();
    System.out.print("Enter an integer value for x: ");
    int x = input.nextInt();
    System.out.print("Enter an integer value for y: ");        
    int y = input.nextInt();

    System.out.println();
    System.out.printf("%d == %d? %s\n", x, y, x == y);
}

अनिवार्य रूप से, घोषणात्मक ज्ञान उन तत्वों पर अमूर्तता की एक परत बनाने के लिए कुछ तत्वों पर छोड़ देता है । डिक्लेरेटिव प्रोग्रामिंग वही करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.