कुछ कार्यात्मक भाषाओं को सॉफ़्टवेयर ट्रांसेक्शनल मेमोरी की आवश्यकता क्यों है?


24

परिभाषा के अनुसार, कार्यात्मक भाषाओं को राज्य चर नहीं बनाए रखना चाहिए। क्यों, फिर, हास्केल, क्लोजर, और अन्य सॉफ्टवेयर ट्रांसेक्शनल मेमोरी (एसटीएम) कार्यान्वयन प्रदान करते हैं? क्या दो दृष्टिकोणों के बीच संघर्ष है?


मैं इस दिलचस्प पेपर को लिंक करना चाहता हूं, जो काफी व्याख्या करता है।
फाल्कन

1
स्पष्ट होने के लिए, सभी कार्यात्मक भाषाएं राज्य बनाए रखती हैं, लेकिन शुद्धता यह निर्धारित करती है कि एक चर का मान एक बार सेट होने के बाद नहीं बदलता है।
रॉबर्ट हार्वे

जवाबों:


13

परस्पर क्रियाशील अवस्था बनाए रखने वाली कार्यात्मक भाषा में कुछ भी गलत नहीं है। यहां तक ​​कि "शुद्ध" कार्यात्मक भाषाओं जैसे हास्केल को वास्तविक दुनिया के साथ बातचीत करने के लिए राज्य बनाए रखने की आवश्यकता है। क्लॉजुर जैसी "प्रभावशाली" कार्यात्मक भाषाएं साइड इफेक्ट की अनुमति देती हैं जिसमें उत्परिवर्तन राज्य शामिल हो सकते हैं।

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

मुझे लगता है कि कार्यात्मक भाषाओं में एसटीएम अधिक सामान्य है, इसके कई कारण हैं:

  • अनुसंधान : एसटीएम एक गर्म अनुसंधान विषय है, और प्रोग्रामिंग भाषा शोधकर्ता अक्सर कार्यात्मक लानुगेस (स्वयं में एक खोज विषय) के साथ काम करना पसंद करते हैं, साथ ही कार्यक्रम के व्यवहार के बारे में "प्रमाण" बनाना आसान है)
  • लॉक कंपोज नहीं करें : एसटीएम को कॉन्टेक्स्ट के लॉक-आधारित एप्रोच के विकल्प के रूप में देखा जा सकता है, जो विभिन्न कंपोनेंट्स को कंपाइल करके जटिल सिस्टम को स्केल करने पर समस्याओं में आने लगता है। यह यकीनन एसटीएम के लिए मुख्य "व्यावहारिक" कारण है
  • एसटीएम अपरिवर्तनीयता के साथ अच्छी तरह से फिट बैठता है : यदि आपके पास एक बड़ी अपरिवर्तनीय संरचना है, तो आप यह सुनिश्चित करना चाहते हैं कि यह अपरिवर्तनीय रहे, इसलिए आप नहीं चाहते कि कोई अन्य धागा अंदर आए और कुछ उप-तत्व को बदल दे। इसी तरह, यदि आप उक्त डेटा संरचना की अपरिवर्तनीयता की गारंटी दे सकते हैं, तो आप अपने एसटीएम सिस्टम में एक स्थिर "मूल्य" के रूप में विश्वास कर सकते हैं।

मैं व्यक्तिगत रूप से क्लोजर को अनुमति देने के दृष्टिकोण के बारे में पसंद करता हूं, लेकिन केवल कड़ाई से नियंत्रित "प्रबंधित संदर्भ" के संदर्भ में जो एसटीएम लेनदेन में भाग ले सकता है। भाषा में बाकी सब कुछ "विशुद्ध रूप से कार्यात्मक" है।

  ;; define two accounts as managed references
  (def account-a (ref 100))
  (def account-b (ref 100))

  ;; define a transactional "transfer" function
  (defn transfer [ref-1 ref-2 amount]
    (dosync
      (if (>= @ref-1 amount)
        (do 
          (alter ref-1 - amount)
          (alter ref-2 + amount))
        (throw (Error. "Insufficient balance!")))))

  ;; make a stranfer
  (transfer account-a account-b 75)

  ;; inspect the accounts
  @account-a
  => 25

  @account-b
  => 175

ध्यान दें कि उपरोक्त कोड पूरी तरह से लेन-देन और परमाणु है - एक बाहरी पर्यवेक्षक जो दूसरे लेनदेन के भीतर दो शेष राशि को पढ़ता है, उसे हमेशा एक सुसंगत परमाणु स्थिति दिखाई देगी, अर्थात दो शेष राशि हमेशा 200 के योग होंगी। लॉक-आधारित संगामिति के साथ, यह आश्चर्यजनक रूप से कठिन समस्या है। कई जटिल संस्थाओं के साथ एक बड़ी जटिल प्रणाली में हल करने के लिए।

कुछ अतिरिक्त ज्ञानोदय के लिए, रिच हिकी इस वीडियो में क्लजुरे के एसटीएम को समझाने का एक उत्कृष्ट काम करता है


3

परिभाषा के अनुसार, कार्यात्मक भाषाओं को राज्य चर नहीं बनाए रखना चाहिए

आपकी परिभाषा गलत है। भाषा जो राज्य को बनाए नहीं रख सकती है, उसका उपयोग नहीं किया जा सकता है।

कार्यात्मक और अनिवार्य भाषाओं के बीच का अंतर यह नहीं है कि उनमें से एक में राज्य है और दूसरा नहीं है। यह एक तरह से वे राज्य बनाए रखते हैं।

इंपीरियल भाषाओं में पूरे कार्यक्रम में राज्य का प्रसार है।

कार्यात्मक भाषाएं अलग-अलग प्रकार के हस्ताक्षर के माध्यम से राज्य को स्पष्ट रूप से अलग और बनाए रखती हैं। और यही कारण है कि वे एसटीएम जैसे परिष्कृत राज्य प्रबंधन तंत्र प्रदान करते हैं।


2

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


आप शायद उत्परिवर्ती राज्य का मतलब है। सभी कार्यक्रम राज्य बनाए रखते हैं, यहां तक ​​कि कार्यात्मक भी।
रॉबर्ट हार्वे

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