नियंत्रण तालिका

From Vigyanwiki
Revision as of 15:53, 17 February 2023 by alpha>Indicwiki (Created page with "{{Refimprove|date=February 2009}} File:Control table.png|thumb|220px|यह सरल नियंत्रण तालिका एकल इनपुट चर के म...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
यह सरल नियंत्रण तालिका एकल इनपुट चर के मान के अनुसार प्रोग्राम प्रवाह को निर्देशित करती है। प्रत्येक तालिका प्रविष्टि में समानता (अंतर्निहित) और कार्रवाई कॉलम में प्रदर्शन करने के लिए प्रासंगिक सबरूटीन के लिए परीक्षण करने के लिए एक संभावित इनपुट मान होता है। यदि पॉइंटर्स समर्थित नहीं हैं, तो सबरूटीन का नाम एक सापेक्ष सबरूटीन नंबर से बदला जा सकता है

बहाव को काबू करें सरणी डेटा संरचनाएं हैं जो नियंत्रण प्रवाह को नियंत्रित करती हैं या प्रोग्राम नियंत्रण में एक प्रमुख भूमिका निभाती हैं। नियंत्रण तालिका की संरचना या सामग्री के बारे में कोई कठोर नियम नहीं हैं - इसकी योग्यता विशेषता केंद्रीय प्रसंस्करण इकाई या दुभाषिया (कंप्यूटिंग) द्वारा निष्पादन के माध्यम से किसी तरह से प्रवाह को नियंत्रित करने की क्षमता है। ऐसी तालिकाओं के डिज़ाइन को कभी-कभी तालिका-संचालित डिज़ाइन कहा जाता है[1][2] (हालांकि यह आमतौर पर सीधे रन-टाइम टेबल के बजाय बाहरी टेबल से स्वचालित रूप से कोड जनरेट करने को संदर्भित करता है)। कुछ मामलों में, नियंत्रण तालिकाएँ परिमित-राज्य मशीन | परिमित-राज्य-मशीन-आधारित ऑटोमेटा-आधारित प्रोग्रामिंग के विशिष्ट कार्यान्वयन हो सकती हैं। यदि नियंत्रण तालिका के कई पदानुक्रमित स्तर हैं तो वे पदानुक्रमित राज्य मशीनों के समतुल्य तरीके से व्यवहार कर सकते हैं[3]

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

कुछ मामलों में, नियंत्रण तालिकाओं की सामग्री को बनाए रखने के लिए गैर-प्रोग्रामर को सौंपा जा सकता है। उदाहरण के लिए, यदि उपयोगकर्ता द्वारा दर्ज किए गए खोज वाक्यांश में एक निश्चित वाक्यांश शामिल है, तो एक तालिका में एक URL (वेब ​​​​पता) निर्दिष्ट किया जा सकता है जो यह नियंत्रित करता है कि खोज उपयोगकर्ता को कहाँ ले जाया जाता है। यदि वाक्यांश में स्कर्ट है, तो तालिका उपयोगकर्ता को www.shopping.example/catalogs/skirts पर ले जा सकती है, जो कि स्कर्ट उत्पाद सूची पृष्ठ है। (उदाहरण URL व्यवहार में काम नहीं करता है)। प्रोग्रामर के बजाय विपणन कर्मी ऐसी तालिका का प्रबंधन कर सकते हैं।

विशिष्ट उपयोग

अधिक उन्नत उपयोग

  • एक दुभाषिया (कंप्यूटिंग) द्वारा संसाधित आभासी मशीन के लिए आभासी निर्देशों के रूप में कार्य करना
बाईटकोड के समान - लेकिन आमतौर पर तालिका संरचना द्वारा निहित संचालन के साथ

तालिका संरचना

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

एक आयामी टेबल

शायद इसके सबसे सरल कार्यान्वयन में, एक नियंत्रण तालिका कभी-कभी कच्चे डेटा मान को संबंधित सबरूटीन ऑफ़सेट (कंप्यूटर विज्ञान), सरणी डेटा संरचना या पॉइंटर (कंप्यूटर प्रोग्रामिंग) में कच्चे डेटा मान का सीधे उपयोग करने के लिए सीधे अनुवाद करने के लिए एक आयामी तालिका हो सकती है। सरणी के सूचकांक के रूप में, या पहले से डेटा पर कुछ बुनियादी अंकगणितीय प्रदर्शन करके। यह निरंतर समय में प्राप्त किया जा सकता है (बिना रैखिक खोज या द्विआधारी खोज के एक साहचर्य सरणी पर एक विशिष्ट लुकअप तालिका का उपयोग करके)। अधिकांश कंप्यूटर आर्किटेक्चर में, इसे दो या तीन मशीन निर्देशों में पूरा किया जा सकता है - बिना किसी तुलना या लूप के। तकनीक को तुच्छ हैश फ़ंक्शन के रूप में जाना जाता है या, जब विशेष रूप से शाखा तालिकाओं के लिए उपयोग किया जाता है, डबल प्रेषण। इसके व्यवहार्य होने के लिए, डेटा के सभी संभावित मानों की सीमा छोटी होनी चाहिए (उदाहरण के लिए एक ASCII या EBCDIC वर्ण मान जिसमें हेक्साडेसिमल '00' - 'FF' की सीमा होती है। यदि वास्तविक सीमा कम होने की गारंटी है इसके अलावा, सरणी को 256 बाइट्स से कम तक छोटा किया जा सकता है)।

'एक-आयामी सरणी का उपयोग करके निरंतर समय में कच्चे ASCII मानों (ए, डी, एम, एस) को नए सबरूटीन इंडेक्स (1,4,3,2) में अनुवाद करने की तालिका'

(इस उदाहरण के लिए श्रेणी में अंतराल '..' के रूप में दिखाए गए हैं, जिसका अर्थ है 'अगली पंक्ति तक सभी हेक्स मान'। पहले दो कॉलम सरणी का हिस्सा नहीं हैं)

ASCII Hex Array
null 00 00
.. .. 00
@ 40 00
A 41 01
.. .. 00
D 44 04
.. .. 00
M 4D 03
.. .. 00
S 53 02

ऑटोमेटा-आधारित प्रोग्रामिंग और छद्म संवादात्मक लेनदेन प्रसंस्करण में, यदि अलग-अलग प्रोग्राम स्टेट्स की संख्या कम है, तो मुख्य प्रोग्राम लूप के पूरे प्रवाह को कुशलतापूर्वक निर्देशित करने के लिए एक घने अनुक्रम नियंत्रण चर का उपयोग किया जा सकता है।

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

शाखा टेबल

एक शाखा तालिका सन्निहित मशीन कोड शाखा (कंप्यूटर विज्ञान) की एक-आयामी 'सरणी' है। शाखा/कूद निर्देश एक मल्टीवे शाखा को प्रोग्राम लेबल पर प्रभावित करने के लिए जब तुरंत पूर्ववर्ती और अनुक्रमित शाखा द्वारा शाखाबद्ध किया जाता है। यह कभी-कभी एक स्विच स्टेटमेंट को निष्पादित करने के लिए एक अनुकूलन संकलक द्वारा उत्पन्न होता है - बशर्ते कि इनपुट रेंज छोटी और सघन हो, कुछ अंतराल के साथ (जैसा कि पिछले सरणी उदाहरण द्वारा बनाया गया है) [1]

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

बहु-आयामी टेबल

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

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

तालिका सामग्री

एक नियंत्रण तालिका अनिवार्य रूप से एक पारंपरिक कार्यक्रम के 'सार' का प्रतीक है, इसकी प्रोग्रामिंग भाषा सिंटैक्स और प्लेटफॉर्म पर निर्भर घटकों (जैसे IF/THEN DO.., FOR.., DO WHILE.., SWITCH, GOTO, CALL) और ' संघनित' इसके चर (जैसे इनपुट 1), मान (जैसे 'ए', 'एस', 'एम' और 'डी'), और सबरूटीन पहचान (जैसे 'जोड़ें', 'घटाना,..' या #1, # 2,...). तालिका की संरचना में आमतौर पर शामिल (डिफ़ॉल्ट) लॉजिकल ऑपरेशंस शामिल होते हैं - जैसे 'समानता के लिए परीक्षण', एक सबरूटीन और 'अगला ऑपरेशन' करना या डिफ़ॉल्ट अनुक्रम का पालन करना (इन्हें प्रोग्राम स्टेटमेंट के भीतर स्पष्ट रूप से बताए जाने के बजाय - आवश्यकतानुसार अन्य प्रोग्रामिंग प्रतिमानों में)।

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

नीचे दी गई तालिका केवल 'इनपुट1' पर लागू होती है क्योंकि तालिका में कोई विशिष्ट इनपुट निर्दिष्ट नहीं किया गया है।

'संरचना द्वारा निहित शर्तें और क्रियाएं'

(implied) IF = (implied) perform
value action
value action

(मूल्य और क्रिया की इस साइड-बाय-साइड जोड़ी में इवेंट-संचालित प्रोग्रामिंग, अर्थात् 'ईवेंट-डिटेक्शन' और 'इवेंट-हैंडलिंग' में समानताएं हैं, लेकिन बिना (आवश्यक रूप से) ईवेंट की अतुल्यकालिक प्रणाली प्रकृति)

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

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

तालिका स्थान

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

दुभाषिया और सबरूटीन्स

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

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

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

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

प्रदर्शन विचार

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

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

नियंत्रण तालिकाओं के उदाहरण

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

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

सीटी1

input 1 pointer
A -->Add
S -->Subtract
M -->Multiply
D -->Divide
? -->Default

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

IBM/360 (अधिकतम 16Mb एड्रेस रेंज) या Z/आर्किटेक्चर के लिए असेंबली भाषा का उदाहरण

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

  * ------------------ दुभाषिया ------------------------------ --------------*
           LM R14,R0,=A(4,CT1,N) सेट करें R14=4, R15 --> तालिका, और R0 = संख्या। तालिका में प्रविष्टियों की संख्या (एन)
  CLC INPUT1,0(R15) का प्रयास करें ********* तालिका प्रविष्टि में मूल्य मिला?
           कार्रवाई हो * पाश * हाँ, तालिका से उप-दिनचर्या में लोड रजिस्टर सूचक
           AR R15,R14 * * नहीं, R14 (=4) जोड़कर CT1 में अगली प्रविष्टि की ओर इशारा करें
           बीसीटी आर0, कोशिश करें ********* गिनती समाप्त होने तक वापस जाएं, फिर छोड़ें
  . डिफ़ॉल्ट क्रिया ... तालिका में कोई भी मान मेल नहीं खाता, कुछ और करें
           LA R15,4(R15) बिंदु से डिफ़ॉल्ट प्रविष्टि (तालिका के अंत से परे)
  कार्रवाई एल R15,0(R15) R15 में सूचक मिलता है, जहां से R15 अंक
           BALR R14, R15 उप-दिनचर्या (कॉल और वापसी) करें
           B END जाओ इस कार्यक्रम को समाप्त करो
  * ------------------ कंट्रोल टेबल -------------------------------------------- ------------*
  * | स्वीकार्य EBCDIC या ASCII मानों के इस कॉलम का परीक्षण '=' चर 'input1' के विरुद्ध किया जाता है
  * | | यह कॉलम उपयुक्त सबरूटीन का 3-बाइट पता है
  * वि वि
  CT1 DC C'A', AL3(ADD) कंट्रोल टेबल का स्टार्ट (4 बाइट एंट्री लेंथ)
           DC C'S', AL3 (घटाना)
           DC C'M', AL3 (गुणा करें)
           DC C'D', AL3 (डिवाइड)
  N EQU (*-CT1)/4 तालिका में मान्य प्रविष्टियों की संख्या (कुल लंबाई / प्रविष्टि लंबाई)
           DC C'?',AL3(डिफ़ॉल्ट) डिफ़ॉल्ट प्रविष्टि - सभी को पकड़ने के लिए ड्रॉप थ्रू पर उपयोग की जाती है
  INPUT1 DS C इनपुट वेरिएबल इस वेरिएबल में है
  * ------------------ उप-दिनचर्या ---------------------------- --------------*
  जोड़ें CSECT उप-दिनचर्या #1 (यहाँ अलग CSECT के रूप में दिखाया गया है लेकिन हो सकता है
  . वैकल्पिक रूप से इन-लाइन कोड हो)
  . जोड़ने के लिए निर्देश
           बीआर आर14 वापसी
  घटाएँ CSECT उप-दिनचर्या #2
  . घटाने के लिए निर्देश (ओं)।
           बीआर आर14 वापसी
  . वगैरह..

उपरोक्त उदाहरण में दुभाषिया के प्रदर्शन में सुधार

उपरोक्त उदाहरण में चयन करने के लिए, औसत निर्देश पथ की लंबाई (सबरूटीन कोड को छोड़कर) '4n/2 +3' है, लेकिन इसे आसानी से कम किया जा सकता है, जहां n = 1 से 64, एक रैखिक समय के लिए शून्य तुलना के साथ '5' की पथ लंबाई के साथ, यदि कच्चे EBCDIC डेटा से CT1 के लिए एक सीधा सूचकांक बनाने के लिए पहली बार 256 बाइट अनुवाद तालिका का उपयोग किया जाता है। जहाँ n = 6, यह तब केवल 3 अनुक्रमिक तुलना और शाखा निर्देशों के बराबर होगा। हालाँकि, जहाँ n <= 64, औसतन इसे कई तुलनाओं का उपयोग करने की तुलना में लगभग 13 गुना कम निर्देशों की आवश्यकता होगी। जहां n = 1 से 256, औसतन यह लगभग 42 गुना कम निर्देशों का उपयोग करेगा - चूंकि, इस मामले में, एक अतिरिक्त निर्देश की आवश्यकता होगी (सूचकांक को 4 से गुणा करने के लिए)।

'बेहतर दुभाषिया' (ऊपर दिए गए उदाहरण की तुलना में औसतन '26 गुना कम निष्पादित निर्देश' तक, जहां n = 1 से 64 और कई तुलनाओं का उपयोग करके 13 गुना कम की आवश्यकता होगी)।

64 विभिन्न इनपुट मानों को संभालने के लिए, स्रोत कोड (या कम) की लगभग 85 पंक्तियों की आवश्यकता होती है (मुख्य रूप से एकल पंक्ति तालिका प्रविष्टियाँ) जबकि एकाधिक 'तुलना और शाखा' के लिए लगभग 128 पंक्तियों की आवश्यकता होगी (बाइनरी फ़ाइल का आकार भी लगभग आधा है - दूसरी अनुक्रमणिका निकालने के लिए आवश्यक अतिरिक्त 256 बाइट तालिका के बावजूद)।

  * ------------------ दुभाषिया ------------------------------ --------------*
           SR R14,R14 ********* सेट R14=0
  CALC IC R14, INPUT1 * calc * EBCDIC बाइट को R14 के लो ऑर्डर बिट्स (24–31) में डालें
           IC R14, CT1X (R14) * * EBCDIC वैल्यू को टेबल 'CT1X' पर इंडेक्स के रूप में उपयोग करके नया इंडेक्स प्राप्त करें
  FOUND L R15, CT1(R14) ********* इंडेक्स (0,4, 8 आदि) का उपयोग करके सबरूटीन के लिए पॉइंटर प्राप्त करें।
           BALR R14, R15 सब-रूटीन निष्पादित करें (कॉल करें और वापसी या डिफ़ॉल्ट)
           B END जाओ इस कार्यक्रम को समाप्त करो
  * --------------- अतिरिक्त ट्रांसलेट टेबल (EBCDIC --> पॉइंटर टेबल INDEX) 256 बाइट्स ----*
  CT1X DC 12AL1(00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00) x'00 के 16 बाइट्स के 12 समान सेट
  * X'00 - x'BF' का प्रतिनिधित्व
           DC AL1(00,'04',00,00,'16',00,00,00,00,00,00,00,00,00,00,00) ..x'C0' - X'CF'
           DC AL1(00,00,00,00,'12',00,00,00,00,00,00,00,00,00,00,00) ..x'D0' - X'DF'
           DC AL1(00,00,'08',00,00,00,00,00,00,00,00,00,00,00,00,00) ..x'E0' - X'EF'
           DC AL1(00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00) ..x'F0' - X'FF'
  * कोडांतरक का उपयोग स्वचालित रूप से सूचकांक मूल्यों की गणना करने और मूल्यों को अधिक उपयोगकर्ता के अनुकूल बनाने के लिए किया जा सकता है
  * (उदाहरण के लिए '04' को उपरोक्त तालिका CT1X में प्रतीकात्मक अभिव्यक्ति 'PADD-CT1' से बदला जा सकता है)
  * संशोधित CT1 (सूचकांक = 00, एकल आयाम, पूर्ण 31 बिट पता होने पर एक डिफ़ॉल्ट क्रिया जोड़ा गया)
  'CT1' DC A(डिफ़ॉल्ट) इंडेक्स =00 कंट्रोल टेबल का स्टार्ट (4 बाइट एड्रेस कॉन्स्टेंट)
  पीएडीडी डीसी ए (एडीडी) = 04
  पीएसयूबी डीसी ए (घटाना) = 08
  पीएमयूएल डीसी ए (गुणा) =12
  पीडीआईवी डीसी ए (डिवाइड) =16
  * शेष कोड पहले उदाहरण के समान ही रहता है

'आगे बेहतर दुभाषिया' (औसत पर पहले उदाहरण की तुलना में '21 गुना कम निष्पादित निर्देश (जहां n> = 64)' और कई तुलनाओं का उपयोग करके 42 गुना कम की आवश्यकता होगी)।

256 विभिन्न इनपुट मानों को संभालने के लिए, स्रोत कोड या उससे कम की लगभग 280 पंक्तियों की आवश्यकता होगी (मुख्य रूप से एकल पंक्ति तालिका प्रविष्टियाँ), जबकि एकाधिक 'तुलना और शाखा' के लिए लगभग 512 पंक्तियों की आवश्यकता होगी (बाइनरी फ़ाइल का आकार भी लगभग आधा है) एक बार और)।

  * ------------------ दुभाषिया ------------------------------ --------------*
           SR R14,R14 ********* सेट R14=0
  CALC IC R14, INPUT1 * calc * EBCDIC बाइट को R14 के लो ऑर्डर बिट्स (24–31) में डालें
           IC R14, CT1X(R14) * * EBCDIC v का उपयोग करेंनई अनुक्रमणिका प्राप्त करने के लिए तालिका 'CT1X' पर अनुक्रमणिका के रूप में alue
           SLL R14,2 * * 'सूचकांक को 4 से गुणा करें (अतिरिक्त निर्देश)'
  FOUND L R15, CT1(R14) ********* इंडेक्स (0,4, 8 आदि) का उपयोग करके सबरूटीन के लिए पॉइंटर प्राप्त करें।
           BALR R14, R15 सब-रूटीन निष्पादित करें (कॉल करें और वापसी या डिफ़ॉल्ट)
           B END जाओ इस कार्यक्रम को समाप्त करो
  * --------------- अतिरिक्त ट्रांसलेट टेबल (EBCDIC --> पॉइंटर टेबल INDEX) 256 बाइट्स ----*
  CT1X DC 12AL1(00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00) x'00' के 16 बाइट्स के 12 समान सेट
  * X'00 - x'BF' का प्रतिनिधित्व
           DC AL1(00,'01',00,00,'04',00,00,00,00,00,00,00,00,00,00,00) ..x'C0' - X'CF'
           DC AL1(00,00,00,00,'03',00,00,00,00,00,00,00,00,00,00,00) ..x'D0' - X'DF'
           DC AL1(00,00,'02',00,00,00,00,00,00,00,00,00,00,00,00,00) ..x'E0' - X'EF'
           DC AL1(00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00) ..x'F0' - X'FF'
  * कोडांतरक का उपयोग स्वचालित रूप से सूचकांक मूल्यों की गणना करने और मूल्यों को अधिक उपयोगकर्ता के अनुकूल बनाने के लिए किया जा सकता है
  * (उदाहरण के लिए '01' को उपरोक्त तालिका CT1X में प्रतीकात्मक अभिव्यक्ति 'PADD-CT1/4' से बदला जा सकता है)
  * संशोधित CT1 (इंडेक्स अब 0,1,2,3,4 नहीं 0,4,8,12,16 पर आधारित है, ताकि सभी 256 विविधताओं को अनुमति दी जा सके)
  'CT1' DC A(डिफ़ॉल्ट) इंडेक्स =00 कंट्रोल टेबल का स्टार्ट (4 बाइट एड्रेस कॉन्स्टेंट)
  पीएडीडी डीसी ए (एडीडी) = 01
  पीएसयूबी डीसी ए (घटाना) = 02
  पीएमयूएल डीसी ए (गुणा) = 03
  पीडीआईवी डीसी ए (डिवाइड) = 04
  * शेष कोड दूसरे उदाहरण के समान ही रहता है

'सी (प्रोग्रामिंग भाषा) उदाहरण' C (प्रोग्रामिंग लैंग्वेज) में यह उदाहरण दो तालिकाओं का उपयोग करता है, पहला (CT1) एक सरल रैखिक खोज एक-आयामी लुकअप तालिका है - इनपुट (x), और दूसरा, संबद्ध तालिका (CT1p) का मिलान करके एक सूचकांक प्राप्त करने के लिए। जाने के लिए लेबल के पतों की एक तालिका है। <वाक्यविन्यास प्रकाश लैंग = सी>

स्थिर स्थिरांक चार CT1 [] = {ए, एस, एम, डी}; / * अनुमत इनपुट मान * /
स्थिर स्थिरांक शून्य *CT1p[] = {&&जोड़ें, &&घटाना, &&गुणा करें, &&विभाजित करें, &&डिफ़ॉल्ट}; /* गोटो और डिफ़ॉल्ट के लिए लेबल*/
for (int i = 0; i < sizeof(CT1); i++) /* ASCII मानों के माध्यम से लूप */
  {अगर (x==CT1[i]) गोटो *CT1p[i]; } /* मिला --> उपयुक्त लेबल */
गोटो *CT1p[i+1]; /* नहीं मिला --> डिफ़ॉल्ट लेबल */

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

स्थैतिक स्थिरांक शून्य *CT1p[] = {&&डिफ़ॉल्ट, &&जोड़ें, &&घटाना, &&गुणा, &&विभाजित करें};
/* नीचे दी गई 256 बाइट तालिका, संबंधित ASCII स्थितियों (A,S,M,D) में मान (1,2,3,4) रखती है, अन्य सभी 0x00 पर सेट हैं */
स्थिर स्थिरांक चार CT1x [] = {
            '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
            '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00','\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
            '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
            '\x00', '\x01', '\x00', '\x00', '\x04', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x03', '\x00', '\x00',
            '\x00', '\x00', '\x00', '\x02', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
            '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
            '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
            '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
            '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
            '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
            '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
            '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
            '\x00', '\x00', '\x00', '\x00', '\x03', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
            '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00',
            '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00'};
/ * इनपुट वर्ण (x) के मान की परवाह किए बिना, निम्न कोड निरंतर समय में निष्पादित होगा * /
मैं = CT1x (एक्स); /* तालिका CT1x से सही उपनेमका अनुक्रमणिका निकालें इसके ASCII मान का प्रारंभ में एक अनुक्रमणिका के रूप में उपयोग करके */
गोटो *CT1p[i]; /* गोटो (इस पर स्विच करें) इंडेक्स से संबंधित लेबल (0=डिफ़ॉल्ट, 1=जोड़ें, 2=घटाना,।) - CT1p देखें */

</वाक्यविन्यास हाइलाइट>

नीचे दिया गया अगला उदाहरण बताता है कि कैसे एक समान प्रभाव उन भाषाओं में प्राप्त किया जा सकता है जो डेटा संरचनाओं में सूचक परिभाषाओं का समर्थन नहीं करती हैं लेकिन एक उपनेमका के लिए अनुक्रमित शाखाओं का समर्थन करती हैं - एक (शून्य-आधारित नंबरिंग|0-आधारित) के भीतर निहित ) सबरूटीन पॉइंटर्स की सरणी। टेबल (CT2) का उपयोग इंडेक्स (दूसरे कॉलम से) को पॉइंटर ऐरे (CT2P) में निकालने के लिए किया जाता है। यदि सूचक सरणियों का समर्थन नहीं किया जाता है, तो स्विच स्टेटमेंट या समतुल्य का उपयोग प्रोग्राम लेबल्स के अनुक्रम में से एक में नियंत्रण प्रवाह को बदलने के लिए किया जा सकता है (उदाहरण: केस0, केस1, केस2, केस3, केस4) जो या तो सीधे इनपुट को प्रोसेस करते हैं, या अन्यथा इससे निपटने के लिए उपयुक्त उपनेमका (डिफ़ॉल्ट, जोड़ें, घटाएं, गुणा या विभाजित करें,..) पर कॉल करें (वापसी के साथ)।

'सीटी2'

input 1 subr #
A 1
S 2
M 3
D 4
? 0

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

CT2P सूचक सरणी
pointer array
-->default
-->Add
-->Subtract
-->Multiply
-->Divide
-->?other

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

'सीटी3'

input 1 alternate subr # count
A a 1 0
S s 2 0
M m 3 0
D d 4 0
? ? 0 0

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

इस तरह की तालिकाओं में, जहां समान तालिका प्रविष्टियों की एक श्रृंखला संपूर्ण तर्क को परिभाषित करती है, एक तालिका प्रविष्टि संख्या या सूचक प्रभावी रूप से अधिक पारंपरिक कार्यक्रमों में कार्यक्रम गणक की जगह ले सकता है और एक 'कार्रवाई' में रीसेट किया जा सकता है, जिसे इसमें भी निर्दिष्ट किया गया है। तालिका प्रविष्टि। नीचे दिए गए उदाहरण (सीटी4) से पता चलता है कि पिछली तालिका को विस्तारित करने के लिए, 'अगली' प्रविष्टि (और/या 'परिवर्तन प्रवाह' (शाखा (कंप्यूटर विज्ञान)) उपनेमका शामिल करने के लिए) एक प्रोग्राम लूप बना सकता है (यह उदाहरण वास्तव में नहीं है इस तरह की नियंत्रण तालिका बनाने का सबसे कुशल तरीका लेकिन, ऊपर दिए गए पहले उदाहरणों से एक क्रमिक 'विकास' का प्रदर्शन करके, दिखाता है कि व्यवहार को संशोधित करने के लिए अतिरिक्त कॉलम का उपयोग कैसे किया जा सकता है।) पाँचवाँ कॉलम दर्शाता है कि एक से अधिक क्रियाएँ शुरू की जा सकती हैं एकल तालिका प्रविष्टि - इस मामले में प्रत्येक प्रविष्टि के सामान्य प्रसंस्करण के बाद की जाने वाली कार्रवाई ('-' मान का अर्थ है 'कोई शर्त नहीं' या 'कोई कार्रवाई नहीं')।

स्ट्रक्चर्ड प्रोग्रामिंग या स्ट्रक्चर्ड प्रोग्रामिंग | गोटो-लेस कोड, ('लूप करते समय करें' या 'लूप के लिए' निर्माण के समतुल्य को शामिल करते हुए), उपयुक्त रूप से डिज़ाइन किए गए और 'इंडेंटेड' नियंत्रण तालिका संरचनाओं के साथ भी समायोजित किया जा सकता है।

'सीटी4' (इनपुट1 और प्रक्रिया को पढ़ने के लिए एक पूर्ण 'प्रोग्राम', 'ई' मिलने तक दोहराता है)

input 1 alternate subr # count jump
- - 5 0 -
E e 7 0 -
A a 1 0 -
S s 2 0 -
M m 3 0 -
D d 4 0 -
? ? 0 0 -
- - 6 0 1
CT4P सूचक सरणी
pointer array
-->Default
-->Add
-->Subtract
-->Multiply
-->Divide
-->Read Input1
-->Alter flow
-->End


तालिका-संचालित रेटिंग

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

स्प्रेडशीट

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

प्रोग्रामिंग प्रतिमान

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

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

निर्देश लाने

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

निगरानी नियंत्रण तालिका निष्पादन

डिबगिंग उद्देश्यों, हॉट स्पॉट (कंप्यूटर विज्ञान) का पता लगाने, कोड कवरेज़ विश्लेषण और वास्तविक प्रोग्राम प्रवाह के पूर्ण या आंशिक ट्रेस को रिकॉर्ड करने के लिए दुभाषिया कार्यक्रम वैकल्पिक रूप से प्रोग्राम काउंटर (और निर्देश प्रकार के आधार पर अन्य प्रासंगिक विवरण) को सहेज सकता है। रूपरेखा (कंप्यूटर प्रोग्रामिंग) (ऊपर CT3 और CT4 के उदाहरण देखें)।

लाभ

  • स्पष्टता - तालिका (सूचना) सर्वव्यापी कंप्यूटिंग है और आम जनता द्वारा भी स्वाभाविक रूप से समझी जाती है (विशेषकर उपयोगकर्ता गाइड में दोष निदान तालिकाएँ)
  • पोर्टेबिलिटी - 100% भाषा स्वतंत्र (और प्लेटफ़ॉर्म स्वतंत्र - दुभाषिया को छोड़कर) के लिए डिज़ाइन किया जा सकता है
  • लचीलापन - या तो भाषा आदिम या सबरूटीन्स को पारदर्शी रूप से निष्पादित करने की क्षमता और समस्या के अनुरूप कस्टम डिज़ाइन किया जाना
  • सघनता - तालिका आमतौर पर साथ-साथ स्थिति/क्रिया जोड़ी दिखाती है (सामान्य प्लेटफ़ॉर्म/भाषा कार्यान्वयन निर्भरताओं के बिना), जिसके परिणामस्वरूप अक्सर
    • बाइनरी फाइल - निर्देशों के कम दोहराव के माध्यम से आकार में कमी
    • स्रोत कोड फ़ाइल - कई सशर्त बयानों के उन्मूलन के माध्यम से आकार में कमी आई है
    • बेहतर प्रोग्राम लोड (या डाउनलोड) गति
  • रख-रखाव - टेबल अक्सर बनाए रखने के लिए आवश्यक स्रोत लाइनों की संख्या को कम करते हैं v। कई तुलनाएँ
  • संदर्भ की लोकैलिटी - कॉम्पैक्ट टेबल स्ट्रक्चर के परिणामस्वरूप कैश में शेष टेबल (कंप्यूटिंग)
  • कोड पुन: उपयोग - दुभाषिया आमतौर पर पुन: प्रयोज्य होता है। बार-बार इसे ठीक उसी तकनीक का उपयोग करके नए प्रोग्रामिंग कार्यों के लिए आसानी से अनुकूलित किया जा सकता है और टेबल परिभाषाओं द्वारा नियंत्रित, 'ऑर्गेनिक रूप से' बन सकता है, वास्तव में, आजमाए हुए और परखे हुए सबरूटीन्स की एक मानक लाइब्रेरी।
  • एल्गोरिथम दक्षता - प्रणालीगत अनुकूलन संभव। दुभाषिया में कोई भी प्रदर्शन सुधार आमतौर पर इसका उपयोग करने वाले सभी अनुप्रयोगों में सुधार करता है (ऊपर 'CT1' में उदाहरण देखें)।
  • एक्स्टेंसिबल - नया 'निर्देश' जोड़ा जा सकता है - केवल दुभाषिया का विस्तार करके
  • इंटरप्रेटर को एप्लिकेशन प्रोग्राम की तरह लिखा जा सकता है

वैकल्पिक रूप से:-

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

नुकसान

  • प्रशिक्षण की आवश्यकता - एप्लिकेशन प्रोग्रामर आमतौर पर सामान्य समाधान तैयार करने के लिए प्रशिक्षित नहीं होते हैं

निम्नलिखित मुख्य रूप से बहु-आयामी तालिकाओं में उनके उपयोग पर लागू होते हैं, न कि पहले चर्चा की गई एक-आयामी तालिकाओं पर।

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

उद्धरण

Multiway branching is an important programming technique which is all too often replaced by an inefficient sequence of if tests. Peter Naur recently wrote me that he considers the use of tables to control program flow as a basic idea of computer science that has been nearly forgotten; but he expects it will be ripe for rediscovery any day now. It is the key to efficiency in all the best compilers I have studied.

— Donald Knuth, Structured Programming with go to Statements

There is another way to look at a program written in interpretative language. It may be regarded as a series of subroutine calls, one after another. Such a program may in fact be expanded into a long sequence of calls on subroutines, and, conversely, such a sequence can usually be packed into a coded form that is readily interpreted. The advantage of interpretive techniques are the compactness of representation, the machine independence, and the increased diagnostic capability. An interpreter can often be written so that the amount of time spent in interpretation of the code itself and branching to the appropriate routine is negligible

— Donald Knuth, The Art of Computer Programming Volume 1, 1997, page 202

The space required to represent a program can often be decreased by the use of interpreters in which common sequences of operations are represented compactly. A typical example is the use of a finite-state machine to encode a complex protocol or lexical format into a small table

— Jon Bentley, Writing Efficient Programs

Jump tables can be especially efficient if the range tests can be omitted. For example, if the control value is an enumerated type (or a character) then it can only contain a small fixed range of values and a range test is redundant provided the jump table is large enough to handle all possible values

— David.A. SPULER, Compiler Code Generation for Multiway Branch Statements as a Static Search Problem

Programs must be written for people to read, and only incidentally for machines to execute.

— "Structure and Interpretation of Computer Programs", preface to the first edition, Abelson & Sussman

Show me your flowchart and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won't usually need your flowchart; it'll be obvious.

— "The Mythical Man-Month: Essays on Software Engineering", Fred Brooks


यह भी देखें

  • ऑटोमेटा-आधारित प्रोग्रामिंग
  • डेटाबेस-केंद्रित संरचना
  • डेटा-संचालित परीक्षण
  • निर्णय तालिका
  • परिमित अवस्था मशीन
  • कीवर्ड चालित परीक्षण
  • सूचक (कंप्यूटर प्रोग्रामिंग)
  • स्विच स्टेटमेंट - एकल इनपुट चर के आधार पर कई लेबल (प्रोग्रामिंग लैंग्वेज) में से किसी एक के लिए मल्टीवे ब्रांचिंग
  • थ्रेडेड कोड
  • थ्रेडेड कोड # टोकन थ्रेडिंग

टिप्पणियाँ

  1. Programs from decision tables, Humby, E., 2007,Macdonald, 1973 ... Biggerstaff, Ted J. Englewood Cliffs, NJ : Prentice-Hall ISBN 0-444-19569-6
  2. "Archived copy" (PDF). Archived from the original (PDF) on 10 June 2016. Retrieved 17 May 2016.{{cite web}}: CS1 maint: archived copy as title (link)
  3. UML state machine#Hierarchically nested states
  4. Carl Wright, Service Level Corpo. (2002) Program Code Based vs. Table-driven vs. Rule-Based Rating, Rating Matters issue n. 12, 13 November 2002 ISSN 1532-1886
  5. Brian E. Clauser, Melissa J. Margolis, Stephen G. Clyman, Linette P. Ross (1997) Development of Automated Scoring Algorithms for Complex Performance Assessments: A Comparison of Two Approaches Journal of Educational Measurement, Vol. 34, No. 2 (Summer, 1997), pp. 141–161


संदर्भ


बाहरी संबंध