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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

यह भी देखें

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

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