एसआईओफ़ बहुत रनटाइम आर्टिफैक्ट है, संकलक और लिंकर के पास इसके साथ बहुत कुछ नहीं है। Atexit() फ़ंक्शन पर विचार करें, यह कार्यक्रम से बाहर निकलने के लिए फ़ंक्शन पंजीकृत करता है। कई सीआरटी कार्यान्वयन के कार्यक्रम प्रारंभिकरण के लिए कुछ समान है, चलिए इसे atinit() कहते हैं।
इन वैश्विक चरों को प्रारंभ करने के लिए कोड निष्पादित करने की आवश्यकता है, मान को संकलक द्वारा निर्धारित नहीं किया जा सकता है। तो संकलक मशीन कोड के स्निपेट उत्पन्न करता है जो अभिव्यक्ति निष्पादित करता है और मान निर्दिष्ट करता है। मुख्य() रन से पहले इन स्निपेट को निष्पादित करने की आवश्यकता होती है।
वह जगह है जहां atinit() खेल में आता है। एक आम सीआरटी कार्यान्वयन एटिनिट फ़ंक्शन पॉइंटर्स की एक सूची चलाता है और क्रम में प्रारंभिक स्निपेट निष्पादित करता है। समस्या वह क्रम है जिसमें एटिनिट() सूची में फ़ंक्शन पंजीकृत होते हैं। जबकि atexit() में एक अच्छी तरह से परिभाषित एलआईएफओ ऑर्डर है, और यह उस क्रम से निश्चित रूप से निर्धारित किया जाता है जिसमें कोड atexit() को कॉल करता है, ऐसे में एटिनिट फ़ंक्शंस का मामला नहीं है। भाषा विनिर्देश को ऑर्डर की आवश्यकता नहीं है, ऑर्डर निर्दिष्ट करने के लिए आप अपने कोड में कुछ भी नहीं कर सकते हैं। एसआईओएफ परिणाम है।
एक संभावित कार्यान्वयन एक अलग सेक्शन में संकलक उत्सर्जक फ़ंक्शन पॉइंटर्स है। लिंकर एटिनिट सूची का उत्पादन करते हुए उन्हें विलय करता है। यदि आपका कंपाइलर ऐसा करता है तो प्रारंभिक क्रम उस ऑर्डर द्वारा निर्धारित किया जाएगा जिसमें आप ऑब्जेक्ट फ़ाइलों को लिंक करते हैं। नक्शा फ़ाइल को देखें, यदि आपका कंपाइलर ऐसा करता है तो आपको एटिनिट सेक्शन देखना चाहिए। इसे एटिनिट नहीं कहा जाएगा, लेकिन "इनिट" के साथ किसी प्रकार का नाम संभव है। मुख्य() को कॉल करने वाले सीआरटी स्रोत कोड पर एक नज़र डालने से अंतर्दृष्टि भी मिलनी चाहिए।
स्रोत
2010-06-14 11:34:34
धन्यवाद..लेकिन चरण 1 में, जब wll x और y शून्य हो जाएगा: संकलन समय पर या लिंक समय पर? –
@ हैपी मित्तल: आप नहीं बता सकते हैं और इस प्रकार संकलक चुन सकते हैं। यह प्रोग्राम लोड समय पर भी हो सकता है। – MSalters