क्या कार्यात्मक प्रोग्रामिंग भाषाओं में समय अनुकूलन करने के लिए अधिक अवसर हैं?


10

मैं "रियल वर्ल्ड के लिए कार्यात्मक प्रोग्रामिंग" पुस्तक पढ़ रहा था। यह अनिवार्य और कार्यात्मक प्रोग्रामिंग भाषाओं के बीच तुलना के साथ शुरू हुआ। और यह कहा गया है कि कार्यात्मक प्रोग्रामिंग में 'मूल्य' और 'अभिव्यक्ति' कैसे 'चर' और 'अनिवार्य कार्य' से अलग हैं। चर्चा से मैंने एक विचार विकसित किया कि -

कार्यात्मक प्रोग्रामिंग भाषाओं में उनके अनिवार्य समकक्षों की तुलना में समय अनुकूलन करने का अधिक अवसर होता है।

क्या यह सच है?

जवाबों:


16

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

उसी समय, कुछ भी जो राज्य के बिना गणना की जा सकती है (यानी हैसेल में कुछ भी गैर-मोनडिक), संकलक द्वारा आगे-समय की गणना की जा सकती है, लेकिन इस तरह की गणना महंगी हो सकती है और इस तरह शायद केवल आंशिक रूप से की जाती है।

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


1
+1: साइड-इफ़ेक्ट फ़्री प्रोग्रामिंग, अनुकूलन के लिए बहुत आसान है।
S.Lott

@mathepic: वास्तव में समानांतरकरण (हास्केल में) संकलन-समय और रन-टाइम दोनों पर होता है। संकलन-समय यह तय करता है कि यह एक शार्द (थ्रेड सीड) बनाने के लायक है या नहीं और रन-टाइम प्रक्रियाएं शार्प बनाती हैं, जो आपके द्वारा निर्दिष्ट धागों की संख्या पर निर्भर करती है। यदि आप केवल एक थ्रेड निर्दिष्ट करते हैं, तो शर्ड्स बन जाते हैं, लेकिन वे एक के बाद एक संसाधित होते हैं।
मैथ्यू एम।

2
@ मथेपिक: शुद्धता का एक और उपयोग -> आलस्य और गणना की अनुपस्थिति। यदि आप यह साबित कर सकते हैं कि मूल्य की आवश्यकता नहीं है, तो पूरी तरह से गणना बंद कर दें। यदि इसकी आवश्यकता हो सकती है, तो एक आलसी थंक का उपयोग करें। यदि आप जानते हैं कि इसकी आवश्यकता होगी, तो इसे सीधे आगे लिखें (आलसी उपरि से बचने के लिए)। पवित्रता (सिर्फ) अद्भुत है :)
मैथ्यू एम।

@ मैथ्यू अच्छा बिंदु
वैकल्पिक

1
@ मास्से यहां तक ​​कि आईओ मोनाड भी शुद्ध है। इसका सिर्फ इतना है कि IO सनक "रनिंग" का परिणाम नहीं है।
विकल्प

7

कार्यात्मक भाषाओं के लिए सिद्धांत रूप में अधिक अनुकूल समय अनुकूलन संभावनाएं हैं क्योंकि उनके अनिवार्य समकक्षों के लिए संभवतः सही है।

हालांकि अधिक दिलचस्प है, अगर वे वास्तव में वर्तमान संकलकों में लागू किए जाते हैं और ये अनुकूलन व्यवहार में कितने प्रासंगिक हैं (यानी उत्पादन वातावरण में मुहावरेदार 'वास्तविक जीवन (टीएम) कोड का अंतिम प्रदर्शन, एक पूर्वानुमेय संकलक सेटिंग्स के साथ)।

कुख्यात कंप्यूटर लैंग्वेज बेंचमार्क गेम के लिए हास्केल सबमिशन जैसे (खराब हो सकता है - लेकिन यह ऐसा नहीं है कि इस समय है - इस समय वहां से कुछ भी बेहतर है) यह धारणा दें कि समय की एक महत्वपूर्ण राशि खर्च की गई है मैनुअल ऑप्टिमाइज़ेशन, जो "संभावित संकलक अनुकूलन के कारण" के दावे के साथ सामना insert some property about FP languages hereकरता है, यह ऐसा लगता है कि अनुकूलन एक प्रासंगिक वास्तविकता की तुलना में सैद्धांतिक संभावना से अधिक (वर्तमान में कम से कम) हैं।

मुझे खुशी होगी कि इस बिंदु पर गलत साबित होने के लिए।


1
हास्केल में मैनुअल ऑप्टिमाइज़ेशन का कारण इस तथ्य से अधिक है कि हास्केल में कुछ निश्चित "सीधे" संचालन कुछ समय लेने (एक जटिलता के दृष्टिकोण से) हैं। उदाहरण के लिए, मान लें कि आप किसी सूची का अंतिम तत्व प्राप्त करना चाहते हैं। जावा में, यह एक बहुत ही सरल ऑपरेशन है; हास्केल में, भोले दृष्टिकोण की आवश्यकता है कि आप पूरी सूची को तब तक चलाएं जब तक आप अंत में नहीं आते (सूचियों के आलसी स्वभाव के कारण), यह एक ओ (एन) ऑपरेशन बनाता है। वह (आंशिक रूप से) जहां मैनुअल अनुकूलन आते हैं।
मिपाड़ी

2
मुझे यकीन है कि हास्केल के हाथ लुढ़का अनुकूलन के लिए वैध कारण हैं, लेकिन वे "सीधे" संचालन के लिए आवश्यक होने के कारण छापें देते हैं कि कोड के अनुकूलन के अधिक से अधिक अवसर (वर्तमान में) केवल सिद्धांत में प्रासंगिक हैं।
अलेक्जेंडर बत्तीसी

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

2
@mipadi, लेकिन ऐसा लगता है कि हास्केल एल्गोरिथ्म का सीधा संस्करण अन्य भाषाओं के एल्गोरिदम के सीधे संस्करण के रूप में उतना अच्छा नहीं है। (मैं कार्यात्मक मॉडल और कंप्यूटर वास्तुकला के बीच बेमेल होने के कारण संदेह करता हूं) भले ही यह कोड उत्पन्न करने में अच्छा हो, लेकिन इस समस्या को दूर करने के लिए पर्याप्त नहीं है।
विंस्टन ईवर्ट

>> बुरा जैसा कि यह हो सकता है << - क्या आप जानते हैं कि यह बुरा है या नहीं? "खराब" का सुझाव देने से आपका क्या मतलब है? कृपया विशिष्ट रहें।
इगौई

2

कार्यात्मक शैली में, एक कार्यक्रम के माध्यम से मूल्यों का प्रवाह बहुत, बहुत दृश्यमान (संकलक और प्रोग्रामर दोनों के लिए) है। यह संकलक को यह निर्धारित करने के लिए बहुत सारे रास्ते देता है कि मूल्यों को कहाँ संग्रहीत करना है, उन्हें कितने समय तक रखना है, और इसी तरह।

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

अब, दो कैविएट हैं:

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

लेकिन सामान्य प्रश्न का उत्तर देने के लिए, हाँ, एक कार्यात्मक प्रतिमान कंपाइलर को यह अनुकूलन करने के लिए बहुत अधिक स्वतंत्रता देता है कि यह एक अनिवार्य सेटिंग में नहीं है।


हास्केल में सब कुछ कार्यात्मक है, इसका बस यह है कि आपका mainराज्य बदलने वाला कार्य है जो राज्य का उपयोग करता है।
वैकल्पिक

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

@ जिमी वफ़र पारदर्शिता एक बहुत बड़ा अंतर है।
वैकल्पिक

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

1
@mathepic हां, निश्चित रूप से आप एक यादृच्छिक धारा या राज्य से राज्य के लिए एक फ़ंक्शन के रूप में यादृच्छिकता या उपयोगकर्ता इनपुट (या नेटवर्क विलंबता, या सिस्टम लोड) देख सकते हैं, लेकिन यह ऐसा विचार नहीं है जो स्वयं के व्यवहार के बारे में उपयोगी तर्क के लिए उधार देता है आप या आपके संकलक - बॉब हार्पर ने अपने ब्लॉग पर सीएमयू के नए कार्यात्मक-प्रोग्रामिंग-प्रथम सीएस पाठ्यक्रम के बारे में हाल ही में पोस्ट में अच्छी तरह से कवर किया है।
jimwise
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.