2015-01-21 4 views
6

2001 से एक बहुत ही रोचक post में एलन विर्फ-ब्रॉक बताता है कि (मूल) ढेर को सुधार किए बिना ब्लॉक बंद करने को कैसे कार्यान्वित किया जाए।क्यों कुछ ब्लॉक बंद ऑप्टिमाइज़ेशन अच्छा और मान्य है?

कई विचारों से वह खुलासा करता है कि मैं समझ में नहीं आता हूं और मैंने सोचा कि यह यहां पूछना अच्छा विचार होगा। वह कहता है:

कोई भी चर जो किसी ब्लॉक के जीवनकाल (उदाहरण के लिए, विधियों और ब्लॉक को बंद करने के तर्क) के दौरान कभी भी असाइन नहीं किया जा सकता है, अगर पर्यावरण में एक चर की बंद हो जाती है तो उसे पर्यावरण में नहीं रखा जाना चाहिए जब यह

बनाई गई है दो चीजें मुझे यकीन है कि मैं काफी अच्छी तरह से समझ में नहीं कर रहा हूँ कर रहे हैं:

  1. क्यों केवल पढ़ने के लिए चर की दो प्रतियां चर होने की तुलना में तेजी वातावरण में ले जाया गया है का उपयोग कर? क्या ऐसा इसलिए है क्योंकि संलग्नक संदर्भ के लिए यह ढेर में (मूल) चर का उपयोग करने के लिए तेज़ होगा?
  2. हम कैसे सुनिश्चित कर सकते हैं कि दो चर सिंक्रनाइज़ रहते हैं?

प्रश्न 1 में एक और कारण होना चाहिए। अन्यथा मुझे लाभ दिखाई नहीं देता है (जब अनुकूलन को लागू करने की लागत की तुलना में।)

प्रश्न 2 के लिए एक गैर तर्क जो विधि में असाइन किया गया है और ब्लॉक में नहीं। स्टैक में संग्रहीत ओओपी ब्लॉक के जीवन के दौरान अपरिवर्तित क्यों रहेगा?

मुझे लगता है कि मुझे प्रश्न 2 का जवाब पता है: क्योंकि ब्लॉक के निष्पादन को विधि के निष्पादन के साथ अंतःस्थापित नहीं किया जा सकता है, यानी, जबकि ब्लॉक रहता है, संलग्न संदर्भ नहीं चलता है। लेकिन ब्लॉक जीवित होने पर अस्थायी रूप से अस्थायी रूप से संशोधित करने का कोई तरीका नहीं है?

+1

दिलचस्प बात यह है कि क्लीमेंट बेरा सिर्फ बंद होने के बारे में ब्लॉग किया गया है, ऐसा लगता है कि आप एक ही फोकस साझा करते हैं https://clementbera.wordpress.com/2015/01/21/context-and-blockclosure-implementation/ –

+0

लिंक के लिए धन्यवाद। यह एक बहुत स्पष्ट प्रदर्शनी है। (चयनकर्ता में एक टाइपो है हालांकि, इसे ज़ूकीपर पढ़ना चाहिए था ** ** मुफ्त ** AllAnimals ;-) –

उत्तर

3

@ aka.nice की टिप्पणी के लिए धन्यवाद, मुझे क्लेमेंट बेरा के पोस्ट में दो प्रश्नों के उत्तर मिल गए, जिनकी पढ़ाई सुखद और स्पष्टीकरण दोनों है।

प्रश्न 1 के लिए सबसे पहले कहें कि एलन की टिप्पणी का अर्थ है कि केवल पढ़ने योग्य चर की प्रति ब्लॉक के ढेर में रखी जा सकती है, जैसे कि यह ब्लॉक का स्थानीय अस्थायी था। ऐसा करने का लाभ केवल सभी ब्लॉक के बाहर परिभाषित चर और इसके अंदर उपयोग किए जाने वाले ब्लॉक को ब्लॉक में कभी लिखा नहीं जाता है। इन परिस्थितियों में पर्यावरण की सरणी बनाने और इसकी देखभाल करने के लिए किसी भी प्रोलॉग या एपिलॉग को उत्सर्जित करने की आवश्यकता नहीं होगी।

मशीन कोड है कि एक ढेर चर तक पहुँचता है, जबकि दूसरा [edi + offest] का प्रयोग करेंगे क्योंकि पहले स्थान [ebp + offset] का उपयोग कर संबोधित करेंगे पर्यावरण एक का उपयोग करने के लिए आवश्यक एक के बराबर है, एक बार edi पर्यावरण सरणी को इंगित करने के लिए सेट कर दिया गया है (tempVector क्लेमेंट के नोटेशन में।) इसलिए, कुछ लाभ नहीं हैं, लेकिन कुछ पर्यावरण चर केवल पढ़ने के लिए नहीं हैं।

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

मुझे खुशी है कि मैंने यहां प्रश्न पोस्ट करने का फैसला किया है। उर्फ से मिली सहायताअच्छा और क्लेमेंट बेरा, साथ ही टिप्पणियों ने मुझे ईमेल द्वारा भेजे गए कुछ लोगों को मेरी समझ बढ़ाने में बहुत मदद की।

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

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