कई लेखों पर, कार्यात्मक प्रोग्रामिंग के लाभों का वर्णन करते हुए, मैंने कार्यात्मक प्रोग्रामिंग भाषाओं को देखा है, जैसे हास्केल, एमएल, स्काला या क्लोजर, को "घोषणात्मक भाषाओं" के रूप में संदर्भित किया गया है जो कि सी / सी ++ / सी # या जावा जैसी अनिवार्य भाषाओं से अलग हैं। मेरा सवाल यह है कि कार्यात्मक प्रोग्रामिंग भाषाओं को अनिवार्य के विपरीत घोषित किया जाता है।
डिक्लेरेटिव और इम्पीरियल प्रोग्रामिंग के बीच के अंतर का वर्णन करते हुए अक्सर सामने आया स्पष्टीकरण यह है कि इंपीरियल प्रोग्रामिंग में आप कंप्यूटर को "कुछ कैसे करें" के रूप में घोषित भाषाओं में "क्या करें" के विपरीत बताते हैं। मेरे पास इस स्पष्टीकरण के साथ समस्या यह है कि आप लगातार सभी प्रोग्रामिंग भाषाओं में दोनों कर रहे हैं। यहां तक कि अगर आप सबसे निचले स्तर की असेंबली में जाते हैं, तब भी आप कंप्यूटर को "क्या करना है" बता रहे हैं, तो आप सीपीयू को दो नंबर जोड़ने के लिए कहते हैं, आप इसे जोड़ने के लिए निर्देश नहीं देते हैं। यदि हम स्पेक्ट्रम के दूसरे छोर पर जाते हैं, तो एक उच्च स्तरीय शुद्ध कार्यात्मक भाषा जैसे हास्केल, आप वास्तव में कंप्यूटर को बता रहे हैं कि किसी विशिष्ट कार्य को कैसे प्राप्त किया जाए, वह यह है कि आपका कार्यक्रम एक विशिष्ट कार्य को प्राप्त करने के लिए निर्देशों का एक क्रम है जो कंप्यूटर को नहीं पता है कि अकेले कैसे प्राप्त किया जाए। मैं समझता हूँ कि हास्केल, क्लोझर, आदि भाषाएँ स्पष्ट रूप से C / C ++ / C # / Java की तुलना में उच्च स्तर की हैं और आलसी मूल्यांकन, अपरिवर्तनीय डेटा संरचना, अनाम फ़ंक्शंस, currying, लगातार डेटा संरचनाओं, आदि जैसी सभी सुविधाएँ प्रदान करती हैं। कार्यात्मक प्रोग्रामिंग संभव और कुशल है, लेकिन मैं उन्हें घोषणात्मक भाषाओं के रूप में वर्गीकृत नहीं करूंगा।
मेरे लिए एक शुद्ध घोषणात्मक भाषा वह होगी जो केवल घोषणाओं में पूरी तरह से समाहित है, ऐसी भाषाओं का एक उदाहरण सीएसएस होगा (हाँ मुझे पता है कि सीएसएस तकनीकी रूप से एक प्रोग्रामिंग भाषा नहीं होगी)। CSS में केवल शैली घोषणाएं हैं जो पृष्ठ के HTML और जावास्क्रिप्ट द्वारा उपयोग की जाती हैं। सीएसएस घोषणाओं के अलावा कुछ और नहीं कर सकता है, यह क्लास फ़ंक्शंस नहीं बना सकता है, अर्थात् फ़ंक्शंस जो शैली को कुछ पैरामीटर के आधार पर प्रदर्शित करने के लिए निर्धारित करते हैं, आप सीएसएस स्क्रिप्ट को निष्पादित नहीं कर सकते हैं, आदि। मेरे लिए एक घोषणात्मक भाषा का वर्णन करता है (नोटिस मैंने घोषणात्मक नहीं कहा था प्रोग्रामिंग भाषा)।
अपडेट करें:
मैं हाल ही में और मेरे पास प्रोलॉग के साथ खेल रहा हूं, प्रोलॉग पूरी तरह से घोषित भाषा के लिए निकटतम प्रोग्रामिंग भाषा है (कम से कम मेरी राय में), अगर यह एकमात्र पूरी तरह से घोषित प्रोग्रामिंग भाषा नहीं है। प्रोलॉग में प्रोग्रामिंग को विस्तृत करने के लिए घोषणाएं की जाती हैं, जो या तो एक तथ्य (एक विशेष कार्य के लिए एक सच्चा कार्य जो लौटाता है) एक राज्य या एक नियम (एक विधेय कार्य जो इनपुट के आधार पर किसी दिए गए शर्त / प्रतिमान के लिए सही हो जाता है), नियम एक पैटर्न मिलान तकनीक का उपयोग करके परिभाषित किया गया है। प्रोलॉग में कुछ भी करने के लिए आप एक चर के साथ विधेय के एक या अधिक इनपुट को प्रतिस्थापित करके ज्ञानकोष को क्वेरी करते हैं और प्रोलॉग चर (ओं) के लिए मान खोजने की कोशिश करते हैं जिसके लिए विधेय सफल होता है।
मेरी बात यह है कि किसी भी प्रकार के अनिवार्य निर्देश नहीं हैं, आप मूल रूप से कंप्यूटर को बता रहे हैं कि वह क्या जानता है और फिर ज्ञान के बारे में पूछ रहा है। कार्यात्मक प्रोग्रामिंग भाषाओं में आप अभी भी निर्देश दे रहे हैं, मान लें, फ़ंक्शन X को कॉल करें और इसमें 1 जोड़ें, आदि, भले ही आप सीधे मेमोरी लोकेशन में हेरफेर नहीं कर रहे हों या कदम से कम्प्यूटेशन स्टेप लिख रहे हों। मैं यह नहीं कहूंगा कि हास्केल, एमएल, स्काला या क्लोजर में प्रोग्रामिंग इस अर्थ में घोषणात्मक है, हालांकि मैं गलत हो सकता हूं। इस अर्थ में उचित, सच्चा, शुद्ध कार्यात्मक प्रोग्रामिंग घोषणात्मक है जो मैंने ऊपर वर्णित किया है।
(let [x 1] (let [x (+ x 2)] (let [x (* x x)] x)))
(आशा है कि आप समझ गए होंगे कि, क्लीजुर)। मेरा मूल प्रश्न यह है कि इस इंट से अलग क्या है x = 1; x += 2; x *= x; return x;
मेरी राय में इसका ज्यादातर वही है।