प्योर फंक्शन

From Vigyanwiki

कंप्यूटर प्रोग्रामिंग में, एक प्योर फ़ंक्शन एक सबरूटीन होता है जिसमें निम्नलिखित गुण होते हैं:[1][2]

  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;
    }
    
  • गैर-स्थानीय वैरिएबल के साथ रिटर्न वैल्यू भिन्नता के कारण
    int f() {
      return x;
    }
    
    इसी कारण से, उदा. C++ लाइब्रेरी फ़ंक्शन 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]

इकाई परीक्षण

चूँकि प्योर फ़ंक्शंस में किसी फ़ंक्शन के समान तर्क के लिए समान रिटर्न स्टेटमेंट होता है, इसलिए वे इकाई परीक्षण के लिए उपयुक्त होते हैं।

यह भी देखें

संदर्भ

  1. 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.
  2. 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.
  3. "सामान्य फ़ंक्शन विशेषताएँ - जीएनयू कंपाइलर संग्रह (जीसीसी) का उपयोग करना". gcc.gnu.org, the GNU Compiler Collection. Free Software Foundation, Inc. Retrieved 2018-06-28.
  4. Fortran 95 language features#Pure Procedures
  5. 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.
  6. 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.
  7. "सामान्य फ़ंक्शन विशेषताएँ - जीएनयू कंपाइलर संग्रह (जीसीसी) का उपयोग करना". gcc.gnu.org, the GNU Compiler Collection. Free Software Foundation, Inc. Retrieved 2018-06-28.
  8. Pure attribute in Fortran
  9. Pure attribute in D language
  10. "सामान्य कार्य विशेषताएँ". Using the GNU Compiler Collection (GCC. Retrieved 22 July 2021.
  11. constexpr attribute in C++