2016-02-22 10 views
5

मैंने पढ़ा है कि गतिशील लिंक पिछले सक्रियण रिकॉर्ड को इंगित करता है, इसलिए यह गतिशील स्कॉप्ड प्रोग्रामिंग भाषा में समझ में आता है। लेकिन स्थैतिक स्कॉप्ड प्रोग्रामिंग भाषा में, एक्सेस लिंक (जो एक निचले घोंसले स्तर में फ़ंक्शन का सक्रियण रिकॉर्ड इंगित करता है) पर्याप्त नहीं है? और विशेष रूप से सी में - एक्सेस लिंक की आवश्यकता क्यों नहीं है? और गतिशील लिंक की आवश्यकता क्यों है?फ़ंक्शन सक्रियण रिकॉर्ड में गतिशील लिंक क्यों आवश्यक है? (स्थिर स्कॉप्ड भाषा में)

+1

कुछ और संदर्भ प्रदान करें। मैंने कभी भी प्रोग्रामिंग भाषा सी – Downvoter

+1

के साथ "सक्रियण रिकॉर्ड" शब्द का उपयोग नहीं किया है, शायद ओपी [THIS] के बारे में बात कर रहा है (http://www.cs.nmsu.edu/~rth/cs/cs471/f00 /ARIs.html) – LPs

+0

क्या यह साझा लाइब्रेरी में स्थिर चर से संबंधित है? – wallyk

उत्तर

4

मैं इस नामकरण जो मेरे लिए अधिक परिचित है का उपयोग करेगा:

सक्रियण रिकॉर्ड: ढेर फ्रेम

गतिशील लिंक: [बचाया] फ्रेम सूचक

तो , मैं आपके प्रश्न की व्याख्या करता हूं: फ्रेम पॉइंटर्स की आवश्यकता क्यों है? [1]

एक फ्रेम सूचक आवश्यक नहीं है।

कुछ कंपाइलर (उदाहरण के लिए ग्रीन हिल्स सी ++, जीसीसी के साथ -8) आम तौर पर एक उत्पन्न नहीं करते हैं या इसे उत्पन्न करने के लिए कहा जा सकता है (एमएसवीसी, जीसीसी)। call stack की

  • आसान traversing:

    जिसके अनुसार, यह निश्चित रूप से करता है के अपने फायदे है पैदा करने के लिए एक stack trace एक लिंक्ड सूची जहां फ्रेम सूचक सिर रूपों traversing के रूप में के रूप में आसान है। स्टैक निशान और डिबगर्स को कार्यान्वित करना बहुत आसान बनाता है।

  • आसान कोड पीढ़ी: ढेर चर सभी समय बदलते ढेर सूचक के बजाय फ्रेम सूचक का अनुक्रमण से संदर्भित किया जा सकता है।प्रत्येक धक्का/पॉप के साथ ढेर सूचक परिवर्तन, फ्रेम सूचक एक समारोह (prologue/epilogue के बीच)

  • चाहिए चीजें धराशायी हो जाना

    , stack unwinding फ्रेम सूचक का उपयोग किया जा सकता है के भीतर स्थिर रहती है। इस प्रकार बोर्लैंड की संरचित अपवाद हैंडलिंग (एसईएच) काम करता है। विशेष रूप से setjmp(3), alloca(3) और C99-VLA (और आमतौर पर करते हैं) इस पर निर्भर हो सकता है के कार्यान्वयन:

  • ढेर प्रबंधन सुव्यवस्थित।

कमियां:

  • रजिस्टर उपयोग: एक 86 केवल 8 सामान्य प्रयोजन रजिस्टरों मिला है। इनमें से एक फ्रेम सूचक धारण करने के लिए पूरी तरह से समर्पित करने की आवश्यकता होगी।
  • ओवरहेड: प्रत्येक कार्य के लिए प्रस्तावना/उपन्यास उत्पन्न होता है।

लेकिन जैसा कि आपने देखा, एक कंपाइलर फ्रेम पॉइंटर बनाए रखने के बिना पूरी तरह से ठीक कोड उत्पन्न कर सकता है।


[1] अगर वह क्या मतलब है नहीं है, विस्तृत करें।

+0

शायद डायनामिक लिंक "डिस्प्ले लिंक" नहीं है "फ्रेम पॉइंटर" –

+0

@ बेसिलस्टारनकेविच जिस तरह से मैं इसे समझता हूं, एक गतिशील लिंक अपने गतिशील पूर्ववर्ती (यानी कॉलर के सक्रियण फ्रेम) के साथ फ़ंक्शन के सक्रियण रिकॉर्ड को लिंक करता है। इसलिए मैंने इस सवाल को अर्थ के रूप में व्याख्या किया: हमें फ़्रेम पॉइंटर्स की आवश्यकता क्यों है। लेकिन मुझे पूरी तरह से यकीन नहीं है कि ओपी के मन में यह क्या है। मैंने इसे प्रतिबिंबित करने के लिए अपना जवाब संपादित किया। – a3f

2

आपका प्रश्न optimizing optionGCC से संबंधित हो सकता है, तो this देखें।

Btw, कई लोगों को कॉल फ्रेम (call stack में) क्या आप सक्रियण रिकॉर्ड नाम नामकरण कर रहे हैं। continuation की धारणा, और continuation passing style और A-normal form एस की बारीकी से संबंधित हैं।

एक गतिशील लिंक वास्तव में nested कार्यों (और शायद closures) के लिए ही उपयोगी है, और मानक सी उन्हें जरूरत नहीं है। कुछ लोग प्रदर्शन लिंक के बारे में बोलते हैं। मानक सी में नेस्टेड फ़ंक्शन नहीं हैं, इसलिए किसी भी संबंधित चाल (डिस्प्ले लिंक, ट्रैम्पोलिन, ...) की आवश्यकता नहीं है।

GCC संकलक एक सी भाषा विस्तार रूप nested functions प्रदान करता है, और उन्हें आप के बारे में क्या सोच रहे हैं करने के लिए सक्रियण रिकॉर्ड, बहुत बारीकी से पर गतिशील लिंक के साथ लागू करते हैं। man or boy test पर और trampoline पर विकिपीडिया भी पढ़ें।

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