2012-05-16 12 views
13

मैं let बाइंडिंग को लागू करने के 2 तरीके देख सकता हूं। सबसे पहले, SICP से ज्ञात, let को लैम्ब्डा फ़ंक्शन के रूप में कार्यान्वित किया जा सकता है। यह सुविधाजनक और सरल है, लेकिन इस तथ्य को ध्यान में रखते हुए कि प्रत्येक लैम्ब्डा (fn) का अनुवाद जेवीएम में अलग वर्ग में किया जाता है और let की संख्या औसत प्रोग्राम में उपयोग की जाती है, यह बहुत महंगा लगता है।क्लोजर में 'चलो' कैसे लागू किया गया है और इसका ओवरहेड क्या है?

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

तो क्लोजर में वास्तविक कार्यान्वयन क्या है? क्लोजर स्रोत में संबंधित लाइनों की ओर इशारा करते हुए सराहना की जाती है।

उत्तर

16

let -बाउंड चर अंतिम स्टैक पर स्थानीय मान के रूप में संग्रहीत किया जाता है।

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

कुल मिलाकर, यह बताने के लिए बाध्य चर बेहद कम भूमि के ऊपर हैं, तो आप उन्हें एक प्रदर्शन के नजरिए से का उपयोग करने से सभी में कोई हिचकिचाहट नहीं होनी चाहिए। शायद JVM पर बेहतर प्रदर्शन करना संभव नहीं है।

+0

तो मुझे लगता है कि क्लोजर ऑब्जेक्ट बनाया गया है (और अंतिम चर की प्रतिलिपि बनाई जाती है) केवल तभी जब आवश्यक हो और सरल मामलों के लिए केवल स्टैक पर रहें? – ffriend

+0

हां, यह काफी काम करता है कि यह कैसे काम करता है। यदि आप रुचि रखते हैं तो आप इसमें चारों ओर खुदाई कर सकते हैं: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java (हालांकि क्लोजर के बारे में पता लगाना विशेष रूप से आसान नहीं है कंपाइलर कर रहा है, बहुत सारे "जादू" हैं) – mikera

+0

@ffriend जावा ब्लॉक स्कॉप्ड वेरिएबल्स (विधि स्कोप के विपरीत) है। मैंने क्लोजर कंपाइलर क्या किया है, इस पर ध्यान नहीं दिया है, लेकिन ऐसा लगता है कि * चलो * को अंतिम चर वाले कोड के ब्लॉक द्वारा कार्यान्वित किया जा सकता है। मुझे यकीन नहीं है कि आपको क्यों लगता है कि इसे बंद करने के साथ लागू किया जाएगा। –

1

स्थानीय चर, संकेत, ढेर पर आवंटित कर रहे हैं ढेर पर मूल्यों/वस्तुओं की ओर इशारा करते। पॉइंटर गुंजाइश से बाहर हो जाता है, लेकिन जब तक बंदरगाह एक सूचक को बरकरार रखता है तब तक वस्तु जीवित रहती है।

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