नियंत्रण-प्रवाह ग्राफ

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

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

इसकी निर्माण प्रक्रिया के कारण, एक सीएफजी में, प्रत्येक किनारे ए → बी में संपत्ति है:
 * आगे की डिग्री (ए)> 1 या अंतःकोटि(बी)> 1 (या दोनों)।

सीएफजी इस प्रकार, कम से कम संकल्पनात्मक रूप से, प्रोग्राम के (पूर्ण) प्रवाह लेखाचित्र से शुरू करके प्राप्त किया जा सकता है - अर्थात। वह लेखाचित्र जिसमें प्रत्येक नोड एक व्यक्तिगत निर्देश का प्रतिनिधित्व करता है - और प्रत्येक किनारे के लिए एक किनारे का संकुचन करता है जो ऊपर दिए गए विधेय को गलत साबित करता है, यानी हर किनारे को अनुबंधित करता है जिसका स्रोत एक एकल निकास है और जिसका गंतव्य एक ही प्रविष्टि है। सीएफजी निर्माण को समझने के लिए मानस दर्शन सहायता के अलावा, इस संकुचन-आधारित एल्गोरिदम(कलनविधि) का कोई व्यावहारिक महत्व नहीं है, क्योंकि सीएफजी को मूल ढांचा 'निर्माण कलनविधि द्वारा सीधे प्रोग्राम से अधिक कुशलतापूर्वक बनाया जा सकता है।

उदाहरण
कोड के निम्नलिखित खंड पर विचार करें:

0: (A) t0 = read_num

1: (A) if t0 mod 2 == 0

2: (B)  print t0 + " is even."

3: (B)  goto 5

4: (C) print t0 + " is odd."

5: (D) end program

उपरोक्त में, हमारे पास 4 मूल खंड हैं: ए 0 से 1 तक, बी 2 से 3 तक, सी 4 पर और डी 5 पर। विशेष रूप से, इस मामले में, ए "प्रवेश खंड" है, डी "निकास खंड" है और पंक्ति 4 और 5 लक्ष्य हैं। इस खंड के लिए एक लेखाचित्र में ए से बी, ए से सी, बी से डी और सी से डी के किनारे हैं।

पहुंच योग्यता
गम्यता एक लेखाचित्र गुण धर्म है जो अनुकूलीकरण में उपयोगी है।

यदि उपलेखाचित्र प्रविष्टि ढांचे वाले उपलेखाचित्र से जुड़ा नहीं है, तो वह उपलेखाचित्र किसी भी निष्पादन के दौरान पहुंच योग्य नहीं है, और इसलिए पहुंच योग्य कोड नहीं है; सामान्य परिस्थितियों में इसे सुरक्षित रूप से हटाया जा सकता है।

यदि प्रविष्टि ढांचे से निकास ढांचा अगम्य है, तो एक अनंत लूप मौजूद हो सकता है। सभी अनंत लूपों का पता नहीं लगाया जा सकता है, हॉल्टिंग समस्या देखें। वहां पर रोक लगाने का आदेश भी हो सकता है।

अगम्य कोड और अनंत लूप तब भी संभव हैं जब प्रोग्रामर उन्हें स्पष्ट रूप से कोड नहीं करता है: निरंतर प्रचार और निरंतर वलन के बाद जंप थ्रेडिंग जैसे अनुकूलन कई बुनियादी ढांचों को एक में ढहा सकते हैं, जिससे किनारों को सीएफजी से हटाया जा सकता है, आदि., इस प्रकार संभवतः लेखाचित्र के हिस्सों को अलग करता है।

वर्चस्व संबंध
ए ब्लॉक एम डोमिनेटर (लेखाचित्र थ्योरी) एक ब्लॉक एन यदि ब्लॉक एन तक पहुंचने वाले प्रवेश से प्रत्येक पथ को ब्लॉक एम से गुजरना पड़ता है। प्रवेश ब्लॉक सभी ब्लॉकों पर हावी है।

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

ऐसा कहा जाता है कि यदि M, N पर हावी है तो एक ब्लॉक M तुरंत ब्लॉक N पर हावी हो जाता है, और कोई हस्तक्षेप करने वाला ब्लॉक P नहीं है जैसे कि M, P पर हावी हो और P N पर हावी हो। दूसरे शब्दों में, N में प्रवेश से सभी रास्तों पर M अंतिम प्रभुत्व है। प्रत्येक ब्लॉक में एक अद्वितीय तत्काल प्रभुत्व होता है।

इसी तरह, तत्काल पोस्टडोमिनेटर की एक धारणा है, जो तत्काल डॉमिनेटर के समान है।

द डोमिनेटर (लेखाचित्ऱ थ्योरी) एक सहायक डेटा संरचना है जो डॉमिनेटर संबंधों को दर्शाती है। ब्लॉक एम से ब्लॉक एन तक एक चाप है यदि एम एन का तत्काल प्रभुत्व है। यह लेखाचित्र एक पेड़ है, क्योंकि प्रत्येक ब्लॉक में एक अद्वितीय तत्काल प्रभुत्व है। इस पेड़ की जड़ें प्रविष्टि ब्लॉक में हैं। डोमिनेटर ट्री की गणना लेंगौएर-टारजन के एल्गोरिथम का उपयोग करके कुशलतापूर्वक की जा सकती है।

एक पोस्टडोमिनेटर ट्री डोमिनेटर ट्री के अनुरूप होता है। यह पेड़ एग्जिट ब्लॉक पर जड़ जमाए हुए है।

विशेष किनारा
एक बैक एज एक ऐसा किनारा है जो एक ब्लॉक को इंगित करता है जो लेखाचित्र के गहराई-पहले (गहराई-पहली खोज) ट्रैवर्सल के दौरान पहले ही मिल चुका है। पीछे के किनारे लूप के विशिष्ट हैं।

एक महत्वपूर्ण किनारा एक किनारा है जो न तो अपने स्रोत ब्लॉक को छोड़ने वाला एकमात्र किनारा है और न ही अपने गंतव्य ब्लॉक में प्रवेश करने वाला एकमात्र किनारा है। इन किनारों को विभाजित किया जाना चाहिए: किसी अन्य किनारों को प्रभावित किए बिना किनारे पर संगणना सम्मिलित करने के लिए किनारे के बीच में एक नया ब्लॉक बनाया जाना चाहिए।

एक असामान्य किनारा एक किनारा है जिसका गंतव्य अज्ञात है। अपवाद हैंडलिंग निर्माण उन्हें उत्पन्न कर सकते हैं। ये किनारे अनुकूलन को बाधित करते हैं।

एक असंभव बढ़त (एक नकली बढ़त के रूप में भी जाना जाता है) एक किनारा है जिसे पूरी तरह से उस संपत्ति को संरक्षित करने के लिए लेखाचित्ऱ में जोड़ा गया है जो निकास ब्लॉक सभी ब्लॉकों को पोस्टडोमिनेट करता है। इसे कभी भी पार नहीं किया जा सकता है।

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

मान लीजिए ब्लॉक एम कई आने वाले किनारों के साथ एक प्रमुख है, उनमें से कुछ पीछे के किनारे हैं (इसलिए एम लूप हेडर है)। एम को दो ब्लॉक एम में तोड़ने के लिए कई अनुकूलन पासों के लिए यह फायदेमंद हैpre और एमloop. M और पिछले किनारों की सामग्री को M में ले जाया जाता हैloop, शेष किनारों को M में इंगित करने के लिए ले जाया जाता हैpre, और एम से एक नया किनाराpre एमloop डाला जाता है (ताकि Mpre M का तत्काल प्रभावी हैloop). शुरुआत में, एमpre खाली होगा, लेकिन लूप-इनवेरिएंट कोड मोशन जैसे पास इसे पॉप्युलेट कर सकता है। एमpre लूप प्री-हेडर कहा जाता है, और Mloop लूप हेडर होगा।

न्यूनीकरण
एक कम करने योग्य सीएफजी किनारों के साथ एक है जिसे दो अलग-अलग सेटों में विभाजित किया जा सकता है: आगे के किनारे और पीछे के किनारे, जैसे कि:
 * आगे के किनारे प्रवेश नोड से पहुंचने योग्य सभी नोड्स के साथ एक निर्देशित चक्रीय लेखाचित्र बनाते हैं।
 * सभी बैक किनारों (ए, बी), नोड बी डोमिनेटर (लेखाचित्र सिद्धांत) नोड ए के लिए।

संरचित प्रोग्रामिंग भाषाओं को अक्सर इस तरह डिज़ाइन किया जाता है कि उनके द्वारा उत्पादित सभी CFG कम करने योग्य होते हैं, और सामान्य संरचित प्रोग्रामिंग स्टेटमेंट जैसे IF, FOR, WHILE, BREAK, और CONTINUE कम करने योग्य लेखाचित्र उत्पन्न करते हैं। अलघुकरणीय रेखांकन तैयार करने के लिए GOTO जैसे कथनों की आवश्यकता होती है। इरेड्यूसिबल लेखाचित्र कुछ कंपाइलर ऑप्टिमाइज़ेशन द्वारा भी तैयार किए जा सकते हैं।

लूप जुड़ाव
सीएफजी की लूप कनेक्टिविटी को सीएफजी के दिए गए डेप्थ-फर्स्ट सर्च ट्री (डीएफएसटी) के संबंध में परिभाषित किया गया है। इस DFST को स्टार्ट नोड पर रूट किया जाना चाहिए और CFG के प्रत्येक नोड को कवर करना चाहिए।

CFG में किनारे जो एक नोड से अपने DFST पूर्वज (स्वयं सहित) तक चलते हैं, उन्हें बैक एज कहा जाता है।

लूप कनेक्टिविटी CFG के किसी भी चक्र-मुक्त पथ में पाए जाने वाले बैक एज की सबसे बड़ी संख्या है। कम करने योग्य सीएफजी में, लूप जुड़ाव चुने गए डीएफएसटी से स्वतंत्र होता है। डेटा-प्रवाह विश्लेषण की समय जटिलता के कारण के लिए लूप कनेक्टिविटी का उपयोग किया गया है।

अंतर-प्रक्रियात्मक नियंत्रण प्रवाह लेखाचित्र
जबकि नियंत्रण प्रवाह लेखाचित्ऱ एकल प्रक्रिया के नियंत्रण प्रवाह का प्रतिनिधित्व करते हैं, अंतर-प्रक्रियात्मक नियंत्रण प्रवाह लेखाचित्ऱ पूरे कार्यक्रमों के नियंत्रण प्रवाह का प्रतिनिधित्व करते हैं।

यह भी देखें

 * सार वाक्य रचना का पेड़
 * फ़्लोचार्ट
 * नियंत्रण-प्रवाह आरेख
 * नियंत्रण-प्रवाह विश्लेषण
 * डेटा प्रवाह विश्लेषण
 * अंतराल (लेखाचित्र सिद्धांत)
 * कार्यक्रम निर्भरता लेखाचित्र
 * साइक्लोमेटिक कम्पलेक्सिटी
 * स्टेटिक सिंगल असाइनमेंट
 * संकलक निर्माण
 * मध्यवर्ती प्रतिनिधित्व

बाहरी संबंध

 * The Machine-SUIF Control Flow Graph Library
 * GNU Compiler Collection Internals
 * Paper "Infrastructure for Profile Driven Optimizations in GCC Compiler" by Zdeněk Dvořák et al.


 * Examples
 * Avrora – Control-Flow Graph Tool