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

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

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

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

उदाहरण
कोड के निम्नलिखित टुकड़े पर विचार करें:  0: (ए) t0 = read_num 1: (ए) अगर टी 0 मॉड 2 == 0 2: (बी) प्रिंट t0 + सम है। 3: (बी) गोटो 5 4: (सी) प्रिंट t0 + विषम है। 5: (डी) अंत कार्यक्रम  उपरोक्त में, हमारे पास 4 मूल ब्लॉक हैं: ए 0 से 1 तक, बी 2 से 3 तक, सी 4 पर और डी 5 पर। विशेष रूप से, इस मामले में, ए एंट्री ब्लॉक है, डी एग्जिट ब्लॉक और लाइन 4 है। और 5 जम्प टारगेट हैं। इस टुकड़े के लिए एक ग्राफ में ए से बी, ए से सी, बी से डी और सी से डी के किनारे हैं।

पहुंच योग्यता
गम्यता एक ग्राफ प्रॉपर्टी है जो ऑप्टिमाइज़ेशन में उपयोगी है।

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

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

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

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

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

ऐसा कहा जाता है कि यदि 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