एफपी समर्थकों ने दावा किया है कि संगामिति आसान है क्योंकि उनके प्रतिमान परस्पर स्थिति से बचते हैं। मुझे नहीं मिला।
मैं इस सामान्य प्रश्न के बारे में किसी ऐसे व्यक्ति के रूप में देखना चाहता था जो एक कार्यात्मक नवजात शिशु है, लेकिन वर्षों से साइड इफेक्ट्स में मेरी आंखों पर निर्भर है और आसान (या विशेष रूप से "सुरक्षित) सहित सभी प्रकार के कारणों के लिए, उन्हें कम करना चाहेगा। कम त्रुटि-प्रवण ") संगामिति। जब मैं अपने कार्यात्मक साथियों पर नज़र रखता हूं और वे क्या कर रहे हैं, घास थोड़ा सा लगता है और कम से कम इस संबंध में, अच्छे की बू आ रही है।
सीरियल एल्गोरिदम
कहा कि, आपके विशिष्ट उदाहरण के बारे में, यदि आपकी समस्या प्रकृति में सीरियल है और A को समाप्त होने तक B निष्पादित नहीं किया जा सकता है, तो वैचारिक रूप से आप समानांतर A में A और B को नहीं चला सकते। आपको पुराने गेम स्टेट का उपयोग करके समानांतर चाल बनाने के आधार पर अपने उत्तर की तरह आदेश निर्भरता को तोड़ने का एक तरीका खोजना होगा, या एक डेटा संरचना का उपयोग करना होगा, जो अन्य उत्तरों में प्रस्तावित आदेश निर्भरता को खत्म करने के लिए स्वतंत्र रूप से संशोधित करने की अनुमति देता है। , या इस तरह का कुछ। लेकिन निश्चित रूप से इस तरह की वैचारिक डिजाइन समस्याओं का एक हिस्सा है जहां आप जरूरी नहीं कि सब कुछ इतनी आसानी से कर सकते हैं क्योंकि चीजें अपरिवर्तनीय हैं। कुछ चीजें बस प्रकृति में धारावाहिक होने वाली हैं जब तक कि आप आदेश निर्भरता को तोड़ने के लिए कुछ स्मार्ट तरीका नहीं ढूंढते हैं, अगर यह संभव है।
आसान संगति
जैसा कि कहा गया है, कई मामलों में जहां हम प्रोग्राम हैं जो स्थानों है कि संभवतः काफी बस संभावना है कि यह की वजह से प्रदर्शन में सुधार कर सकता है में साइड इफेक्ट शामिल parallelize करने में विफल रहे हैं हो सकता है धागा सुरक्षित नहीं हो। उन मामलों में से एक जहां उत्परिवर्तनीय स्थिति (या अधिक विशेष रूप से, बाहरी साइड इफेक्ट्स) को खत्म करने में मदद करता है, क्योंकि मैं देख रहा हूं कि यह "थ्रेड-सेफ" में " थ्रेड-सेफ" हो सकता है या नहीं ।
उस कथन को थोड़ा और ठोस बनाने के लिए, विचार करें कि मैं आपको C में एक छँटाई समारोह को लागू करने के लिए एक कार्य देता हूँ जो एक तुलनित्र को स्वीकार करता है और तत्वों की एक सरणी को सॉर्ट करने के लिए उपयोग करता है। यह काफी सामान्यीकृत होने के लिए है, लेकिन मैं आपको एक आसान धारणा देता हूं कि इसका उपयोग इस तरह के पैमाने (लाखों तत्वों या अधिक) के इनपुट के खिलाफ किया जाएगा कि यह संदेहपूर्वक लाभ होगा कि हमेशा एक मल्टीथ्रेड कार्यान्वयन का उपयोग करें। क्या आप अपने छँटाई समारोह को बढ़ा सकते हैं?
समस्या यह है कि आप नहीं कर सकते क्योंकि तुलनित्र आपके सॉर्टिंग फ़ंक्शन कॉल कर सकते हैंकारण साइड इफेक्ट्स जब तक आप जानते हैं कि वे कैसे लागू होते हैं (या बहुत कम से कम प्रलेखित) उन सभी संभावित मामलों के लिए जो फ़ंक्शन को कम किए बिना असंभव है। एक तुलनित्र एक गैर-परमाणु तरीके से एक वैश्विक चर को अंदर संशोधित करने की तरह घृणित कुछ कर सकता है। तुलनात्मक रूप से 99.9999% ऐसा नहीं कर सकते हैं, लेकिन हम अभी भी इस सामान्यीकृत फ़ंक्शन को केवल 0.00001% मामलों की वजह से साइड इफेक्ट्स का कारण नहीं बना सकते हैं। परिणामस्वरूप आपको एकल-थ्रेडेड और मल्टीथ्रेडेड सॉर्ट फ़ंक्शन दोनों की पेशकश करनी पड़ सकती है और प्रोग्रामर को जिम्मेदारी सौंपी जा सकती है कि वह यह तय करने के लिए कि कौन सा थ्रेड सुरक्षा के आधार पर उपयोग करें। और लोग अभी भी सिंगल-थ्रेडेड संस्करण का उपयोग कर सकते हैं और मल्टीथ्रेड के अवसरों को याद कर सकते हैं क्योंकि वे यह भी अनिश्चित हो सकते हैं कि क्या तुलनित्र थ्रेड-सेफ है,
वहाँ बहुत सारी दिमागी ताकत है कि हर जगह ताले फेंकने के बिना चीजों की धागा सुरक्षा के बारे में तर्कसंगत रूप से शामिल किया जा सकता है जो दूर जा सकता है अगर हमारे पास बस कड़ी मेहनत की गारंटी थी कि कार्य अब और भविष्य के लिए दुष्प्रभाव पैदा नहीं करेंगे। और भय है: व्यावहारिक भय, क्योंकि जिस किसी को भी एक दौड़ की स्थिति को कुछ बार डिबग करना पड़ा है वह शायद कई बार मल्टीथ्रेडिंग के बारे में संकोच करेगा कि वे 110% यकीन नहीं कर सकते कि थ्रेड सुरक्षित है और इस तरह रहेगा। यहां तक कि सबसे अधिक विरोधाभास (जिनमें से मैं शायद कम से कम सीमा रेखा पर हूं) के लिए, शुद्ध कार्य राहत और आत्मविश्वास की भावना प्रदान करता है जिसे हम सुरक्षित रूप से समानांतर में कह सकते हैं।
और यह मुख्य मामलों में से एक है, जहां मैं इसे इतने फायदेमंद के रूप में देखता हूं यदि आप एक कठिन गारंटी प्राप्त कर सकते हैं कि ऐसे कार्य थ्रेड-सुरक्षित हैं जो आपको शुद्ध कार्यात्मक भाषाओं के साथ मिलते हैं। दूसरी बात यह है कि कार्यात्मक भाषाएँ अक्सर पहली जगह में होने वाले दुष्प्रभावों से मुक्त कार्यों को बढ़ावा देती हैं। उदाहरण के लिए, वे आपको लगातार डेटा संरचनाएं प्रदान कर सकते हैं जहां एक बड़े पैमाने पर डेटा संरचना को इनपुट करना काफी हद तक कुशल है और फिर एक नए ब्रांड का उत्पादन करता है जिसमें मूल से स्पर्श किए बिना इसका केवल एक छोटा सा हिस्सा बदल गया है। ऐसी डेटा संरचनाओं के बिना काम करने वाले उन्हें सीधे संशोधित करना चाहते हैं और रास्ते में कुछ थ्रेड सुरक्षा खो सकते हैं।
दुष्प्रभाव
उन्होंने कहा, मैं अपने कार्यात्मक दोस्तों (जो मुझे लगता है कि सुपर कूल हैं) के लिए सभी सम्मान के साथ एक हिस्से से असहमत हैं:
[...] क्योंकि उनके प्रतिमान परस्पर स्थिति से बचते हैं।
यह जरूरी नहीं कि अपरिवर्तनीयता है जो संक्षिप्तता को इतना व्यावहारिक बनाता है जैसा कि मैं इसे देखता हूं। यह ऐसे कार्य हैं जो दुष्प्रभाव पैदा करने से बचते हैं। यदि कोई फ़ंक्शन किसी सरणी को सॉर्ट करने के लिए इनपुट करता है, तो उसे कॉपी करता है, और फिर उसकी सामग्री को सॉर्ट करने के लिए कॉपी को म्यूट करता है और कॉपी को आउटपुट करता है, यह अभी भी थ्रेड-सुरक्षित है क्योंकि एक ही इनपुट से गुजरने पर भी कुछ अपरिवर्तनीय प्रकार के साथ काम करना यह कई धागे से सरणी। इसलिए मुझे लगता है कि बहुत संगामिति-अनुकूल कोड बनाने में अभी भी परिवर्तनशील प्रकारों के लिए एक जगह है, इसलिए बोलने के लिए, हालांकि अपरिवर्तनीय प्रकारों के लिए बहुत सारे अतिरिक्त लाभ हैं, जिनमें लगातार डेटा संरचनाएं शामिल हैं जो मैं उनके अपरिवर्तनीय गुणों के लिए इतना उपयोग नहीं करता हूं, लेकिन साइड इफेक्ट से मुक्त कार्यों को बनाने के लिए सब कुछ गहरी कॉपी करने के खर्च को समाप्त करें।
और फेरबदल के रूप में साइड इफेक्ट्स से मुक्त बनाने के लिए अक्सर ओवरहेड होता है और कुछ अतिरिक्त डेटा की प्रतिलिपि बनाता है, शायद एक अतिरिक्त स्तर का अप्रत्यक्ष, और संभवतः कुछ जीसी लगातार डेटा संरचना के कुछ हिस्सों पर, लेकिन मैं अपने एक दोस्त को देखता हूं जिसके पास है एक 32-कोर मशीन और मैं सोच रहा हूं कि एक्सचेंज शायद इसके लायक है अगर हम अधिक आत्मविश्वास से समानांतर में अधिक चीजें कर सकते हैं।