क्या उच्च-आदेश फ़ंक्शन कॉल संकलित करते समय अलग संकलन और विभिन्न प्रकार के बंद रूपांतरण के बीच बातचीत से निपटने का एक मानक तरीका है?क्लोजर रूपांतरण और उच्च-आदेश फ़ंक्शन कॉल का अलग संकलन
मुझे तीन फ़ंक्शन-जैसी संरचनाओं के बारे में पता है जो अधिकांश प्रोग्रामिंग भाषाओं में विशिष्ट रूप से संकलित होते हैं: बंद, (शीर्ष-स्तरीय) फ़ंक्शन, और सी ++ - स्टाइल फ़ंक्शन ऑब्जेक्ट्स। वाक्य रचना वे उसी तरह कहा जाता है, लेकिन एक संकलक बेहतर उत्पन्न होगा साफ़ के आकार कॉल साइटें:
Syntax: | clo(args) | func(args) | obj(args)
--------------------------------------------------------------------------------
Codegen: | clo.fnc(&clo.env, args) | func(args) | cls_call(&obj, args)
^ ^ ^ ^ ^
fn ptr | +--"top level" fn --+ |
+--- "extra" param, compared to source type -----+
(सी ++ में, cls_call
T::operator()
obj
के लिए के वर्ग T
सी ++ भी अनुमति देता है आभासी functors होगा, लेकिन है कि है। अनिवार्य रूप से एक अतिरिक्त अविवेक के साथ बंद होने का मामला।)
इस बिंदु पर,, map (x => x > 3) lst
और map (x => x > y) lst
करने के लिए कॉल अलग map
कार्यों आह्वान करना चाहिए, क्योंकि पहले उत्थापन के बाद एक साधारण समारोह सूचक है, और दूसरा एक बंद है। (98) दृष्टिकोण, या तो (क कॉल-साइट आकार लेने औपचारिक पैरामीटर प्रकार के माध्यम से करने के लिए कॉल प्राप्त करने वाला बलों जो
सी ++:
मैं इस मुद्दे से निपटने का चार तरीके के बारे में सोच सकते हैं आभासी functor , फ़ंक्शन पॉइंटर, या गैर वर्चुअल फ़ैक्टर) या टेम्पलेट का उपयोग करके अलग संकलन ड्रॉप करें, नीचे प्रभावी समाधान # 2 निर्दिष्ट करें।
ओवरलोडिंग: कंपाइलर
map
, और अन्य सभी उच्च-आदेश फ़ंक्शन, उचित नाम-मैंगलिंग के साथ कई तत्कालता कर सकता है। असल में, एक अलग आंतरिक फ़ंक्शन प्रकार प्रति कॉल साइट आकार होता है, और अधिभार रिज़ॉल्यूशन सही चुनता है।एक वैश्विक रूप से वर्दी कॉल-साइट आकार को प्रबंधित करें। इसका मतलब है कि सभी शीर्ष-स्तरीय फ़ंक्शंस एक स्पष्ट
env
तर्क लेते हैं, भले ही उन्हें इसकी आवश्यकता न हो, और गैर-बंद करने वाले तर्कों को लपेटने के लिए "अतिरिक्त" बंद किए जाने चाहिए।शीर्ष-स्तरीय कार्यों के लिए "प्राकृतिक" हस्ताक्षर बनाए रखें, लेकिन यह जरूरी है कि उच्च-आदेश फ़ंक्शन पैरा के सभी हैंडलिंग बंद हो जाएं। पहले से बंद कार्यों के लिए "अतिरिक्त" बंद अप्रयुक्त
env
पैरामीटर को त्यागने के लिए एक रैपर ट्रैम्पोलिन फ़ंक्शन को कॉल करते हैं। यह विकल्प 3 से अधिक सुरुचिपूर्ण लगता है, लेकिन कुशलतापूर्वक कार्यान्वित करने के लिए कठिन है। या तो संकलक कॉल करने वाले सम्मेलन-indepedent रैपर की एक भीड़ उत्पन्न करता है, या यह कॉल करने वाले सम्मेलन के प्रति संवेदनशील Thunks की एक छोटी संख्या का उपयोग करता है ...
साथ संकर योजना उठाने एक अनुकूलित बंद-रूपांतरण/लैम्ब्डा बीत रहा है, एनवी या पैरामीटर सूची में दिए गए बंद तर्क को छूना है या नहीं, ऐसा लगता है कि इससे समस्या अधिक गंभीर हो जाएगी।
फिर भी, सवाल:
- करता है इस मुद्दे को साहित्य में एक स्पष्ट नाम नहीं है?
- क्या उपरोक्त चार के अलावा अन्य दृष्टिकोण हैं?
- क्या दृष्टिकोण के बीच अच्छी तरह से ज्ञात ट्रेडऑफ हैं?