प्योर फंक्शन
कंप्यूटर प्रोग्रामिंग में, एक प्योर फ़ंक्शन एक सबरूटीन होता है जिसमें निम्नलिखित गुण होते हैं:[1][2]
- फ़ंक्शन वापसी विवरण रिलेशनल ऑपरेटर हैं या किसी फ़ंक्शन के समान तर्क के लिए स्थान समानता बनाम सामग्री समानता (स्थानीय स्थैतिक वैरीएबल, गैर-स्थानीय वैरीएबल, परिवर्तनीय मान प्रकार और संदर्भ प्रकार या इनपुट/आउटपुट के साथ कोई भिन्नता नहीं), और
- फ़ंक्शन का कोई साइड इफेक्ट नहीं है (कंप्यूटर विज्ञान) (स्थानीय स्थैतिक वैरीएबल, गैर-स्थानीय वैरीएबल, परिवर्तनशील संदर्भ तर्क या इनपुट/आउटपुट स्ट्रीम का कोई उत्परिवर्तन नहीं)।
कुछ लेखक विशेष रूप से अनिवार्य लैंग्वेज समुदाय से उन सभी कार्यों के लिए प्योर शब्द का उपयोग करते हैं जिनमें उपरोक्त प्रोपर्टी 2 होती है[3][4] (नीचे चर्चा की गई है)।
उदाहरण
प्योर कार्य
C++ फ़ंक्शंस के निम्नलिखित उदाहरण प्योर हैं:
floor
, किसी संख्या का फर्श लौटाना;max
, दो मानों का मैक्सिमम लौटाना.- फ़ंक्शन f, के रूप में परिभाषित किया गया है
का मान
void f() { static std::atomic<unsigned int> x = 0; ++x; }
x
के अन्य आह्वानों के अंदर ही देखा जा सकता हैf()
, और जैसेf()
का मूल्य संप्रेषित नहीं करताx
अपने वातावरण में, यह कार्य से अप्रभेद्य हैvoid f() {}
वह कुछ नहीं करता. ध्यान दें किx
हैstd::atomic
जिससे एकाधिक थ्रेड से संशोधन क्रियान्वित हो सकेंf()
समवर्ती रूप से डेटा रेस का परिणाम नहीं होता है, जिसमें C और C++ में अपरिभाषित व्यवहार होता है.
अप्योर कार्य
निम्नलिखित C++ फ़ंक्शंस अप्योर हैं क्योंकि उनमें उपरोक्त गुण 1 का अभाव है:
- स्थिर वैरिएबल के साथ वापसी मूल्य भिन्नता के कारण
int f() { static int x = 0; ++x; return x; }
- गैर-स्थानीय वैरिएबल के साथ रिटर्न वैल्यू भिन्नता के कारण
इसी कारण से, उदा. C++ लाइब्रेरी फ़ंक्शन
int f() { return x; }
sin()
शुद्ध नहीं है, क्योंकि इसका परिणाम आईईईई राउंडिंग मोड पर निर्भर करता है जिसे रनटाइम पर परिवर्तित किया जा सकता है. - एक परिवर्तनशील संदर्भ तर्क के साथ वापसी मूल्य भिन्नता के कारण
int f(int* x) { return *x; }
- इनपुट स्ट्रीम के साथ रिटर्न वैल्यू भिन्नता के कारण
int f() { int x = 0; std::cin >> x; return x; }
निम्नलिखित C++ फ़ंक्शंस अप्योर हैं क्योंकि उनमें उपरोक्त गुण 2 का अभाव है:
- स्थानीय स्थैतिक वैरिएबल के उत्परिवर्तन के कारण
void f() { static int x = 0; ++x; }
- एक गैर-स्थानीय वैरिएबल के उत्परिवर्तन के कारण
void f() { ++x; }
- एक परिवर्तनशील संदर्भ तर्क के उत्परिवर्तन के कारण
void f(int* x) { ++*x; }
- किसी आउटपुट स्ट्रीम में उत्परिवर्तन के कारण
void f() { std::cout << "Hello, world!" << std::endl; }
निम्नलिखित C++ फ़ंक्शंस अप्योर हैं क्योंकि उनमें उपरोक्त दोनों गुणों 1 और 2 का अभाव है:
- स्थानीय स्थैतिक वैरीएबल के साथ वापसी मूल्य भिन्नता और स्थानीय स्थैतिक चर के उत्परिवर्तन के कारण
int f() { static int x = 0; ++x; return x; }
- इनपुट स्ट्रीम के साथ रिटर्न वैल्यू भिन्नता और इनपुट स्ट्रीम के उत्परिवर्तन के कारण
int f() { int x = 0; std::cin >> x; return x; }
प्योर कार्यों में I/O
I/O स्वाभाविक रूप से अप्योर है: इनपुट ऑपरेशंस संदर्भात्मक पारदर्शिता को अशक्त करते हैं, और आउटपुट ऑपरेशंस दुष्प्रभाव उत्पन्न करते हैं। फिर भी एक ऐसा अर्थ है जिसमें एक फ़ंक्शन इनपुट या आउटपुट निष्पादित कर सकता है और फिर भी प्योर हो सकता है, यदि प्रासंगिक I/O उपकरणों पर संचालन के अनुक्रम को तर्क और परिणाम दोनों के रूप में स्पष्ट रूप से मॉडलिंग किया जाता है, और I/O संचालन लिया जाता है विफल होना जब इनपुट अनुक्रम प्रोग्राम के निष्पादन प्रारंभिक होने के बाद से वास्तव में किए गए संचालन का वर्णन नहीं करता है।
दूसरा बिंदु यह सुनिश्चित करता है कि तर्क के रूप में प्रयोग करने योग्य एकमात्र अनुक्रम प्रत्येक I/O कार्रवाई के साथ बदलना चाहिए; पहला, अनुक्रम तर्कों में बदलाव के कारण अलग-अलग परिणाम देने के लिए I/O-प्रदर्शन फ़ंक्शन में अलग-अलग कॉल की अनुमति देता है।[5][6]
I/O मोनैड एक प्रोग्रामिंग मुहावरा है जिसका उपयोग सामान्यतः प्योर कार्यात्मक लैंग्वेज में I/O करने के लिए किया जाता है।
कंपाइलर अनुकूलन
उपरोक्त प्रोपर्टी 2 वाले फ़ंक्शंस कंपाइलर ऑप्टिमाइज़ेशन विधिों के लिए अनुमति देते हैं जैसे कि सामान्य उपअभिव्यक्ति उन्मूलन और अंकगणितीय ऑपरेटरों के समान लूप अनुकूलन [7] C++ उदाहरण (length
) विधि है, एक स्ट्रिंग का आकार लौटाती है, जो उस मेमोरी सामग्री पर निर्भर करती है जहां स्ट्रिंग इंगित करती है, इसलिए उपरोक्त प्रोपर्टी 1 का अभाव है। फिर भी, एक थ्रेड (कंप्यूटिंग) एकल-थ्रेडेड वातावरण में, निम्नलिखित C++ कोड होता है
std::string s = "Hello, world!";
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int l = 0;
for (int i = 0; i < 10; ++i) {
l += s.length() + a[i];
}
इस प्रकार अनुकूलित किया जा सकता है कि का मान s.length()
लूप से पहले केवल एक बार गणना की जाती है।
कुछ प्रोग्रामिंग लैंग्वेज किसी फ़ंक्शन के लिए प्योर गुण घोषित करने की अनुमति देती हैं:
- फोरट्रान और डी में,
pure
कीवर्ड का उपयोग किसी फ़ंक्शन को केवल साइड-इफेक्ट मुक्त घोषित करने के लिए किया जा सकता है (अर्थात केवल उपरोक्त प्रोपर्टी 2 है)।[8] संकलक घोषणा के शीर्ष पर प्रोपर्टी 1 निकालने में सक्षम हो सकता है।[9] - जीएनयू कंपाइलर संग्रह में,
pure
विशेषता प्रोपर्टी 2 निर्दिष्ट करती है, जबकिconst
विशेषता दोनों गुणों के साथ वास्तव में प्योर फ़ंक्शन निर्दिष्ट करती है।[10] - संकलन-समय फ़ंक्शन निष्पादन की प्रस्तुति करने वाली लैंग्वेज को फ़ंक्शन को प्योर करने की आवश्यकता हो सकती है, कभी-कभी कुछ अन्य बाधाओं के साथ। उदाहरणों में सम्मिलित
constexpr
C++ की (दोनों गुण) सम्मिलित हैं।।[11]
इकाई परीक्षण
चूँकि प्योर फ़ंक्शंस में किसी फ़ंक्शन के समान तर्क के लिए समान रिटर्न स्टेटमेंट होता है, इसलिए वे इकाई परीक्षण के लिए उपयुक्त होते हैं।
यह भी देखें
- संकलन-समय फ़ंक्शन निष्पादन: संकलन समय पर प्योर कार्यों का मूल्यांकन
- नियतात्मक एल्गोरिथ्म
- विप्योर रूप से कार्यात्मक डेटा संरचना
- लैम्ब्डा कैलकुलस
- दुष्प्रभाव (कंप्यूटर विज्ञान)
- पुनर्प्रवेश (कंप्यूटिंग)
- नपुंसकता
- फोरट्रान 95 लैंग्वेज की विशेषताएँ या फोरट्रान में प्योर प्रक्रियाएँ कीवर्ड प्योर कार्यों की व्याख्या करते हैं
- C++11 या कॉन्स्टेक्सपीआर- C++ में सामान्यीकृत स्थिर अभिव्यक्ति कीवर्ड, संकलन-समय पर प्रयोग करने योग्य प्योर कार्यों को एनोटेट करता है
संदर्भ
- ↑ Bartosz Milewski (2013). "हास्केल की मूल बातें". School of Haskell. FP Complete. Archived from the original on 2016-10-27. Retrieved 2018-07-13.
Here are the fundamental properties of a pure function: 1. A function returns exactly the same result every time it's called with the same set of arguments. In other words a function has no state, nor can it access any external state. Every time you call it, it behaves like a newborn baby with blank memory and no knowledge of the external world. 2. A function has no side effects. Calling a function once is the same as calling it twice and discarding the result of the first call.
- ↑ Brian Lonsdorf (2015). "कार्यात्मक प्रोग्रामिंग के लिए प्रोफेसर फ्रिसबी की अधिकतर पर्याप्त मार्गदर्शिका". GitHub. Retrieved 2020-03-20.
A pure function is a function that, given the same input, will always return the same output and does not have any observable side effect.
- ↑ "सामान्य फ़ंक्शन विशेषताएँ - जीएनयू कंपाइलर संग्रह (जीसीसी) का उपयोग करना". gcc.gnu.org, the GNU Compiler Collection. Free Software Foundation, Inc. Retrieved 2018-06-28.
- ↑ Fortran 95 language features#Pure Procedures
- ↑ Peyton Jones, Simon L. (2003). Haskell 98 Language and Libraries: The Revised Report (PDF). Cambridge, United Kingdom: Cambridge University Press. p. 95. ISBN 0-521 826144. Retrieved 17 July 2014.
- ↑ Hanus, Michael. "Curry: An Integrated Functional Logic Language" (PDF). www-ps.informatik.uni-kiel.de. Institut für Informatik, Christian-Albrechts-Universität zu Kiel. p. 33. Archived from the original (PDF) on 25 July 2014. Retrieved 17 July 2014.
- ↑ "सामान्य फ़ंक्शन विशेषताएँ - जीएनयू कंपाइलर संग्रह (जीसीसी) का उपयोग करना". gcc.gnu.org, the GNU Compiler Collection. Free Software Foundation, Inc. Retrieved 2018-06-28.
- ↑ Pure attribute in Fortran
- ↑ Pure attribute in D language
- ↑ "सामान्य कार्य विशेषताएँ". Using the GNU Compiler Collection (GCC. Retrieved 22 July 2021.
- ↑ constexpr attribute in C++