इंपीरियल के विपरीत कार्यात्मक प्रोग्रामिंग भाषाओं को क्या घोषित करता है?


17

कई लेखों पर, कार्यात्मक प्रोग्रामिंग के लाभों का वर्णन करते हुए, मैंने कार्यात्मक प्रोग्रामिंग भाषाओं को देखा है, जैसे हास्केल, एमएल, स्काला या क्लोजर, को "घोषणात्मक भाषाओं" के रूप में संदर्भित किया गया है जो कि सी / सी ++ / सी # या जावा जैसी अनिवार्य भाषाओं से अलग हैं। मेरा सवाल यह है कि कार्यात्मक प्रोग्रामिंग भाषाओं को अनिवार्य के विपरीत घोषित किया जाता है।

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

मेरे लिए एक शुद्ध घोषणात्मक भाषा वह होगी जो केवल घोषणाओं में पूरी तरह से समाहित है, ऐसी भाषाओं का एक उदाहरण सीएसएस होगा (हाँ मुझे पता है कि सीएसएस तकनीकी रूप से एक प्रोग्रामिंग भाषा नहीं होगी)। CSS में केवल शैली घोषणाएं हैं जो पृष्ठ के HTML और जावास्क्रिप्ट द्वारा उपयोग की जाती हैं। सीएसएस घोषणाओं के अलावा कुछ और नहीं कर सकता है, यह क्लास फ़ंक्शंस नहीं बना सकता है, अर्थात् फ़ंक्शंस जो शैली को कुछ पैरामीटर के आधार पर प्रदर्शित करने के लिए निर्धारित करते हैं, आप सीएसएस स्क्रिप्ट को निष्पादित नहीं कर सकते हैं, आदि। मेरे लिए एक घोषणात्मक भाषा का वर्णन करता है (नोटिस मैंने घोषणात्मक नहीं कहा था प्रोग्रामिंग भाषा)।

अपडेट करें:

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

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


जब आपको उसकी आवश्यकता हो तो @ जिमीहॉफ कहाँ है?

2
1. C # और आधुनिक C ++ बहुत कार्यात्मक भाषाएं हैं। 2. एक समान उद्देश्य को प्राप्त करने के लिए एसक्यूएल, और जावा लिखने के अंतर के बारे में सोचें (शायद कुछ जटिल क्वेरी को जोड़ते हैं)। आप यह भी सोच सकते हैं कि LINQ C में कैसे # सरल
फॉर्च्यून

यह भी स्पष्ट रूप से परिभाषित की तुलना में
भिन्नता

1
अंतर को पहचानने की कुंजी में से एक है जब आप असाइनमेंट ऑपरेटर का उपयोग कर रहे हैं , बनाम एक परिभाषा / घोषणा ऑपरेटर - उदाहरण के लिए हास्केल में कोई असाइनमेंट ऑपरेटर नहीं है । इन दोनों ऑपरेटरों का व्यवहार बहुत अलग है और आपको अपना कोड अलग ढंग से डिजाइन करने के लिए मजबूर करता है।
जिमी होफा

1
दुर्भाग्य से असाइनमेंट ऑपरेटर के बिना भी मैं ऐसा कर सकता हूं (let [x 1] (let [x (+ x 2)] (let [x (* x x)] x)))(आशा है कि आप समझ गए होंगे कि, क्लीजुर)। मेरा मूल प्रश्न यह है कि इस इंट से अलग क्या है x = 1; x += 2; x *= x; return x;मेरी राय में इसका ज्यादातर वही है।
ALXGTV

जवाबों:


16

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

सवाल यह है कि क्या इस तरह का एक दृष्टिकोण समझदार है, और इसके विपरीत, निर्देशों का क्रम बारीकी से गणना परिणाम की घोषणा जैसा दिखता है । CSS के लिए, घोषणात्मक परिप्रेक्ष्य स्पष्ट रूप से अधिक उपयोगी है। सी के लिए, अनिवार्य परिप्रेक्ष्य स्पष्ट रूप से प्रमुख है। हास्केल जैसी भाषाओं के लिए भी…

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

हालांकि, जिस तरह से हास्केल कार्यक्रमों लिखे गए हैं, वे अक्सर सकता है समझदारी के रूप में परिणाम का एक विवरण गणना की जा करने के लिए पढ़ा जा। उदाहरण के लिए, पहले N factorials के योग की गणना करने का कार्यक्रम:

sum_of_fac n = sum [product [1..i] | i <- ..n]

आप इसे डिसुगर कर सकते हैं और इसे एसटीजी परिचालनों के अनुक्रम के रूप में पढ़ सकते हैं, लेकिन परिणाम के विवरण के रूप में इसे पढ़ने के लिए कहीं अधिक स्वाभाविक है (जो, मुझे लगता है, "क्या गणना करें" की तुलना में घोषणात्मक प्रोग्रामिंग की एक अधिक उपयोगी परिभाषा है:) परिणाम [1..i]सभी i= 0,…, n के उत्पादों का योग है । और यह लगभग किसी भी सी प्रोग्राम या फ़ंक्शन की तुलना में अधिक घोषणात्मक है।


1
मैंने यह प्रश्न पूछा है कि बहुत से लोग कार्यात्मक प्रोग्रामिंग को बढ़ावा देने की कोशिश करते हैं क्योंकि कुछ नए विशिष्ट प्रतिमान पूरी तरह से C / C ++ / C # / जावा या यहां तक ​​कि पायथन से भी अलग हो जाते हैं जब वास्तव में कार्यात्मक प्रोग्रामिंग केवल एक अन्य स्तर का रूप होता है अनिवार्य प्रोग्रामिंग।
ALXGTV

यह समझाने के लिए कि मेरा यहाँ क्या मतलब है आप sum_of_fac को परिभाषित कर रहे हैं, लेकिन sum_of_fac अपने आप में बहुत बेकार है जब तक कि आपका छेद आवेदन नहीं करता है, आपको परिणाम का उपयोग कुछ अन्य परिणाम की गणना करने के लिए करने की आवश्यकता है जो अंततः एक विशिष्ट कार्य को प्राप्त करने के लिए बनाता है। कार्य जिसे आपके कार्यक्रम को हल करने के लिए डिज़ाइन किया गया था।
ALXGTV

6
@ALXGTV कार्यात्मक प्रोग्रामिंग है एक बहुत ही अलग प्रतिमान, (वहाँ है कि तुलना में मानदंड प्रोग्रामिंग के लिए और अधिक है यह एक बहुत व्यापक वर्गीकरण है,) भले ही आप आवश्यक के रूप में यह पढ़ने जा रहे अटल। और अन्य कोड इस कोड पर आधारित है, एलान के तौर पर भी पढ़ा जा सकता है: उदाहरण के लिए, map (sum_of_fac . read) (lines fileContent)। बेशक कुछ बिंदु पर मैं / ओ खेल में हो जाता है लेकिन जैसा कि मैंने कहा, यह एक निरंतरता है। हास्केल कार्यक्रमों के हिस्से अधिक आवश्यक हैं, निश्चित रूप से, जैसे C में एक x + yload x; load y; add;

1
@ALXGTV आपका अंतर्ज्ञान सही है: घोषणात्मक प्रोग्रामिंग "बस" कुछ आवश्यक विवरणों पर उच्च स्तर का अमूर्तता प्रदान करता है। मेरा तर्क है कि यह एक बड़ी बात है!
एंड्रेस एफ

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

21

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

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

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


1
यह एक आदर्श उत्तर होगा यदि इसमें एक उदाहरण है। सबसे अच्छा उदाहरण जो मुझे घोषणात्मक बनाम अनिवार्यता के बारे में पता है, वह है लिनक बनाम foreach
रॉबर्ट हार्वे

7

वास्तविक प्रोग्रामिंग की विशेषता जो डिक्लेरेटिव को अनिवार्य प्रोग्रामिंग से अलग करती है, डिक्लेक्टिव स्टाइल में है, जिसे आप अनुक्रमित निर्देश नहीं दे रहे हैं; निचले स्तर पर हाँ CPU इस तरह से काम करता है, लेकिन यह कंपाइलर की चिंता है।

आपको लगता है कि CSS एक "घोषणात्मक भाषा" है, मैं इसे बिल्कुल भी भाषा नहीं कहूंगा। यह JSON, XML, CSV, या INI की तरह एक डेटा संरचना प्रारूप है, बस डेटा को परिभाषित करने के लिए एक प्रारूप है जो कुछ प्रकृति के दुभाषिया के लिए जाना जाता है।

कुछ दिलचस्प दुष्प्रभाव तब होते हैं जब आप असाइनमेंट ऑपरेटर को किसी भाषा से बाहर निकालते हैं, और यह घोषणात्मक भाषाओं में उन सभी step1-step2-step3 अनिवार्य निर्देशों को खोने का वास्तविक कारण होता है।

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

प्रत्येक फ़ंक्शन का केवल एक बयान होता है, यह कथन एकल घोषणा है

अब एक ही कथन को कई कथन के रूप में देखने के कई तरीके हैं, लेकिन उदाहरण के लिए 1 + 3 + (2*4) + 8 - (7 / (8*3))यह केवल प्रवंचना है: यह स्पष्ट रूप से एक ही कथन है, लेकिन यदि आप इसे लिखते हैं ...

1 +
3 +
(
  2*4
) +
8 - 
(
  7 / (8*3)
)

यह संचालन के एक अनुक्रम की उपस्थिति पर ले जा सकता है जो मस्तिष्क के लिए वांछित अपघटन को पहचानना आसान हो सकता है जो लेखक का इरादा था। मैं अक्सर सी # जैसे कोड के साथ ऐसा करता हूं।

people
  .Where(person => person.MiddleName != null)
  .Select(person => person.MiddleName)
  .Distinct();

यह एक एकल कथन है, लेकिन कई में विघटित होने के रूप को दर्शाता है - ध्यान दें कि कोई असाइनमेंट नहीं हैं।

यह भी ध्यान दें, उपरोक्त दोनों विधियों में - जिस तरह से कोड को वास्तव में निष्पादित किया गया है वह उस क्रम में नहीं है जिसे आप तुरंत इसे पढ़ते हैं; क्योंकि यह कोड कहता है कि क्या करना है, लेकिन यह कैसे तय नहीं करता है । ध्यान दें कि ऊपर दिए गए साधारण अंकगणित स्पष्ट रूप से उस अनुक्रम में निष्पादित नहीं होने जा रहे हैं जो इसे बाएं से दाएं लिखा गया है, और उन # 3 विधियों के ऊपर C # उदाहरण में, वास्तव में सभी पुनः प्रवेश कर रहे हैं और अनुक्रम में पूरा होने के लिए निष्पादित नहीं किया गया है, वास्तव में संकलक कोड बनाता है वह वही करेगा जो वह वक्तव्य चाहता है , लेकिन जरूरी नहीं कि आप कैसे मानें।

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

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

sum xs = (head xs) + sum (tail xs)

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


जिस तरह से मैं इसे समझता हूं, आपके उत्तर से, यह है कि शुद्ध कार्यात्मक प्रोग्रामिंग में, पूरा कार्यक्रम कई एकल-अभिव्यक्ति कार्यों से बना है, जबकि अनिवार्य प्रोग्रामिंग कार्यों (प्रक्रियाओं) में एक परिभाषित ऑपरेशन के अनुक्रम के साथ एक से अधिक अभिव्यक्ति शामिल हैं
ALXGTV

1 + 3 + (2 * 4) + 8 - (7 / (8 * 3)) यह वास्तव में कई कथन / भाव हैं, निश्चित रूप से यह इस बात पर निर्भर करता है कि आप एक अभिव्यक्ति के रूप में क्या देखते हैं। यह योग करने के लिए कार्यात्मक प्रोग्रामिंग मूल रूप से अर्धविराम के बिना प्रोग्रामिंग है।
ALXGTV

1
@ALXGTV उस घोषणा और एक अनिवार्य शैली के बीच का अंतर यह है कि यदि गणितीय अभिव्यक्ति कथन थे, तो यह अनिवार्य होगा कि उन्हें लिखित रूप में निष्पादित किया जाए। हालाँकि, क्योंकि यह अत्यावश्यक कथनों का अनुक्रम नहीं है, बल्कि एक अभिव्यक्ति है जो आप चाहते हैं को परिभाषित करता है, क्योंकि यह नहीं कहता है कि , यह आवश्यक नहीं है कि इसे लिखित रूप में निष्पादित किया जाए। इसलिए संकलन अभिव्यक्तियों को कम कर सकता है या इसे शाब्दिक रूप में भी याद कर सकता है। इम्पीरेटिव लैंग्वेज भी ऐसा करती हैं, लेकिन केवल जब आप इसे एक स्टेटमेंट में डालते हैं; एक घोषणा।
जिमी हॉफ

@ALXGTV घोषणाएं रिश्तों को परिभाषित करती हैं, रिश्ते निंदनीय हैं; अगर x = 1 + 2तो x = 3और x = 4 - 1। अनुक्रमित कथन निर्देशों को परिभाषित करते हैं, इसलिए जब x = (y = 1; z = 2 + y; return z;)आपके पास कुछ निंदनीय नहीं होता है, तो कंपाइलर कई तरीकों से कर सकता है - बल्कि यह अनिवार्य है कि कंपाइलर वही करे जो आपने वहां निर्देश दिया था, क्योंकि कंपाइलर आपके निर्देशों के सभी दुष्प्रभावों को नहीं जान सकता है, इसलिए यह हो सकता है ' उन्हें बदल नहीं है।
जिमी हॉफ

आपके पास एक उचित बिंदु है।
ALXGTV

6

मुझे पता है कि मुझे पार्टी में देर हो रही है, लेकिन मुझे दूसरे दिन एक एपिसोड मिला था, इसलिए यहां जाना है ...

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

आइए सरल कोड a = b + cको आधार के रूप में लें और विचार प्राप्त करने के लिए कुछ अलग-अलग भाषाओं में कथन देखें:

जब हम a = b + cएक अनिवार्य भाषा में लिखते हैं, सी की तरह, हम चर के वर्तमान मूल्य को निर्दिष्ट कर रहे हैं और इससे अधिक कुछ नहीं। हम कोई मौलिक बयान नहीं दे रहे हैं कि क्या है। बल्कि, हम बस एक प्रक्रिया में एक कदम पर अमल कर रहे हैं।b + caa

जब हम लिखना a = b + cएक कथात्मक भाषा में, माइक्रोसॉफ्ट एक्सेल की तरह, (हाँ, एक्सेल है हम कर रहे हैं एक प्रोग्रामिंग भाषा है और शायद उन सब का सबसे कथात्मक,) एक रिश्ता जताने के बीच a, bऔर cऐसी है कि वह हमेशा ऐसा करता है aका योग है अन्य दो। यह एक प्रक्रिया का एक कदम नहीं है, यह एक अपरिवर्तनीय है, एक गारंटी है, सत्य की घोषणा है।

कार्यात्मक भाषाएं घोषणात्मक भी हैं, लेकिन लगभग दुर्घटना से। उदाहरण के लिए Haskel में a = b + cभी एक अपरिवर्तनीय संबंध का दावा है, लेकिन केवल क्योंकि bऔर cअपरिवर्तनीय है।

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


0

आप सही हैं कि कंप्यूटर को क्या करना है और कैसे करना है, यह बताने में कोई स्पष्ट अंतर नहीं है।

हालांकि, स्पेक्ट्रम के एक तरफ आप लगभग विशेष रूप से सोचते हैं कि स्मृति में हेरफेर कैसे किया जाए। यही है, एक समस्या को हल करने के लिए, आप इसे कंप्यूटर में "इस मेमोरी स्थान को x पर सेट करें" जैसे सेट करते हैं, फिर उस मेमोरी लोकेशन को y पर सेट करें, मेमोरी लोकेशन z पर जाएं ... "और फिर किसी तरह से आप समाप्त होते हैं। कुछ अन्य स्मृति स्थान में परिणाम।

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

हास्केल, ओटीओएच जैसे लैंगुगेस में, स्मृति पूरी तरह से चली गई है। यह बस मामला नहीं है कि में है

f a b = let y = sum [a..b] in y*y

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

लेकिन बात यह है कि उपरोक्त फ़ंक्शन को समझने के लिए हमें v। Neumann वास्तुकला को आंतरिक बनाने की आवश्यकता नहीं है। न ही हमें इसे चलाने के लिए एक समकालीन कंप्यूटर की आवश्यकता है। उदाहरण के लिए, SKI पथरी के आधार पर काम करने वाली काल्पनिक मशीन के लिए शुद्ध FP भाषा में कार्यक्रमों का अनुवाद करना आसान होगा। अब C प्रोग्राम के साथ भी यही कोशिश करें!

मेरे लिए एक शुद्ध घोषणात्मक भाषा वह होगी जो पूरी तरह से केवल घोषणाओं से युक्त हो

यह पर्याप्त मजबूत नहीं है, IMHO। यहां तक ​​कि सी कार्यक्रम भी घोषणाओं का एक क्रम है। मुझे लगता है कि हमें घोषणाओं को आगे बढ़ाना होगा। उदाहरण के लिए, वे हमें बता रहे हैं कुछ क्या है (कथात्मक) या यह क्या करता है (अनिवार्य)।


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