λ -कुलस: कार्यों के स्मृति प्रतिनिधित्व में सबसे कुशल क्या है?


9

मैं समारोह इनकोडिंग (चर्च के / स्कॉट) बनाम प्रतिष्ठित इनकोडिंग (कोडांतरक / सी) डाटा संरचनाओं के प्रदर्शन की तुलना करना चाहते हैं।

लेकिन इससे पहले कि मैं यह जानना चाहता हूं कि स्मृति में कार्य प्रतिनिधित्व कितना कुशल / उपयोगी हो सकता है। समारोह पाठ्यक्रम आंशिक रूप से लागू किया (उर्फ बंद) का हो सकता है।

मैं दोनों मौजूदा एन्कोडिंग एल्गोरिथ्म लोकप्रिय कार्यात्मक भाषाओं (हास्केल, एमएल) के उपयोग में रुचि रखता हूं और सबसे कुशल में भी जिसे हासिल किया जा सकता है।


बोनस बिंदु: क्या ऐसी एन्कोडिंग है कि नक्शे पूर्णांक को देशी पूर्णांक ( short, intआदि सी में) को एन्कोड कर देते हैं । क्या यह भी संभव है?


मैं प्रदर्शन के आधार पर दक्षता को महत्व देता हूं। दूसरे शब्दों में अधिक कुशल एन्कोडिंग कम है यह कार्यात्मक डेटा संरचनाओं के साथ संगणना के प्रदर्शन को प्रभावित करता है।


मेरे सभी Google प्रयास विफल हो गए, शायद मुझे सही कीवर्ड नहीं पता हैं।
फोर्ड ओ

क्या आप इस सवाल को संपादित कर सकते हैं कि "कुशल" से आपका क्या मतलब है? क्या के लिए कुशल? जब आप एक कुशल डेटा संरचना के लिए पूछ रहे हैं, तो आपको यह निर्दिष्ट करने की आवश्यकता है कि आप डेटा संरचना पर क्या संचालन करना चाहते हैं, क्योंकि यह डेटा संरचना की पसंद को प्रभावित करता है। या क्या आपका मतलब है कि एन्कोडिंग संभव के रूप में अंतरिक्ष-कुशल है?
DW

1
यह काफी व्यापक है। लैम्ब्डा कैलकुलस के लिए बहुत सारी अमूर्त मशीनें हैं जो इसे कुशलतापूर्वक निष्पादित करने का लक्ष्य रखती हैं (उदाहरण के लिए SECD, CAM, Krivine's, STG)। उसके शीर्ष पर, आपको चर्च / स्कॉट एन्कोडेड डेटा पर विचार करने की आवश्यकता है, जो अधिक समस्याएं पैदा करता है। उदाहरण के लिए, चर्च की एन्कोडेड सूचियों में, टेल ऑपरेशन को O (1) के बजाय O (n) होना चाहिए। मुझे लगता है कि मैं कहीं कि हे के साथ प्रणाली एफ में सूचियों के लिए कोई एन्कोडिंग के अस्तित्व (1) सिर और पूंछ संचालन अभी भी एक खुला मुद्दा था पढ़ें।
ची

@DW मैं प्रदर्शन के बारे में बात कर रहा हूँ / भूमि के ऊपर। उदाहरण के लिए चर्च की सूची में कुशल एन्कोडिंग मानचित्रण और हास्केल की सूची में एक ही समय लेना चाहिए।
फोर्ड ओ

किस ऑपरेशन के लिए प्रदर्शन? आप कार्यों के साथ क्या करना चाहते हैं? क्या आप कुछ मूल्य पर इन कार्यों का मूल्यांकन करना चाहते हैं? एक बार, या कई मानों पर समान फ़ंक्शन का मूल्यांकन करें? उनके साथ कुछ और करें? क्या आप केवल यह पूछ रहे हैं कि किसी फंक्शन को कैसे संकलित किया जाए (एक कार्यात्मक भाषा में लिखा गया है) ताकि इसे यथासंभव प्रभावी रूप से निष्पादित किया जा सके?
DW

जवाबों:


11

बात यह है, फ़ंक्शन एन्कोडिंग के मामले में वास्तव में बहुत अधिक नहीं है। यहाँ मुख्य विकल्प हैं:

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

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

मुझे यकीन है कि अन्य विकल्प भी हैं, लेकिन ये बुनियादी हैं, और मुझे संदेह है कि लगभग हर दूसरा विकल्प मूल बंद संरचना के एक संस्करण या अनुकूलन होगा।

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

मैं दोनों मौजूदा एन्कोडिंग एल्गोरिथ्म लोकप्रिय कार्यात्मक भाषाओं (हास्केल, एमएल) के उपयोग में दिलचस्पी रखता हूं

मैं एक विशेषज्ञ नहीं हूं, लेकिन मैं 99% सबसे अधिक एमएल फ्लेवर हूं जो मेरे द्वारा वर्णित क्लोजर के कुछ बदलावों का उपयोग करते हैं, कुछ आशाओं के साथ। देखें इस परिप्रेक्ष्य (संभवतः की तारीख से) एक के लिए।

हस्केल आलसी मूल्यांकन के कारण कुछ अधिक जटिल होता है: यह स्पिनलेस टैगलेस ग्राफ रीराइटिंग का उपयोग करता है ।

और यह भी सबसे कुशल में से एक है जिसे हासिल किया जा सकता है।

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

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

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

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

बोनस बिंदु: क्या ऐसी एन्कोडिंग है कि नक्शे पूर्णांक को देशी पूर्णांक (संक्षेप में, C आदि) में एन्कोड कर देते हैं। क्या यह भी संभव है?

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

इससे भी महत्वपूर्ण बात, पूर्णांक हर संभव बाइनरी एन्कोडिंग पर कब्जा कर लेते हैं। इसलिए यदि लंबोदर को उनके पूर्णांक के रूप में दर्शाया गया था, तो आपके पास गैर-चर्च-संख्यात्मक लंबोदा का प्रतिनिधित्व करने का कोई तरीका नहीं होगा! या, आप यह चिह्नित करने के लिए एक झंडे का परिचय देंगे कि क्या एक लंबोदर एक अंक है या नहीं, लेकिन फिर आप चाहते हैं कि कोई दक्षता खिड़की से बाहर चली गई है।

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

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