हास्केल में समवर्तीता और समांतरता के संदर्भ में निर्धारणा को समझ में नहीं आता है। कुछ उदाहरण उपयोगी होंगे। धन्यवादसमवर्ती हैकेल गैर निर्धारक क्यों है जबकि समांतर हैकेल प्राइमेटिव (पैरा और पीएसईसी) निर्धारक?
उत्तर
शुद्ध मूल्यों से निपटने पर, मूल्यांकन का आदेश कोई फर्क नहीं पड़ता। यह अनिवार्य रूप से समांतरता करता है: समानांतर में शुद्ध मूल्यों का मूल्यांकन करना। शुद्ध मूल्यों के विपरीत, आदेश आमतौर पर साइड इफेक्ट्स के साथ कार्यों के लिए मायने रखता है। एक साथ चलने वाले कार्यों को समवर्ती कहा जाता है।
उदाहरण के तौर पर, दो क्रियाओं को putStr "foo"
और putStr "bar"
पर विचार करें। उस क्रम के आधार पर जिसमें उन दो कार्यों का मूल्यांकन किया जाता है, आउटपुट या तो "foobar", "barfoo" या बीच के किसी भी राज्य में होता है। आउटपुट indeterministic है क्योंकि यह मूल्यांकन के विशिष्ट क्रम पर निर्भर करता है।
एक और उदाहरण के रूप में, दो मानों sum [1..10]
और 5 * 3
पर विचार करें। जिस क्रम में उन दोनों का मूल्यांकन किया जाता है, वे हमेशा एक ही परिणाम को कम करते हैं। यह निर्धारवाद ऐसा कुछ है जिसे आप आमतौर पर केवल शुद्ध मानों के साथ गारंटी दे सकते हैं।
समवर्ती और समांतरता दो अलग-अलग चीजें हैं।
Concurrency का मतलब है कि आपके पास गैर-निर्धारक रूप से बातचीत करने वाले कई धागे हैं। उदाहरण के लिए, आपके पास एक चैट सर्वर हो सकता है जहां प्रत्येक ग्राहक को एक थ्रेड द्वारा संभाला जाता है। उस प्रणाली के लिए गैर-निर्धारणा आवश्यक है जिसे आप मॉडल करने का प्रयास कर रहे हैं।
समांतरता केवल आपके प्रोग्राम को तेजी से चलाने के लिए एकाधिक धागे का उपयोग करने के बारे में है। हालांकि, अंतिम परिणाम बिल्कुल वही होना चाहिए जैसे आप अनुक्रमिक रूप से एल्गोरिदम चलाते हैं।
कई भाषाओं में समांतरता के लिए प्राइमेटिव नहीं हैं, इसलिए आपको थ्रेड और ताले जैसे समवर्ती प्राइमेटिव्स का उपयोग करके इसे कार्यान्वित करना होगा। हालांकि, इसका मतलब है कि प्रोग्रामर को यह सुनिश्चित करने के लिए सावधान रहना होगा कि आप गलती से अवांछित गैर-निर्धारणा या अन्य सहमति मुद्दों को पेश न करें। par
और pseq
जैसे स्पष्ट समांतरता प्राइमेटिव के साथ, इनमें से कई चिंताओं को दूर जाना है।
यह है ... एक * वास्तव में * अच्छी व्याख्या। धन्यवाद। –
+1; दूसरे शब्दों में, समांतरता एक अनुकूलन है; समवर्ती अर्थ semantics बदलता है। – ehird
@ehird हां। यह पूरी तरह से मैंने व्यक्त करने की कोशिश की। – fuz
लैंग ओज़ में: 1 डेटाफ्लो वैल्यू केवल एक बार 2 प्रोग्राम का उपयोग कर सकता है, अनबाइंड वैल्यू को बाध्य होने तक इंतजार करना चाहिए। तो व्यवहार दृढ़ता से होता है जब दो थ्रेड एक ही डेटाफ्लो मान का उपयोग करते हैं। – jiamo