संरचित प्रोग्राम प्रमेय

संरचित प्रोग्राम प्रमेय, जिसे बोहम-जैकोपिनी की प्रमेय भी कहा जाता है, प्रोग्रामिंग लैंग्वेज सिद्धांत का एक परिणाम है। इसमें कहा गया है कि कंट्रोल-फ्लो ग्राफ का वर्ग (ऐतिहासिक रूप से इस संदर्भ में फ्लो संचित्र कहा जाता है) किसी भी गणना योग्य संक्रिया की गणना कर सकता है यदि यह उपप्रोग्राम को मात्र तीन विशिष्ट विधियों (कंट्रोल संरचनाओं) में जोड़ता है। ये इस प्रकार निम्नलिखित हैं-
 * 1) एक उपप्रोग्राम निष्पादित करना, और फिर दूसरा उपप्रोग्राम (अनुक्रम)।
 * 2) बूलियन डेटा प्रकार अभिव्यक्ति (चयन) के मान के अनुसार दो उपप्रोग्रामों में से को निष्पादित करना।
 * 3) जब तक बूलियन अभिव्यक्ति सत्य है तब तक उपप्रोग्राम को बार-बार निष्पादित करना (पुनरावृत्ति)।

इन बाधाओं के अधीन संरचित चार्ट, विशेष रूप से एकल निकास (जैसा कि इस लेख में बाद में वर्णित है) के लिए लूप बाधा, यद्यपि सूचना का ट्रैक रखने के लिए बिट्स के रूप में अतिरिक्त चर का उपयोग कर सकता है (मूल प्रमाण में अतिरिक्त पूर्णांक चर में संग्रहीत) जो मूल प्रोग्राम प्रोग्राम स्थान द्वारा प्रस्तुत करता है। इस प्रकार से निर्माण बोहम की प्रोग्रामिंग लैंग्वेज P' पर आधारित था।

अतः प्रमेय संरचित प्रोग्रामिंग का आधार बनाता है, प्रोग्रामिंग प्रतिमान जो गोटो कमांड से बचता है, और विशेष रूप से प्रक्रिया, अनुक्रम, चयन और पुनरावृत्ति का उपयोग करता है।

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

इस प्रकार से हरेल यह भी लिखते हैं कि अधिक सामान्य नाम 1970 के दशक के प्रारंभ में मिल्स हरलान द्वारा संरचना प्रमेय के रूप में प्रस्तावित किया गया था।

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

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

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

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

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

अतः एडवर्ड योरडन कहते हैं कि 1970 के दशक में असंरचित प्रोग्रामों को स्वचालित माध्यमों से संरचित प्रोग्रामों में बदलने का दार्शनिक विरोध भी था, इस तर्क के आधार पर कि किसी को प्रारंभ से ही संरचित प्रोग्रामिंग फैशन में सोचने की आवश्यकता थी। इस प्रकार से व्यावहारिक प्रतिवाद यह था कि ऐसे परिवर्तनों से वर्तमान प्रोग्रामों के बड़े समूह को लाभ हुआ। अतः स्वचालित परिवर्तन के पहले प्रस्तावों में एडवर्ड एशक्रॉफ्ट और जोहार मन्ना का 1971 का लेख था।

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

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

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

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

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

कोबोल पर अनुप्रयोग
अतः 1980 के दशक में आईबीएम के शोधकर्ता हरलान मिल्स ने कोबोल संरचना सुविधा के विकास का निरीक्षण किया, जिसने कोबोल कोड के लिए संरचना एल्गोरिदम लागू किया। इस प्रकार से मिल्स के परिवर्तन में प्रत्येक प्रक्रिया के लिए निम्नलिखित चरण सम्मिलित थे।


 * 1) प्रक्रिया में बेसिक ब्लॉक की पहचान करें।
 * 2) प्रत्येक ब्लॉक के प्रवेश पथ के लिए अद्वितीय लेबल (प्रोग्रामिंग लैंग्वेज) निर्दिष्ट करें, और प्रत्येक ब्लॉक के निकास पथों को उन प्रवेश पथों के लेबल के साथ लेबल करें जिनसे वे जुड़ते हैं। प्रक्रिया से वापसी के लिए 0 और प्रक्रिया के प्रवेश पथ के लिए 1 का उपयोग करें।
 * 3) प्रक्रिया को उसके मूल खंडों में विभाजित करें।
 * 4) प्रत्येक ब्लॉक के लिए जो मात्र निकास पथ का गंतव्य है, उस ब्लॉक को उस निकास पथ से पुनः संयोजित करें।
 * 5) प्रक्रिया में नवीन चर घोषित करें (संदर्भ के लिए L कहा जाता है)।
 * 6) प्रत्येक शेष असंबद्ध निकास पथ पर, स्टेटमेंट जोड़ें जो उस पथ पर लेबल मान पर L सेट करता है।
 * 7) परिणामी प्रोग्रामों को चयन विवरण में संयोजित करें जो प्रोग्राम को L द्वारा इंगित प्रवेश पथ लेबल के साथ निष्पादित करता है
 * 8) एक लूप बनाएं जो इस चयन स्टेटमेंट को तब तक निष्पादित करे जब तक L 0 न हो।
 * 9) एक अनुक्रम का निर्माण करें जो L से 1 आरंभ करता है और लूप निष्पादित करता है।

इस प्रकार से ध्यान दें कि चयन विवरण के कुछ स्थितियों को उपप्रक्रियाओं में परिवर्तित करके इस निर्माण में सुधार किया जा सकता है।

यह भी देखें

 * संरचित प्रोग्रामिंग
 * ट्यूरिंग पूर्णता

अग्रिम पठन
Material not yet covered above: