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


97

घोषणात्मक और प्रक्रियात्मक प्रोग्रामिंग प्रतिमानों के बीच अंतर क्या है ? क्या आप कुछ उदाहरण प्रदान कर सकते हैं?

क्या अन्य प्रोग्रामिंग प्रतिमान मौजूद हैं?


2
इसी तरह के सवाल: stackoverflow.com/questions/1784664/…
daCoda

जवाबों:


108

अनिवार्य

अनिवार्य प्रोग्रामिंग प्रतिमान के कई उप-प्रतिमान हैं, जैसे प्रक्रियात्मक या वस्तु-उन्मुख प्रोग्रामिंग प्रतिमान।

अनिवार्य प्रोग्रामिंग प्रतिमान में, आप अमूर्तता के विभिन्न डिग्री पर एल्गोरिथ्म चरण-दर-चरण का वर्णन करते हैं।

प्रोग्रामिंग भाषाओं के उदाहरण जो प्रक्रियात्मक प्रतिमान का समर्थन करते हैं:

  • सी (और अधिकांश अन्य विरासत भाषाएँ)
  • PHP, ज्यादातर
  • कुछ अर्थों में, सभी प्रमुख भाषाएँ

वस्तु के उन्मुख

यह आम तौर पर उन भाषाओं को संदर्भित करता है जो प्रकार के पदानुक्रम को प्रदर्शित करते हैं जो आधार प्रकार से व्युत्पन्न प्रकारों तक दोनों तरीकों और राज्य को विरासत में देते हैं, लेकिन इसमें असामान्य प्रोटोटाइप-आधारित जावास्क्रिप्ट भी शामिल है।

प्रोग्रामिंग भाषाओं के उदाहरण जो OO प्रतिमान का समर्थन करते हैं:

  • जावा

कथात्मक

घोषणात्मक प्रोग्रामिंग प्रतिमान के कई उप-प्रतिमान हैं, जैसे कि कार्यात्मक या तर्क प्रोग्रामिंग प्रतिमान।

घोषणात्मक प्रोग्रामिंग प्रतिमान में, आप एक परिणाम या एक लक्ष्य का वर्णन करते हैं, और आप इसे " ब्लैक बॉक्स " के माध्यम से प्राप्त करते हैं । अनिवार्य के विपरीत

प्रोग्रामिंग भाषाओं के उदाहरण जो घोषणात्मक प्रोग्रामिंग प्रतिमान का समर्थन करते हैं:

  • याक
  • पेड़ के ऊपर
  • एसक्यूएल
  • नियमित अभिव्यक्ति
  • लेक्रस
  • XSLT
  • मार्कअप, ट्रॉफ, सीएसएस, वीएचडीएल

कार्यात्मक

फंक्शनल प्रोग्रामिंग साइड इफेक्ट्स और बिना म्यूट स्टेट्स के फंक्शन्स के अनुप्रयोग पर जोर देता है। ऊपर वर्णित घोषणात्मक प्रणालियां कार्यात्मक प्रोग्रामिंग के कुछ पहलुओं को प्रदर्शित करती हैं।

प्रोग्रामिंग भाषाओं के उदाहरण जो घोषणात्मक कार्यात्मक प्रतिमान का समर्थन करते हैं:

  • हास्केल
  • OCaml
  • योजना
  • Erlang
  • एफ #
  • स्काला

61

घोषणात्मक प्रोग्रामिंग वह जगह है जहां आप कहते हैं कि आप क्या करना चाहते हैं, यह कैसे करना है। प्रक्रियात्मक प्रोग्रामिंग के साथ, आपको परिणाम प्राप्त करने के लिए सटीक चरणों को निर्दिष्ट करना होगा।

उदाहरण के लिए, एसक्यूएल प्रक्रियात्मक की तुलना में अधिक घोषणात्मक है, क्योंकि प्रश्न परिणाम का उत्पादन करने के लिए कदम निर्दिष्ट नहीं करते हैं।


2
SQL पर अच्छे उदाहरण के लिए +1। क्या हमारे पास और उदाहरण हो सकते हैं?
मौरिस

5
मौरिस: हो सकता है कि प्रोग्रामिंग भाषा न हो, लेकिन HTML डिक्लेरेटिव है, क्योंकि आप इसका वर्णन करते हैं कि आप क्या चाहते हैं ( बोल्ड में इस बिट वाला पैराग्राफ ), इसके बजाय "ड्रा स्ट्रिंग, माप स्ट्रिंग, अग्रिम स्थिति, आदि" लिखें। एक अन्य उदाहरण प्रोलॉग है, जहां "प्रोग्राम" तथ्यों और संबंधों / कटौती, और एक क्वेरी का एक घोषणापत्र सेट है। प्रोलॉग इंजन क्वेरी के मूल्यांकन का तरीका बताता है: आपको यह बताने की आवश्यकता नहीं है कि ऐसा कैसे किया जाए। अंत में, नियमित अभिव्यक्ति: आप मैच के लिए परीक्षण करने के चरणों को वर्तनी के बजाय पैटर्न का वर्णन करते हैं।
itowlson

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


25

मैं आपको एक वास्तविक दुनिया का उदाहरण देता हूं: मुझे एक कप चाय चाहिए।

प्रक्रियात्मक:

  1. रसोई में जाओ
  2. चीनी, दूध और चाय प्राप्त करें,
  3. उन्हें मिलाएं, और आग पर उबाल आने तक गर्म करें
  4. उसको एक कप में डालकर मेरे पास ले आओ

कथात्मक:

  1. मुझे एक कप चाय पिलाओ।

एक प्रक्रियात्मक भाषा में, आप पूरी प्रक्रिया को परिभाषित करते हैं और इसे करने के लिए चरण प्रदान करते हैं। आप बस आदेश प्रदान करते हैं और परिभाषित करते हैं कि प्रक्रिया कैसे दी जाएगी।

एक घोषणात्मक भाषा में, आप बस कमांड या ऑर्डर सेट करते हैं, और इसे सिस्टम पर करते हैं कि उस ऑर्डर को कैसे पूरा करें। आपको बस अपना परिणाम खोदने की आवश्यकता है कि यह कैसे किया जाना चाहिए।


2
यह अत्यंत सरलीकृत उदाहरण वास्तव में मेरे लिए बिंदु घर (एक बिट) चलाई। लेकिन एक बात अभी भी मुझे परेशान कर रही है, अंतर को समझने की कोशिश कर रही है - क्या होगा अगर "मुझे एक कप चाय न मिले" -कमांड? क्या तब आपको इसे स्वयं बनाना होगा? यदि हां, तो क्या आप प्रक्रियात्मक उदाहरण के समान एक फ़ंक्शन नहीं बनाएंगे? मुझे लगता है कि जो मुझे भ्रमित करता है वह यह है कि ऐसा लगता है कि प्रक्रियात्मक और घोषणात्मक किसी भी विशिष्ट भाषा के निश्चित गुण नहीं हैं , बल्कि आप उस भाषा का उपयोग कैसे करते हैं? आप जावा में "मुझे एक कप चाय पिलाएं" कह सकते हैं , अगर वह उपलब्ध विधि हो ...
मैग्नस डब्ल्यू

3
मुझे आश्चर्य है कि, "1. चाय, अर्ल ग्रे, हॉट" एक बेहतर उदाहरण होगा। यह घोषित कर रहा है कि क्या देने की आवश्यकता है, न कि किन कार्यों को करने की आवश्यकता है ('मुझे प्राप्त करें ...')
जेफुक

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

5

प्रक्रियात्मक प्रोग्रामिंग:

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

घोषणात्मक प्रोग्रामिंग:

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


1

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


0

एक टिप्पणी को संबोधित करने के लिए और शायद दोनों के मतभेदों के बीच एक उदाहरण प्रदान करें। अन्सिएबल प्रक्रियात्मक है जहां कठपुतली या टेराफॉर्म जैसी कोई चीज घोषित होती है। उदाहरण के लिए, आप इस तरह के 10 ec2 इंस्टैंस को तैनात करने के लिए एक ansible yaml फाइल बनाते हैं:
-ec2: काउंट: 10 इमेज: ami-058c6e5b73b074cd2 inst_type: t2.micro

यदि आप उस फ़ाइल को दो बार चलाना चाहते हैं, तो आप 20 t2.micro ec2 उदाहरणों के साथ समाप्त करेंगे। यदि आपने टेराफॉर्म जैसी घोषणात्मक भाषा में समकक्ष लिखा है और इसे दो बार चलाया है तो आपके पास केवल 10 t2.micro इंस्टेंसेस होंगे जो आप इसे कितनी बार चलाते हैं। घोषणा की भाषाएं अंतिम स्थिति बताती हैं। प्रक्रियात्मक भाषाएं वही करती हैं जो आप इसे वर्तमान या अतीत की स्थिति के संबंध में बताते हैं।


-1

तो YAML घोषणात्मक प्रोग्रामिंग भाषा है? क्योंकि हम परिभाषित करते हैं कि वास्तविक तर्क लिखने के बजाय हम क्या चाहते हैं।

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


इस ब्लॉग को देखें linuxacademy.com/blog/linux-academy/ansible-vs-terraform-fight
Lijo Abraham

यह एक बहुत ही
मुखर

-2

प्रक्रियात्मक दृष्टिकोण में आप परिणाम प्राप्त करने के लिए अपने निर्देश को कूटबद्ध करते हैं। घोषणात्मक दृष्टिकोण में आप परिभाषित करते हैं कि समस्या को हल करने के ज्ञान के रूप में क्या हल किया जाना चाहिए। दोनों दृष्टिकोणों में मेरे द्वारा कार्यान्वित प्रक्रियात्मक या घोषणात्मक दृष्टिकोण पर एक नज़र डालें ।

जैसा कि आप उदाहरण में देखेंगे, घोषणात्मक दृष्टिकोण में, आपको समस्या को हल करने के लिए HOW को निर्देश देने की आवश्यकता नहीं है।


आप ऑफ-साइट उदाहरणों को संदर्भित कर रहे हैं जैसे कि वे यहां लिखे गए थे। अपने उदाहरणों को अपने उत्तर के हिस्से के रूप में लाएं।
क्रोनोफिश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.