डेटा प्रवाह विश्लेषण

डेटा-फ्लो विश्लेषण एक कंप्यूटर प्रोग्राम में विभिन्न बिंदुओं पर गणना किए गए मानों के संभावित सेट के बारे में जानकारी एकत्र करने की एक तकनीक है। एक प्रोग्राम के नियंत्रण-प्रवाह ग्राफ (CFG) का उपयोग प्रोग्राम के उन हिस्सों को निर्धारित करने के लिए किया जाता है, जिनके लिए एक चर को निर्दिष्ट एक विशेष मान प्रचारित हो सकता है। एकत्र की गई जानकारी का उपयोग अक्सर संकलक द्वारा प्रोग्राम को अनुकूलित करते समय किया जाता है। डेटा-प्रवाह विश्लेषण का एक प्रामाणिक उदाहरण परिभाषाओं तक पहुँच रहा है।

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

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

प्रत्येक ब्लॉक बी के लिए:


 * $$ out_b = trans_b (in_b) $$
 * $$ in_b = join_{p \in pred_b}(out_p) $$

इस में, $$ trans_b $$ ब्लॉक का स्थानांतरण कार्य है $$b$$. यह प्रवेश अवस्था पर काम करता है $$in_b$$, बाहर निकलने की स्थिति प्रदान करना $$out_b$$. शामिल हों (गणित) $$join$$ पूर्ववर्तियों के निकास राज्यों को जोड़ती है $$p \in pred_b$$ का $$b$$, की प्रवेश स्थिति प्रदान करना $$b$$.

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

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

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

एक पुनरावृत्त एल्गोरिथम
डेटा-प्रवाह समीकरणों को हल करने का सबसे आम तरीका पुनरावृत्त एल्गोरिथम का उपयोग करना है। यह प्रत्येक ब्लॉक के इन-स्टेट के अनुमान से शुरू होता है। इसके बाद बाहरी राज्यों की गणना इन-स्टेट्स पर ट्रांसफर फ़ंक्शंस को लागू करके की जाती है। इनमें से, इन-स्टेट्स को ज्वाइन ऑपरेशंस लागू करके अपडेट किया जाता है। बाद के दो चरणों को तब तक दोहराया जाता है जब तक कि हम तथाकथित निश्चित बिंदु तक नहीं पहुंच जाते हैं: ऐसी स्थिति जिसमें इन-स्टेट्स (और परिणाम में आउट-स्टेट्स) नहीं बदलते हैं। डेटा-प्रवाह समीकरणों को हल करने के लिए एक बुनियादी एल्गोरिथम राउंड-रॉबिन पुनरावृत्ति एल्गोरिथम है:
 * i के लिए ← 1 से N
 * नोड i प्रारंभ करें
 * जबकि (सेट अभी भी बदल रहे हैं)
 * i के लिए ← 1 से N
 *  नोड i पर पुनर्गणना सेट करता है

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

मूल्य डोमेन सीमित ऊंचाई के साथ आंशिक क्रम होना चाहिए (यानी, कोई अनंत आरोही श्रृंखला नहीं है $$x_1$$ < $$x_2$$ <...). इस आंशिक क्रम के संबंध में ट्रांसफर फ़ंक्शन और जॉइन ऑपरेशन का संयोजन मोनोटोनिक होना चाहिए। मोनोटोनिकिटी यह सुनिश्चित करती है कि प्रत्येक पुनरावृत्ति पर मान या तो समान रहेगा या बड़ा होगा, जबकि परिमित ऊंचाई सुनिश्चित करती है कि यह अनिश्चित काल तक नहीं बढ़ सकता है। इस प्रकार हम अंतत: एक ऐसी स्थिति पर पहुंच जाएंगे जहां सभी x के लिए T(x) = x, जो नियत बिंदु है।

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

एल्गोरिदम को कार्य सूची में सूचना-सृजन करने वाले ब्लॉक डालकर शुरू किया जाता है। यह समाप्त हो जाता है जब कार्य सूची खाली है।

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

निम्नलिखित में, डेटा-प्रवाह समीकरणों को हल करने के लिए कुछ पुनरावृति क्रमों पर चर्चा की गई है (एक नियंत्रण-प्रवाह ग्राफ के पुनरावृति क्रम से संबंधित अवधारणा a का ट्री ट्रैवर्सल है वृक्ष (ग्राफ सिद्धांत))।


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

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

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

आगे का विश्लेषण
परिभाषा तक पहुँचना एनालिसिस प्रत्येक प्रोग्राम पॉइंट के लिए परिभाषाओं के सेट की गणना करता है संभावित रूप से इस कार्यक्रम बिंदु तक पहुँच सकते हैं।

<वाक्यविन्यास हाइलाइट लैंग = टेक्स्ट लाइन हाइलाइट = 2,4,7> अगर बी == 4 तो ए = 5; अन्य ए = 3; अगर अंत अगर एक <4 तो ... 

चर की पहुँच परिभाषा a पंक्ति 7 पर असाइनमेंट का सेट है a = 5 लाइन 2 पर और a = 3 लाइन 4 पर।

पिछड़ा विश्लेषण
लाइव वेरिएबल विश्लेषण प्रत्येक प्रोग्राम के लिए उन चरों की गणना करता है जो हो सकते हैं संभावित रूप से उनके अगले लेखन अद्यतन से पहले बाद में पढ़ें। परिणाम आमतौर पर द्वारा उपयोग किया जाता है मृत कोड उन्मूलन उन बयानों को हटाने के लिए जो एक चर को असाइन करते हैं जिसका मूल्य बाद में उपयोग नहीं किया जाता है।

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

प्रारंभिक कोड:

बी 1: ए = 3; बी = 5; डी = 4; एक्स = 100; अगर ए> बी तो बी 2: सी = ए + बी; डी = 2; बी3: एंडिफ सी = 4; वापसी बी * डी + सी;

पिछड़ा विश्लेषण:

// में: {} बी 1: ए = 3; बी = 5; डी = 4; एक्स = 100; // x का उपयोग बाद में कभी नहीं किया जा रहा है इसलिए आउट सेट {ए, बी, डी} में नहीं अगर ए> बी तो // बाहर: {ए, बी, डी} // बी 1 => बी 2 के सभी (इन) उत्तराधिकारियों का संघ: {ए, बी}, और बी 3: {बी, डी} // में: {ए, बी} बी 2: सी = ए + बी; डी = 2; // बाहर: {बी, डी} // में: {बी, डी} बी3: एंडिफ सी = 4; वापसी बी * डी + सी; // बाहर:{}

b3 की इन-स्टेट में केवल b और d होते हैं, क्योंकि c लिखा गया है। बी 1 का आउट-स्टेट बी 2 और बी 3 के इन-स्टेट्स का संघ है। b2 में c की परिभाषा को हटाया जा सकता है, क्योंकि c स्टेटमेंट के तुरंत बाद लाइव नहीं होता है।

डेटा-फ्लो समीकरणों को हल करना सभी इन-स्टेट्स और आउट-स्टेट्स को खाली सेट में इनिशियलाइज़ करने से शुरू होता है। कार्य सूची (बैकवर्ड फ्लो के लिए विशिष्ट) में निकास बिंदु (b3) सम्मिलित करके कार्य सूची को आरंभीकृत किया जाता है। इसकी गणना इन-स्टेट पिछले एक से भिन्न होती है, इसलिए इसके पूर्ववर्ती b1 और b2 सम्मिलित किए जाते हैं और प्रक्रिया जारी रहती है। प्रगति को नीचे दी गई तालिका में संक्षेपित किया गया है।

ध्यान दें कि b1 को b2 से पहले सूची में दर्ज किया गया था, जिसने b1 को दो बार संसाधित करने के लिए मजबूर किया (b1 को b2 के पूर्ववर्ती के रूप में फिर से दर्ज किया गया था)। b1 से पहले b2 डालने से पहले पूरा हो जाता।

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

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

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

समस्याओं का विशेष वर्ग
डेटा प्रवाह समस्याओं के कई विशेष वर्ग हैं जिनके कुशल या सामान्य समाधान हैं।

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

एक उदाहरण के रूप में, लाइव-वैरिएबल विश्लेषण में, ज्वाइन ऑपरेशन यूनियन है। किल सेट वेरिएबल्स का सेट है जो एक ब्लॉक में लिखे जाते हैं, जबकि जेन सेट वेरिएबल्स का सेट है जो पहले लिखे बिना पढ़े जाते हैं। डेटा प्रवाह समीकरण बन जाते हैं


 * $$ out_b = \bigcup_{s \in succ_b} in_s $$
 * $$ in_b = (out_b - kill_b) \cup gen_b $$

तार्किक संचालन में, यह इस रूप में पढ़ता है

बाहर (बी) = 0 'फॉर' एस 'इन' सक्सेस (बी) आउट (बी) = आउट (बी) 'या' इन (एस) इन (बी) = (बाहर (बी) 'और नहीं' मारना (बी)) 'या' जीन (बी)

डेटा प्रवाह समस्याएं जिनमें डेटा-प्रवाह मानों के सेट होते हैं जिन्हें बिट वैक्टर के रूप में प्रदर्शित किया जा सकता है, उन्हें 'बिट वेक्टर समस्याएं', 'जेन-किल समस्याएं', या 'स्थानीय रूप से अलग करने योग्य समस्याएं' कहा जाता है। ऐसी समस्याओं के सामान्य बहुपद-समय समाधान हैं।

ऊपर बताई गई पहुंच परिभाषाओं और लाइव चर समस्याओं के अलावा, निम्नलिखित समस्याएं बिटवेक्टर समस्याओं के उदाहरण हैं: * उपलब्ध भाव
 * बहुत व्यस्त भाव
 * यूज-डिफाइन चेन | यूज-डेफिनिशन चेन

आईएफडीएस समस्याएं
अंतर-प्रक्रियात्मक, परिमित, वितरणात्मक, सबसेट समस्याएँ या IFDS समस्याएँ सामान्य बहुपद-समय समाधान के साथ समस्या का एक अन्य वर्ग हैं। इन समस्याओं के समाधान संदर्भ-संवेदनशील और प्रवाह-संवेदनशील डेटा प्रवाह विश्लेषण प्रदान करते हैं।

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

प्रत्येक बिटवेक्टर समस्या भी एक IFDS समस्या है, लेकिन कई महत्वपूर्ण IFDS समस्याएँ हैं जो बिटवेक्टर समस्याएँ नहीं हैं, जिनमें वास्तविक-लाइव चर और संभवतः-अनियंत्रित चर शामिल हैं।

संवेदनशीलता
डेटा-प्रवाह विश्लेषण आमतौर पर पथ-असंवेदनशील होता है, हालांकि डेटा-प्रवाह समीकरणों को परिभाषित करना संभव है जो पथ-संवेदनशील विश्लेषण उत्पन्न करते हैं।


 * एक प्रवाह-संवेदनशील विश्लेषण एक कार्यक्रम में बयानों के क्रम को ध्यान में रखता है। उदाहरण के लिए, एक प्रवाह-असंवेदनशील सूचक उपनाम विश्लेषण चर x और y को निर्धारित कर सकता है जो एक ही स्थान को संदर्भित कर सकता है, जबकि एक प्रवाह-संवेदनशील विश्लेषण कथन 20 के बाद निर्धारित कर सकता है, चर x और y उसी स्थान को संदर्भित कर सकता है।
 * एक पथ-संवेदनशील विश्लेषण सशर्त शाखा निर्देशों पर विधेय पर निर्भर विश्लेषण जानकारी के विभिन्न टुकड़ों की गणना करता है। उदाहरण के लिए, यदि किसी शाखा में कोई शर्त है x>0, तो फ़ॉल-थ्रू पथ पर, विश्लेषण यह मान लेगा x<=0 और शाखा के निशाने पर यह मान लिया जाएगा कि वास्तव में x>0 रखती है।
 * एक संदर्भ-संवेदनशील विश्लेषण एक अंतरप्रक्रियात्मक विश्लेषण है जो फ़ंक्शन कॉल के लक्ष्य का विश्लेषण करते समय कॉलिंग संदर्भ पर विचार करता है। विशेष रूप से, संदर्भ जानकारी का उपयोग करके कोई भी मूल कॉल साइट पर वापस जा सकता है, जबकि उस जानकारी के बिना, विश्लेषण जानकारी को सभी संभावित कॉल साइटों पर वापस प्रचारित करना पड़ता है, संभावित रूप से सटीकता खो देता है।

डेटा-प्रवाह विश्लेषणों की सूची

 * परिभाषाओं तक पहुँचना
 * जीवंतता विश्लेषण
 * निश्चित असाइनमेंट विश्लेषण
 * उपलब्ध अभिव्यक्ति
 * निरंतर प्रचार

यह भी देखें

 * सार व्याख्या
 * नियंत्रण प्रवाह विश्लेषण
 * XLT86