बात यह है, फ़ंक्शन एन्कोडिंग के मामले में वास्तव में बहुत अधिक नहीं है। यहाँ मुख्य विकल्प हैं:
शब्द पुनर्लेखन: आप कार्यों को उनके अमूर्त सिंटैक्स ट्री (या कुछ एन्कोडिंग) के रूप में संग्रहीत करते हैं। जब आप किसी फ़ंक्शन को कॉल करते हैं, तो आप अपने मापदंडों को तर्क के साथ बदलने के लिए सिंटैक्स ट्री को मैन्युअल रूप से ट्रैवर्स करते हैं। यह समय और स्थान के संदर्भ में आसान, लेकिन बहुत अक्षम है। ।
क्लोज़र: आपके पास फ़ंक्शन का प्रतिनिधित्व करने का कुछ तरीका है, शायद एक सिंटैक्स ट्री, अधिक संभावना मशीन कोड। और इन कार्यों में, आप किसी तरह से संदर्भ द्वारा अपने तर्कों को देखें। यह एक पॉइंटर-ऑफसेट हो सकता है, यह एक पूर्णांक या डी ब्रूजन इंडेक्स हो सकता है, यह एक नाम हो सकता है। फिर आप किसी फ़ंक्शन को एक क्लोजर के रूप में दर्शाते हैं : फ़ंक्शन "निर्देश" (ट्री, कोड, आदि) फ़ंक्शन के सभी मुक्त चर वाले डेटा संरचना के साथ जोड़ा जाता है। जब कोई फ़ंक्शन वास्तव में लागू किया जाता है, तो यह किसी तरह जानता है कि पर्यावरण, सूचक अंकगणित, आदि का उपयोग करके इसकी डेटा संरचना में मुक्त चर कैसे देखें।
मुझे यकीन है कि अन्य विकल्प भी हैं, लेकिन ये बुनियादी हैं, और मुझे संदेह है कि लगभग हर दूसरा विकल्प मूल बंद संरचना के एक संस्करण या अनुकूलन होगा।
तो, प्रदर्शन के संदर्भ में, लगभग सार्वभौमिक रूप से पुनर्लेखन की तुलना में बेहतर प्रदर्शन करते हैं। विविधताओं में से, जो बेहतर है? यह आपकी भाषा और वास्तुकला पर बहुत अधिक निर्भर करता है, लेकिन मुझे संदेह है कि "मशीन-कोड, जिसमें मुक्त संस्करण वाली संरचना है" सबसे अधिक कुशल है। इसमें सब कुछ फ़ंक्शन की आवश्यकता (निर्देश और मूल्य) है और अधिक कुछ नहीं है, और कॉलिंग बड़ी अवधि के ट्रैवर्सल्स को समाप्त नहीं करता है।
मैं दोनों मौजूदा एन्कोडिंग एल्गोरिथ्म लोकप्रिय कार्यात्मक भाषाओं (हास्केल, एमएल) के उपयोग में दिलचस्पी रखता हूं
मैं एक विशेषज्ञ नहीं हूं, लेकिन मैं 99% सबसे अधिक एमएल फ्लेवर हूं जो मेरे द्वारा वर्णित क्लोजर के कुछ बदलावों का उपयोग करते हैं, कुछ आशाओं के साथ। देखें इस परिप्रेक्ष्य (संभवतः की तारीख से) एक के लिए।
हस्केल आलसी मूल्यांकन के कारण कुछ अधिक जटिल होता है: यह स्पिनलेस टैगलेस ग्राफ रीराइटिंग का उपयोग करता है ।
और यह भी सबसे कुशल में से एक है जिसे हासिल किया जा सकता है।
सबसे कुशल क्या है? ऐसा कोई कार्यान्वयन नहीं है जो सभी इनपुटों में सबसे अधिक कुशल होगा, इसलिए आपको ऐसे कार्यान्वयन मिलते हैं जो औसत रूप से कुशल होते हैं, लेकिन प्रत्येक अलग-अलग परिदृश्यों में उत्कृष्ट होगा। इसलिए सबसे अधिक या कम से कम कुशल की कोई निश्चित रैंकिंग नहीं है।
यहां कोई जादू नहीं है। किसी फंक्शन को स्टोर करने के लिए, आपको इसके फ्री वैल्यूज़ को किसी तरह स्टोर करने की ज़रूरत है, अन्यथा आप फंक्शन की तुलना में कम जानकारी को एन्कोडिंग कर सकते हैं। हो सकता है कि आप आंशिक मूल्यांकन के साथ कुछ मुफ्त मूल्यों का अनुकूलन कर सकते हैं, लेकिन यह प्रदर्शन के लिए जोखिम भरा है, और आपको यह सुनिश्चित करने के लिए सावधान रहना होगा कि यह कम हो।
और, शायद आप अंतरिक्ष दक्षता हासिल करने के लिए किसी प्रकार के संपीड़न, या चालाक एल्गोरिथ्म का उपयोग कर सकते हैं। लेकिन तब आप या तो अंतरिक्ष के लिए व्यापार कर रहे हैं, या आप उस स्थिति में हैं जहां आपने कुछ मामलों के लिए अनुकूलित किया है और दूसरों के लिए धीमा कर दिया है।
आप आम मामले के लिए अनुकूलन कर सकते हैं, लेकिन क्या आम मामला है भाषा, आवेदन के क्षेत्र, आदि कोड के प्रकार के एक वीडियो गेम के लिए तेज है कि पर बदल सकते हैं (संख्या क्रंचिंग, बड़े निवेश के साथ तंग छोरों) शायद तुलना में अलग है कंपाइलर (ट्री ट्रैवर्सल्स, वर्कलिस्ट्स आदि) के लिए क्या जल्दी है।
बोनस बिंदु: क्या ऐसी एन्कोडिंग है कि नक्शे पूर्णांक को देशी पूर्णांक (संक्षेप में, C आदि) में एन्कोड कर देते हैं। क्या यह भी संभव है?
नहीं, यह संभव नहीं है। समस्या यह है कि लैम्ब्डा पथरी आपको आत्मनिरीक्षण की शर्तों को पूरा नहीं करने देती है। जब कोई फ़ंक्शन चर्च-अंक के समान प्रकार के साथ एक तर्क लेता है, तो उसे उस अंक की सटीक परिभाषा की जांच किए बिना, इसे कॉल करने में सक्षम होने की आवश्यकता होती है। चर्च एन्कोडिंग के साथ यही बात है: केवल एक चीज जो आप उनके साथ कर सकते हैं, उन्हें कॉल करें, और आप इसके साथ उपयोगी सब कुछ अनुकरण कर सकते हैं, लेकिन बिना लागत के।
इससे भी महत्वपूर्ण बात, पूर्णांक हर संभव बाइनरी एन्कोडिंग पर कब्जा कर लेते हैं। इसलिए यदि लंबोदर को उनके पूर्णांक के रूप में दर्शाया गया था, तो आपके पास गैर-चर्च-संख्यात्मक लंबोदा का प्रतिनिधित्व करने का कोई तरीका नहीं होगा! या, आप यह चिह्नित करने के लिए एक झंडे का परिचय देंगे कि क्या एक लंबोदर एक अंक है या नहीं, लेकिन फिर आप चाहते हैं कि कोई दक्षता खिड़की से बाहर चली गई है।
संपादित करें: यह लिखने के बाद से, मुझे उच्च-क्रम के कार्यों को लागू करने के लिए एक तीसरे विकल्प के बारे में पता चल गया है: विचलन । यहां, प्रत्येक फ़ंक्शन कॉल एक बड़े switch
स्टेटमेंट में बदल जाता है , जिसके आधार पर फ़ंक्शन के रूप में लैम्ब्डा एब्सट्रैक्शन दिया गया था। यहां ट्रेडऑफ़ यह है कि यह एक संपूर्ण कार्यक्रम परिवर्तन है: आप भागों को अलग से संकलित नहीं कर सकते हैं और फिर इस तरह से एक साथ लिंक कर सकते हैं, क्योंकि आपको समय से पहले लैम्ब्डा अमूर्त का पूरा सेट होना चाहिए।