2015-05-15 7 views
9

मैं वर्तमान में फोरट्रान में जा रहा हूं और मैं pure कीवर्ड को उन कार्यों/subroutines निर्दिष्ट कर रहा हूं जिनके दुष्प्रभाव नहीं हैं।शुद्ध कीवर्ड का उचित उपयोग फोरट्रान

मैं एक किताब है, फोरट्रान 90/95 एस बिसाती द्वारा जो pure कीवर्ड का परिचय लेकिन अजीब नहीं "अच्छा कोडन अभ्यास" प्रदान करता है का उपयोग करता है।

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

तो इसका सबसे अच्छा उपयोग कहां किया जाता है? केवल प्रक्रियाओं में से एक पूरी तरह से गारंटी का कोई साइड इफेक्ट नहीं है? या शायद प्रक्रियाओं में elemental प्रक्रियाओं को बाद में परिवर्तित करने की योजना है? (elemental प्रक्रियाओं को पहले pure होना चाहिए।)

+1

ठीक है, मैं जितनी बार कर सकता हूं 'शुद्ध' दिनचर्या का उपयोग करने की कोशिश करता हूं। यह मुझे साफ कोड लिखने के लिए मजबूर करता है। हालांकि, दिनचर्या का केवल एक छोटा प्रतिशत वास्तव में शुद्ध हो सकता है ... लेकिन मैंने कभी गति या इस तरह के मामले में कोई अंतर नहीं देखा है। –

+2

यह फोरट्रान 90/95 नहीं है लेकिन ध्यान दें कि 'मौलिक' प्रक्रियाओं को 'अशुद्ध' किया जा सकता है। – francescalus

+0

@AlexanderVogt "केवल एक छोटा प्रतिशत"? ऐसा लगता है कि सही ढंग से कोडित होने पर अधिकांश फ़ंक्शन/सबराउटिन 'शुद्ध' होंगे। जैसा कि मैं इसे अपनी पुस्तक से समझता हूं, केवल प्रक्रियाएं जो 'इरादे (इन)' के साथ निर्दिष्ट चर को संशोधित करती हैं या I/O घटक हैं, वे 'शुद्ध' नहीं होंगे। यह अल्पसंख्यक की तरह लगता है, बहुमत नहीं, मेरे लिए। – River

उत्तर

7

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

उन आवश्यक मामलों से परे, PURE का उपयोग करना है या नहीं, मूल रूप से शैली का सवाल है, जो कुछ हद तक व्यक्तिपरक है।

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

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

+0

अन्य उत्तरों 'शुद्ध' के उपयोग के बारे में अन्य उपयोगी जानकारी लाते हैं और इस बारे में और अधिक ध्यान दिया जाना चाहिए कि कैसे 'शुद्ध' कंपेलर को आउट-ऑफ-ऑर्डर समांतरता के साथ ऑप्टिमाइज़ करने देता है। – River

+0

@IanH अगर मैं शुद्ध फ़ंक्शन 'f' परिभाषित करता हूं और इसे' x = f (a * b) + f (a * b) 'अभिव्यक्ति में उपयोग करता हूं, तो क्या यह मामला हमेशा एक बार कहा जाता है? ऐसा लगता है कि यह देखने के लिए परीक्षण संभव है कि यह सच नहीं है, क्योंकि उसमें फ़ंक्शन में कुछ प्रकार के दुष्प्रभाव डालने की आवश्यकता होगी। –

+1

@RaulLaasner No. 'f' को शून्य, एक या दो बार कहा जा सकता है, और यह स्वतंत्र है कि' f' शुद्ध है या नहीं। – IanH

0

यदि आप INTENT(IN) वाले चर को बदलने का प्रयास करते हैं, तो यह संकलित नहीं होगा।

शुद्ध कार्यों में केवल INTENT(IN) तर्क हो सकते हैं, और एक मूल्य लौटाता है जो केवल तर्कों पर निर्भर करता है। एक शुद्ध सबराउटिन INTENT(OUT) और INTENT(INOUT) तर्कों को संशोधित कर सकता है, लेकिन फिर, केवल तर्कों के मूल्य के आधार पर।

दोनों मामलों में: समान तर्क -> एक ही परिणाम।

लाभ यह है कि यह संकलक को गारंटी देता है कि यह प्रोग्राम के व्यवहार को बदले बिना निष्पादन के आदेश (कोड को अनुकूलित करने के क्रम में) को स्वैप कर सकता है।

+1

" शुद्ध कार्यों में केवल 'इंटेंट (आईएन)' तर्क 'हो सकते हैं: सत्य नहीं: डमी तर्क जो पॉइंटर्स या प्रक्रियाओं को निर्दिष्ट करते हैं, उन्हें निर्दिष्ट करने की आवश्यकता नहीं है। – francescalus

+0

मैंने अभी कोशिश की है, और आप सही हैं: एक शुद्ध कार्य हो सकता है एक गैर-'INTENT (IN) 'सूचक डमी तर्क। और इंटेल फोर्ट्रान कंपाइलर भी आपको अपना मूल्य बदलने की अनुमति देता है!' gfortran' एक संकलन समय त्रुटि देता है। – chw21

+0

यदि "इसके मूल्य को बदलें" से आपका मतलब है सूचक के लक्ष्य का मूल्य, तो gfortran एक बग है। पॉइंटर डमी तर्कों के लिए संकेतक सूचक की स्थिति की स्थिति के लिए है, न कि यह क्या इंगित कर रहा है। F2008, सेक्शन 5.3.10, पैराग्राफ 2. –

5

जैसा कि chw21 द्वारा सुझाया गया है, PURE की प्राथमिक प्रेरणा संकलक को बेहतर अनुकूलित करने की अनुमति देना है। विशेष रूप से, किसी फ़ंक्शन के लिए PURE की कमी अज्ञात साइड इफेक्ट्स के कारण समांतरता को रोक देगा। ध्यान दें कि PURE सबरूटीन्स, कार्यों के विपरीत, INTENT(INOUT) तर्क हो सकता है, लेकिन अभी भी दुष्प्रभाव पर प्रतिबंध नहीं है (और एक PURE प्रक्रिया केवल अन्य PURE प्रक्रियाओं कॉल कर सकते हैं कि।)

फोरट्रान 2003 के माध्यम से

तक, ELEMENTAL प्रक्रियाओं परोक्ष हैं PURE । फोरट्रान 2008 में IMPURE उपसर्ग शामिल है जिसका उपयोग उस पहलू को अक्षम करने के लिए ELEMENTAL प्रक्रियाओं के साथ किया जा सकता है।

+0

क्या आपके पास कोई बेंचमार्क उपलब्ध है कि 'शुद्ध' कथन वास्तव में संकलक द्वारा बेहतर अनुकूलन की ओर जाता है? मैं सिर्फ उत्सुक हूं, मैंने अतीत में कोशिश की और 'gfortran' या 'ifort' के साथ कोई लाभ नहीं देख सका। –

+0

यदि मैं 'शुद्ध' कीवर्ड को एक गैर-नियमित दिनचर्या पर रखता हूं तो संकलक एक त्रुटि फेंक देगा। यह स्पष्ट रूप से निम्नानुसार है कि संकलक अपने आप को दृढ़ संकल्प कर सकता है, इसलिए कोई इसे ऐसा करने की उम्मीद कर सकता है और इस प्रकार कोड को अनुकूलित कर सकता है। – agentp

+0

ये उत्तर मुझे 'शुद्ध' कीवर्ड के लाभों को बेहतर ढंग से समझने में मदद करते हैं, लेकिन मुझे अभी भी यह पसंद है कि इसका उपयोग आमतौर पर कैसे किया जाता है। जब भी संभव हो, इसे इस्तेमाल किया जाना चाहिए या यह थोड़ा-सा झुकाव, बहु-थ्रेडिंग, और ऐसी अन्य चीजों के समान है जो केवल सामान्य हैं जहां गति बहुत महत्वपूर्ण है? – River

संबंधित मुद्दे