बेसिक ब्लॉक

From alpha
Jump to navigation Jump to search

संकलक में, एक मूल ब्लॉक एक सीधी-रेखा कोड अनुक्रम होता है जिसमें प्रवेश के अलावा कोई शाखा नहीं होती है और बाहर निकलने के अलावा कोई शाखा नहीं होती है।[1][2] यह प्रतिबंधित रूप एक बुनियादी ब्लॉक को विश्लेषण के लिए अत्यधिक उत्तरदायी बनाता है।[3] कंपाइलर आमतौर पर विश्लेषण प्रक्रिया में पहले चरण के रूप में अपने मूल ब्लॉकों में प्रोग्राम को विघटित करते हैं। बुनियादी ब्लॉक एक नियंत्रण-प्रवाह ग्राफ में शीर्ष या नोड बनाते हैं।

परिभाषा

मूल ब्लॉक में कोड में है:

  • एक प्रवेश बिंदु, जिसका अर्थ है कि इसके भीतर कोई भी कोड प्रोग्राम में कहीं भी कूद निर्देश का गंतव्य नहीं है।
  • एक निकास बिंदु, जिसका अर्थ है कि केवल अंतिम निर्देश ही प्रोग्राम को एक अलग बुनियादी ब्लॉक में कोड निष्पादित करना शुरू कर सकता है।

इन परिस्थितियों में, जब भी किसी बुनियादी ब्लॉक में पहला निर्देश निष्पादित किया जाता है, तो शेष निर्देश आवश्यक रूप से ठीक एक बार और क्रम में निष्पादित होते हैं।[4][5] कोड स्रोत कोड, विधानसभा कोड या निर्देशों के कुछ अन्य अनुक्रम हो सकते हैं।

अधिक औपचारिक रूप से, निर्देशों का एक क्रम एक बुनियादी ब्लॉक बनाता है यदि:

  • प्रत्येक स्थिति प्रभुत्व (ग्राफ सिद्धांत) में निर्देश, या बाद के पदों में उन सभी से पहले हमेशा निष्पादित करता है।
  • अनुक्रम में दो निर्देशों के बीच कोई अन्य निर्देश निष्पादित नहीं होता है।

यह परिभाषा कुछ मायनों में सहज ज्ञान से अधिक सामान्य है। उदाहरण के लिए, यह अन्य छलांगों द्वारा लक्षित नहीं किए गए लेबल पर बिना शर्त छलांग लगाने की अनुमति देता है। यह परिभाषा उन गुणों का प्रतीक है जो एल्गोरिथम का निर्माण करते समय बुनियादी ब्लॉकों को काम करना आसान बनाते हैं।

किसी ब्लॉक के अंत तक पहुंचने के बाद जिन ब्लॉकों पर नियंत्रण स्थानांतरित हो सकता है, उन्हें उस ब्लॉक के उत्तराधिकारी कहा जाता है, जबकि किसी ब्लॉक में प्रवेश करते समय जिस ब्लॉक से नियंत्रण आया हो, उस ब्लॉक के पूर्ववर्ती कहलाते हैं। मूल ब्लॉक की शुरुआत एक से अधिक स्थानों से कूद कर की जा सकती है।

निर्माण कलन विधि

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

ध्यान दें कि यह विधि औपचारिक परिभाषा के अनुसार हमेशा अधिकतम बुनियादी ब्लॉक उत्पन्न नहीं करती है, लेकिन वे आम तौर पर पर्याप्त होते हैं (अधिकतम बुनियादी ब्लॉक मूल ब्लॉक होते हैं जिन्हें मूल ब्लॉक की परिभाषा का उल्लंघन किए बिना आसन्न ब्लॉकों को शामिल करके बढ़ाया नहीं जा सकता है।[6]).

इनपुट: निर्देशों का एक क्रम (ज्यादातर तीन-पता कोड)।[7]
आउटपुट: एक ब्लॉक में प्रत्येक तीन-पता विवरण के साथ बुनियादी ब्लॉकों की एक सूची।

  1. कोड में नेताओं की पहचान करें। नेता वे निर्देश हैं जो निम्नलिखित 3 श्रेणियों में से किसी के अंतर्गत आते हैं:
    1. यह पहला निर्देश है। पहला निर्देश एक नेता है।
    2. एक सशर्त या बिना शर्त गोटो/कूद निर्देश का लक्ष्य एक नेता है।
    3. सशर्त या बिना शर्त गोटो/जंप निर्देश का तुरंत पालन करने वाला निर्देश एक लीडर है।
  2. एक नेता से शुरू करना, अगले नेता को शामिल करने और न करने तक सभी निम्नलिखित निर्देशों का सेट शुरुआती नेता के अनुरूप मूल ब्लॉक है। इस प्रकार प्रत्येक बुनियादी ब्लॉक में एक नेता होता है।

मूल ब्लॉक को समाप्त करने वाले निर्देशों में निम्नलिखित शामिल हैं:

  • बिना शर्त और सशर्त शाखा (कंप्यूटर विज्ञान), प्रत्यक्ष और अप्रत्यक्ष दोनों;
  • कॉलिंग प्रक्रिया के लिए वापसी कथन;
  • निर्देश जो एक अपवाद हैंडलिंग फेंक सकते हैं;
  • फ़ंक्शन कॉल मूल ब्लॉक के अंत में हो सकते हैं यदि वे वापस नहीं आ सकते हैं, जैसे कि फ़ंक्शन जो अपवाद फेंकते हैं या विशेष कॉल जैसे C (प्रोग्रामिंग भाषा) का Longjmp|longjmpऔर exit;
  • वापसी निर्देश ही।

एक नया बुनियादी ब्लॉक शुरू करने वाले निर्देशों में निम्नलिखित शामिल हैं:

  • प्रक्रिया और कार्य प्रवेश बिंदु;
  • छलांग या शाखाओं का लक्ष्य;
  • कुछ सशर्त शाखाओं का पालन करते हुए फॉल-थ्रू निर्देश;
  • अपवाद फेंकने वाले निर्देशों का पालन करना;
  • अपवाद संचालक।

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

यह भी देखें

संदर्भ

  1. Hennessy, John L.; David A. Patterson. Computer architecture: a quantitative approach. Elsevier, 2011.
  2. Cooper, Keith Daniel; Torczon, Linda (2012). Engineering a compiler (2nd ed.). Amsterdam: Elsevier/Morgan Kaufmann. p. 231. ISBN 978-0120884780. OCLC 714113472.
  3. "Control Flow Analysis" by Frances E. Allen.
  4. Yousefi, Javad (2015). Masking wrong-successor Control Flow Errors employing data redundancy. IEEE. pp. 201–205. doi:10.1109/ICCKE.2015.7365827.
  5. "Global Common Subexpression Elimination" by John Cocke.
  6. Modern Compiler Design by Dick Grune, Henri E. Bal, Ceriel J. H. Jacobs, and Koen G. Langendoen, p. 320.
  7. Compiler Principles, Techniques and Tools, Aho Sethi Ullman.


बाहरी संबंध