नियंत्रण तालिका
नियंत्रण तालिकाएँ वे तालिकाएँ होती हैं जो नियंत्रण प्रवाह को नियंत्रित करती हैं या कार्यक्रम नियंत्रण में एक प्रमुख भूमिका निभाती हैं। नियंत्रण तालिका की संरचना या सामग्री के बारे में कोई कठोर नियम नहीं हैं - इसकी योग्यता विशेषता केंद्रीय प्रसंस्करण इकाई या दुभाषिया (संगणन) द्वारा निष्पादन के माध्यम से किसी तरह से प्रवाह को नियंत्रित करने की क्षमता है। ऐसी तालिकाओं के अभिकल्पना को कभी-कभी तालिका-संचालित अभिकल्पना कहा जाता है[1][2] (चूंकि यह सामान्यत: सीधे कार्यावधि तालिका के अतिरिक्त बाहरी तालिका से स्वचालित रूप से कूट उत्पन्न करने को संदर्भित करता है)। कुछ स्थितियों में, नियंत्रण तालिकाएँ परिमित-अवस्था मशीन | परिमित-अवस्था-मशीन-आधारित स्वचालित-आधारित क्रमादेशन के विशिष्ट कार्यान्वयन हो सकती हैं। यदि नियंत्रण तालिका के कई पदानुक्रमित स्तर हैं तो वे पदानुक्रमित अवस्था मशीन के समतुल्य तरीके से व्यवहार कर सकते हैं[3]
नियंत्रण तालिकाओं में अधिकांशत: सशर्त (क्रमादेशन) या उपनेमिका संदर्भ (संगणक विज्ञान) के समतुल्य होते हैं, जो सामान्यत: संघ सूची में उनके सापेक्ष स्तंभ स्थिति से निहित होते हैं। नियंत्रण तालिकाएँ समान आँकड़ा संरचनाओं या क्रमादेश प्रकथन को बार-बार क्रमादेशन करने की आवश्यकता को कम करती हैं। अधिकांश तालिकाओं की द्वि-आयामी प्रकृति क्रमादेश कूट की एक-आयामी प्रकृति की तुलना में उन्हें देखने और अद्यतन करने में आसान बनाती है।
कुछ स्थितियों में, नियंत्रण तालिकाओं की सामग्री को बनाए रखने के लिए गैर-क्रमादेशक को सौंपा जा सकता है। उदाहरण के लिए, यदि उपयोगकर्ता द्वारा दर्ज किए गए खोज वाक्यांश में एक निश्चित वाक्यांश सम्मलित है, तो एक तालिका में एक यूआरएल (वेब पता) निर्दिष्ट किया जा सकता है जो यह नियंत्रित करता है कि खोज उपयोगकर्ता को कहाँ ले जाया जाता है। यदि वाक्यांश में स्कर्ट(किनारा) है, तो तालिका उपयोगकर्ता को www.shopping.example/catalogs/skirts पर ले जा सकती है, जो कि स्कर्ट उत्पाद सूची पृष्ठ है। (उदाहरण यूआरएल पद्धति में काम नहीं करता है)। क्रमादेशक के अतिरिक्त विपणन कर्मी ऐसी तालिका का प्रबंधन कर सकते हैं।
विशिष्ट उपयोग
- निविष्ट मानों का परिवर्तन:
- बाद में शाखन या सूचक (संगणक क्रमादेशन) तालिका देखने के लिए एक सहयोगी सरणी
- नियंत्रण प्रवाह को बदलने के लिए क्रमादेश का नाम, संबंधित उपनेमिका संख्या, सूचक (क्रमादेशन भाषा) या क्रमादेश अतर्लव (संगणक विज्ञान)
- अवस्था संक्रमण फलन के लिए नियंत्रण चर (क्रमादेशन) का उपयोग करके अनुवृत्त-संचालित क्रमादेशन में एक मुख्य प्रस्पंद को नियंत्रित करना
- ऑनलाइन लेनदेन प्रसंस्करण अनुप्रयोगों के लिए कार्यक्रम चक्र को नियंत्रित करना
अधिक उन्नत उपयोग
- एक दुभाषिया (संगणन) द्वारा संसाधित आभासी मशीन के लिए आभासी निर्देशों के रूप में कार्य करना।
- बाईट कूट के समान - लेकिन सामान्यत: तालिका संरचना द्वारा निहित संचालन के साथ।
तालिका संरचना
तालिकाओं में निश्चित या चर लंबाई कूट के कई आयाम हो सकते हैं और सामान्यत: संगणक मंच के बीच सॉफ्टवेयर सुवाह्य होती है, जिसके लिए केवल दुभाषिया में बदलाव की आवश्यकता होती है, न कि स्वयं कलन विधि - जिसका तर्क तालिका संरचना और सामग्री के अंदर अनिवार्य रूप से सन्निहित है। तालिका की संरचना एक बहुघाती (आँकड़ा संरचना) साहचर्य सरणी के समान हो सकती है, जहां एक आँकड़ा मान (या आँकड़ा मानों का संयोजन) को एक या एक से अधिक कार्यों के लिए योजना बद्ध किया जा सकता है।
एक आयामी तालिका
शायद इसके सबसे सरल कार्यान्वयन में, एक नियंत्रण तालिका कभी-कभी असंसाधित्र आँकड़ा मान को संबंधित उपनेमिका अंतर्लब (संगणक विज्ञान), सरणी आँकड़ा संरचना या संकेतक (संगणक क्रमादेशन) में असंसाधित्र आँकड़ा मान का सीधे उपयोग करने के लिए सीधे अनुवाद करने के लिए एक आयामी तालिका हो सकती है। सरणी के सूचकांक के रूप में, या पहले से आँकड़ा पर कुछ बुनियादी अंकगणितीय प्रदर्शन करके। यह निरंतर समय में प्राप्त किया जा सकता है (बिना रैखिक खोज या द्विआधारी खोज के एक साहचर्य सरणी पर एक विशिष्ट लुकअप तालिका का उपयोग करके)। अधिकांश संगणक संरचना में, इसे दो या तीन मशीन निर्देशों में पूरा किया जा सकता है - बिना किसी तुलना या प्रस्पंद के। तकनीक को तुच्छ हैश फलन के रूप में जाना जाता है या, जब विशेष रूप से शाखा तालिकाओं के लिए उपयोग किया जाता है, दोहरा प्रेषण। इसके व्यवहार्य होने के लिए, आँकड़ा के सभी संभावित मानों की सीमा छोटी होनी चाहिए (उदाहरण के लिए एक ASCII या ईबीसीडीआईसी वर्ण मान जिसमें हेक्साडेसिमल '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), मान (जैसे 'A', 'S', 'M' और 'D'), और उपनेमिका पहचान (जैसे 'जोड़ें', 'घटाना,..' या #1, # 2,...). तालिका की संरचना में सामान्यत: सम्मलित (स्वतः निर्धारित) तर्कसंगत संक्रिया सम्मलित होते हैं - जैसे 'समानता के लिए परीक्षण', एक उपनेमिका और 'अगली संक्रिया' करना या स्वतः निर्धारित अनुक्रम का पालन करना (इन्हें क्रमादेश प्रकथन के अंदर स्पष्ट रूप से बताए जाने के अतिरिक्त - आवश्यकतानुसार अन्य क्रमादेशन प्रतिमान में)।
एक बहु-आयामी नियंत्रण तालिका में सामान्य रूप से, न्यूनतम के रूप में, मूल्य / क्रिया जोड़े होते हैं और इसमें अतिरिक्त रूप से निपात और प्रकार तंत्र की जानकारी हो सकती है, जैसे स्थान, आकार और निविष्ट या निर्गत आँकड़ा का प्रारूप, चाहे आँकड़ा रूपांतरण (या अन्य कार्यावधि) (कार्यक्रम जीवनचक्र चरण) | कार्यावधि प्रसंस्करण बारीकियाँ) प्रसंस्करण से पहले या बाद में आवश्यक है (यदि पहले से ही फलन में निहित नहीं है)। तालिका में पंक्ति में अन्य मूल्यों के आधार पर निष्पादित होने वाली सामान्य या अनुकूलित भाषा आदिम या उपनेमिका्स के लिए सरणी अनुक्रमणिका या सापेक्ष या निरपेक्ष सूचक (संगणक क्रमादेशन) सम्मलित हो सकते हैं या नहीं हो सकते हैं।
नीचे दी गई तालिका केवल 'निविष्ट1' पर लागू होती है क्योंकि तालिका में कोई विशिष्ट निविष्ट निर्दिष्ट नहीं किया गया है।
'संरचना द्वारा निहित शर्तें और क्रियाएं'
(implied) IF = (implied) perform value action value action
(मान और क्रिया की इस संपार्श्व जोड़ी में अनुवृत्त-संचालित क्रमादेशन, अर्थात् अनुवृत्त-निर्धारण' और 'अनुवृत्त-प्रहस्तन' में समानताएं हैं, लेकिन बिना (आवश्यक रूप से) अनुवृत्त की अतुल्यकालिक प्रणाली प्रकृति)
नियंत्रण तालिका के अंदर कूटबद्ध किए जा सकने वाले मानों की विविधता काफी हद तक उपयोग की जाने वाली संगणक भाषा पर निर्भर करती है। सभा की भाषा आँकड़ा प्रकारों के लिए सबसे व्यापक गुंजाइश प्रदान करती है, जिसमें (कार्यों के लिए), सीधे निष्पादन योग्य मशीन कूट का विकल्प सम्मलित है। आम तौर पर एक नियंत्रण तालिका में निविष्ट के प्रत्येक संभावित मिलान वर्ग के लिए एक संबंधित सूचक के साथ एक क्रिया उपनेमिका के लिए मान होंगे। कुछ भाषाएँ सूचक (संगणक क्रमादेशन) (सीधे) का समर्थन नहीं करने का दावा करती हैं, लेकिन इसके अतिरिक्त एक ऐरे आँकड़ा संरचना का समर्थन कर सकती हैं, जिसका उपयोग सशर्त निष्पादन करने के लिए 'आपेक्षिक उपनेमिका संख्या' का प्रतिनिधित्व करने के लिए किया जा सकता है, जिसे तालिका प्रविष्टि में मान द्वारा नियंत्रित किया जाता है ( उदाहरण के लिए एक अनुकूलित स्विच प्रकथन, प्रकथन में उपयोग के लिए - शून्य अंतराल (अर्थात एक बहुधा शाखा) के साथ अभिकल्पना किया गया)।
प्रत्येक पंक्ति (या यहां तक कि अंतःस्थापित पाठीय प्रलेखन) के ऊपर स्थित टिप्पणियां एक निर्णय तालिका को 'मानव पठनीय' प्रस्तुत कर सकती हैं, यहां तक कि 'संघनन डाउन' (कूटलेखन के बाद भी इसकी अनिवार्यता (और अभी भी मोटे तौर पर मूल कार्यक्रम विनिर्देश के साथ - विशेष रूप से यदि एक मुद्रित निर्णय तालिका, प्रत्येक अद्वितीय क्रिया की गणना, कोडलेखन आरंभ होने से पहले बनाई जाती है)। तालिका प्रविष्टियों में 'इन-फ्लाइट' या बाद के अनुकूलन के लिए कार्यावधि आँकड़े एकत्र करने के लिए वैकल्पिक रूप से काउंटर भी हो सकते हैं
तालिका स्थान
नियंत्रण तालिका स्थैतिक चर भण्डारण में, सहायक भंडारण पर, जैसे कि एक सरल संचिका या आँकड़ाबेस पर या वैकल्पिक रूप से आंशिक रूप से या पूरी तरह से मापदंडों से क्रमादेश बूटिंग समय पर गतिशील रूप से निर्मित हो सकते हैं (जो स्वयं एक तालिका में रह सकते हैं)। इष्टतम दक्षता के लिए, जब दुभाषिया इसका उपयोग करना आरंभ करता है तो तालिका स्मृतिवासी होनी चाहिए।
दुभाषिया और उपनेमिका्स
दुभाषिया को उच्च स्तरीय भाषा सहित किसी भी उपयुक्त क्रमादेशन भाषा में लिखा जा सकता है। एक उपयुक्त रूप से अभिकल्पित किया गया सामान्य क्रमादेशन दुभाषिया, जेनेरिक उपनेमिका्स के एक अच्छी तरह से चुने गए सेट के साथ (सबसे अधिक होने वाली भाषा आदिम को संसाधित करने में सक्षम), केवल नए कस्टम उपनेमिका्स के लिए अतिरिक्त पारंपरिक कूटलेखन की आवश्यकता होगी (नियंत्रण तालिका को ही निर्दिष्ट करने के अतिरिक्त)। दुभाषिया, वैकल्पिक रूप से, केवल एक पूर्ण एप्लिकेशन क्रमादेश (जैसे मेन प्रस्पंद) के कुछ अच्छी तरह से परिभाषित वर्गों पर लागू हो सकता है और अन्य, 'कम सशर्त', अनुभागों (जैसे क्रमादेश आरंभीकरण, समाप्ति और इसी तरह) पर नहीं।
दुभाषिया को अनावश्यक रूप से जटिल होने की आवश्यकता नहीं है, या एक संकलक लेखक के उन्नत ज्ञान के साथ एक क्रमादेशक द्वारा निर्मित किया जा सकता है, और इसे किसी भी अन्य एप्लिकेशन क्रमादेश के रूप में लिखा जा सकता है - सिवाय इसके कि यह सामान्यत: दक्षता को ध्यान में रखकर बनाया गया है। इसका प्राथमिक कार्य तालिका प्रविष्टियों को निर्देशों के एक सेट के रूप में निष्पादित करना है। नियंत्रण तालिका प्रविष्टियों को पार्स करने की कोई आवश्यकता नहीं है और इसलिए इन्हें, जहां तक संभव हो, 'निष्पादन के लिए तैयार' होने के लिए अभिकल्पित किया जाना चाहिए, जिसके लिए उपयुक्त पंक्ति से अनुदेशांतरक के पहले से ही संकलित जेनेरिक कूट में केवल चरों को जोड़ने की आवश्यकता होती है। . निर्देश (संगणक विज्ञान), सिद्धांत रूप में, असीम रूप से विस्तरणीय हैं और तालिका के अंदर (संभवतः मनमाने) मूल्यों का गठन करते हैं जो केवल दुभाषिया के लिए सार्थक हैं। दुभाषिया का नियंत्रण प्रवाह सामान्य रूप से प्रत्येक तालिका पंक्ति के अनुक्रमिक प्रसंस्करण द्वारा होता है लेकिन तालिका प्रविष्टियों में विशिष्ट क्रियाओं द्वारा संशोधित किया जा सकता है।
इस प्रकार इन स्वैच्छिक मूल्यों को कलन विधि दक्षता को ध्यान में रखते हुए अभिकल्पना किया जा सकता है - उन मानों का चयन करके जिन्हें आँकड़ा या फलन सूचक के लिए प्रत्यक्ष अनुक्रमणिका के रूप में उपयोग किया जा सकता है। विशेष प्लेटफॉर्म/संगणक भाषा के लिए, उन्हें विशेष रूप से शाखा तालिका मानों का उपयोग करके निर्देश पथ की लंबाई को कम करने के लिए अभिकल्पित किया जा सकता है या कुछ स्थितियों में जैसे कि समय-समय पर संकलन अनुभाषक में सीधे निष्पादन योग्य मशीन कूटस्निपेट (क्रमादेशन) (या उनके लिए संकेत)।
उपनेमकाओं को या तो उसी भाषा में कूटबद्ध किया जा सकता है जिसमें दुभाषिया स्वयं या किसी अन्य समर्थित क्रमादेश भाषा में (बशर्ते कि उपयुक्त अंतर-भाषा 'कॉल' संधान तंत्र सम्मलित हो)। अनुदेशांतरक और/या उपनेमिका्स के लिए भाषा का चुनाव सामान्यत: इस बात पर निर्भर करेगा कि इसे विभिन्न प्लेटफार्म (संगणन) में कितना पोर्तालिका होना चाहिए। नियंत्रण तालिका के में सुवाह्यता को बढ़ाने के लिए दुभाषिया के कई संस्करण हो सकते हैं। एक अधीनस्थ नियंत्रण तालिका सूचक वैकल्पिक रूप से 'संक्रिया' पंक्ति में एक उपनेमिका सूचक के लिए स्थानापन्न कर सकता है यदि दुभाषिया इस निर्माण का समर्थन करता है, एक पारंपरिक संरचित क्रमादेशन संरचना की नकल करते हुए एक निचले तार्किक स्तर पर एक सशर्त 'मात्रा' का प्रतिनिधित्व करता है।
प्रदर्शन विचार
पहली नजर में, नियंत्रण तालिकाओं का उपयोग एक कार्यक्रम के संगणनात्मक उपरिव्यय में काफी कुछ जोड़ने के लिए प्रतीत होता है, जिसके लिए 'मूल' क्रमादेशन भाषा के बयानों को निष्पादित करने से पहले एक दुभाषिया प्रक्रिया की आवश्यकता होती है। चूंकि हमेशा ऐसा नहीं होता है। तर्क से निष्पादन योग्य कूटलेखन को अलग (या 'प्रावरण') करके, जैसा कि तालिका में व्यक्त किया गया है, इसे अपने कार्य को सबसे अधिक कुशलता से करने के लिए अधिक आसानी से लक्षित किया जा सकता है। यह एक स्प्रेडशीट एप्लिकेशन में सबसे स्पष्ट रूप से अनुभव किया जा सकता है - जहां अंतर्निहित स्प्रेडशीट सॉफ़्टवेयर अपने परिणामों को प्रदर्शित करने के लिए पारदर्शी रूप से जटिल तार्किक 'सूत्रों' को सबसे कुशल तरीके से परिवर्तित करता है।
नीचे दिए गए उदाहरणों को संभावित प्रदर्शन लाभों को स्पष्ट करने के लिए आंशिक रूप से चुना गया है जो न केवल अमूर्तता के अतिरिक्त स्तर के लिए महत्वपूर्ण रूप से क्षतिपूर्ति कर सकते हैं, बल्कि सुधार भी कर सकते हैं - अन्यथा क्या हो सकता था - कम कुशल, कम रखरखाव योग्य और लंबा कूट। यद्यपि दिए गए उदाहरण एक 'निम्न स्तर' समुच्चय भाषा और c (भाषा) के लिए हैं, यह देखा जा सकता है, दोनों ही स्थितियों में, नियंत्रण तालिका दृष्टिकोण को लागू करने के लिए कूट की बहुत कम पंक्तियों की आवश्यकता होती है और फिर भी बहुत महत्वपूर्ण हासिल कर सकते हैं वाचाल पारंपरिक क्रमादेश भाषा निर्माण की तुलना में निरंतर समय प्रदर्शन में सुधार, दोहराव वाले स्रोत कूटलेखन को कम करना और सहायता स्पष्टता। इस लेख में तालिकाओं और बहुधा शाखा की दक्षता से संबंधित डोनाल्ड नुथ द्वारा नियंत्रण तालिका#अंतरालक भी देखें।
नियंत्रण तालिकाओं के उदाहरण
निम्नलिखित उदाहरण मनमाने हैं (और सादगी के लिए केवल एक निविष्ट पर आधारित हैं), चूंकि लक्षय केवल यह प्रदर्शित करना है कि नियमित क्रमादेश प्रकथन के अतिरिक्त तालिकाओं के उपयोग के माध्यम से नियंत्रण प्रवाह को कैसे प्रभावित किया जा सकता है। यह स्पष्ट होना चाहिए कि इस तकनीक को कई निविष्ट से निपटने के लिए आसानी से विस्तारित किया जा सकता है, या तो पंक्ति की संख्या बढ़ाकर या एकाधिक तालिका प्रविष्टियों (वैकल्पिक और/या निपातके साथ) का उपयोग करके। इसी तरह, (पदानुक्रमित) 'सहलग्न' नियंत्रण तालिकाओं का उपयोग करके, संरचित क्रमादेशन को पूरा किया जा सकता है (वैकल्पिक रूप से अधीनस्थ नियंत्रण तालिकाओं को उजागर करने में मदद करने के लिए आद्यपर्वतनी का उपयोग करना)।
CT1 नियंत्रण तालिका का एक उदाहरण है जो एक साधारण लुकअप तालिका है। पहला पंक्ति परीक्षण किए जाने वाले निविष्ट मान का प्रतिनिधित्व करता है (अंतर्निहित 'IF input1 = x' द्वारा) और, यदि TRUE है, तो संबंधित दूसरा पंक्ति ('कार्रवाई') में सिस्टम कॉल (या के लिए जाओ) द्वारा निष्पादित करने के लिए एक उपनेमिका पता होता है - स्विच प्रकथन प्रकथन के समान)। वास्तव में, यह वापसी के साथ एक बहुधा शाखा है (गतिशील प्रेषण का एक रूप)। अंतिम प्रविष्टि स्वतः निर्धारित मामला है जहां कोई मेल नहीं मिला।
CT1
input 1 pointer A -->Add S -->Subtract M -->Multiply D -->Divide ? -->Default
अन्य आँकड़ा मानों के साथ आँकड़ा संरचनाओं के अंदर सूचक्स का समर्थन करने वाली क्रमादेशन भाषाओं के लिए, उपरोक्त तालिका (CT1) का उपयोग नियंत्रण प्रवाह को तालिका से मिलान मूल्य के अनुसार एक उपयुक्त उपनेमिका के लिए निर्देशित करने के लिए किया जा सकता है (अन्यथा इंगित करने के लिए पंक्ति के बिना, समानता मान ली गई है)।
आईबीएम/360 (अधिकतम 16Mb एड्रेस श्रेणी) या Z/संरचना के लिए समुच्चय भाषा का उदाहरण
इस पहले उदाहरण के लिए कूटलेखन में लुकअप को अनुकूलित करने का कोई प्रयास नहीं किया गया है, और इसके अतिरिक्त यह एक सरल रेखीय खोज तकनीक का उपयोग करता है - विशुद्ध रूप से अवधारणा को स्पष्ट करने और कम स्रोत पंक्तियों को प्रदर्शित करने के लिए। सभी 256 विभिन्न निविष्ट मानों को संभालने के लिए, स्रोत कूट की लगभग 265 पंक्तियों की आवश्यकता होगी (मुख्य रूप से एकल पंक्ति तालिका प्रविष्टियाँ) जबकि कई 'तुलना और शाखा' के लिए सामान्य रूप से लगभग 512 स्रोत पंक्तियों की आवश्यकता होगी (द्विआधारी संचिका का आकार भी लगभग आधा है) , प्रत्येक तालिका प्रविष्टि को 'तत्काल तुलना करें'/शाखा निर्देशों की एक श्रृंखला के लिए लगभग 8 बाइट्स के अतिरिक्त केवल 4 बाइट्स की आवश्यकता होती है (बड़े निविष्ट चर के लिए, बचत और भी अधिक होती है)।
* ------------------ interpreter --------------------------------------------*
LM R14,R0,=A(4,CT1,N) Set R14=4, R15 --> table, and R0 =no. of entries in table (N)
TRY CLC INPUT1,0(R15) ********* Found value in table entry ?
BE ACTION * loop * YES, Load register pointer to sub-routine from table
AR R15,R14 * * NO, Point to next entry in CT1 by adding R14 (=4)
BCT R0,TRY ********* Back until count exhausted, then drop through
. default action ... none of the values in table match, do something else
LA R15,4(R15) point to default entry (beyond table end)
ACTION L R15,0(R15) get pointer into R15,from where R15 points
BALR R14,R15 Perform the sub-routine ("CALL" and return)
B END go terminate this program
* ------------------ control table -----------------------------------------*
* | this column of allowable EBCDIC or ASCII values is tested '=' against variable 'input1'
* | | this column is the 3-byte address of the appropriate subroutine
* v v
CT1 DC C'A',AL3(ADD) START of Control Table (4 byte entry length)
DC C'S',AL3(SUBTRACT)
DC C'M',AL3(MULTIPLY)
DC C'D',AL3(DIVIDE)
N EQU (*-CT1)/4 number of valid entries in table (total length / entry length)
DC C'?',AL3(DEFAULT) default entry – used on drop through to catch all
INPUT1 DS C input variable is in this variable
* ------------------ sub-routines ------------------------------------------*
ADD CSECT sub-routine #1 (shown as separate CSECT here but might
. alternatively be in-line code)
. instruction(s) to add
BR R14 return
SUBTRACT CSECT sub-routine #2
. instruction(s) to subtract
BR R14 return
. etc..
उपरोक्त उदाहरण में दुभाषिया के प्रदर्शन में सुधार
- उपरोक्त उदाहरण में चयन करने के लिए, औसत निर्देश पथ की लंबाई (उपनेमिका कूट को छोड़कर) '4n/2 +3' है, लेकिन इसे आसानी से कम किया जा सकता है, जहां n = 1 से 64, एक रैखिक समय के लिए शून्य तुलना के साथ '5' की पथ लंबाई के साथ, यदि अपरिष्कृत ईबीसीडीआईसी आँकड़ा से CT1 के लिए एक सीधा सूचकांक बनाने के लिए पहली बार 256 बाइट अनुवाद तालिका का उपयोग किया जाता है। जहाँ n = 6, यह तब केवल 3 अनुक्रमिक तुलना और शाखा निर्देशों के बराबर होगा। हालाँकि, जहाँ n <= 64, औसतन इसे कई तुलनाओं का उपयोग करने की तुलना में लगभग 13 गुना कम निर्देशों की आवश्यकता होगी। जहां n = 1 से 256, औसतन यह लगभग 42 गुना कम निर्देशों का उपयोग करेगा - चूंकि, इस मामले में, एक अतिरिक्त निर्देश की आवश्यकता होगी (सूचकांक को 4 से गुणा करने के लिए)।
'बेहतर दुभाषिया' (ऊपर दिए गए उदाहरण की तुलना में औसतन '26 गुना कम निष्पादित निर्देश' तक, जहां n = 1 से 64 और कई तुलनाओं का उपयोग करके 13 गुना कम की आवश्यकता होगी)।
64 विभिन्न निविष्ट मानों को संभालने के लिए, स्रोत कूट(या कम) की लगभग 85 पंक्तियों की आवश्यकता होती है (मुख्य रूप से एकल पंक्ति तालिका प्रविष्टियाँ) जबकि एकाधिक 'तुलना और शाखा' के लिए लगभग 128 पंक्तियों की आवश्यकता होगी (द्विआधारी संचिका का आकार भी लगभग आधा है - दूसरी अनुक्रमणिका निकालने के लिए आवश्यक अतिरिक्त 256 बाइट तालिका के बावजूद)।
* ------------------ interpreter --------------------------------------------*
SR R14,R14 ********* Set R14=0
CALC IC R14,INPUT1 * calc * put EBCDIC byte into lo order bits (24–31) of R14
IC R14,CT1X(R14) * * use EBCDIC value as index on table 'CT1X' to get new index
FOUND L R15,CT1(R14) ********* get pointer to subroutine using index (0,4, 8 etc.)
BALR R14,R15 Perform the sub-routine ("CALL" and return or Default)
B END go terminate this program
* --------------- additional translate table (EBCDIC --> pointer table INDEX) 256 bytes----*
CT1X DC 12AL1(00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00) 12 identical sets of 16 bytes of x'00
* representing 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'
* the assembler can be used to automatically calculate the index values and make the values more user friendly
* (for e.g. '04' could be replaced with the symbolic expression 'PADD-CT1' in table CT1X above)
* modified CT1 (added a default action when index = 00, single dimension, full 31 bit address)
CT1 DC A(DEFAULT) index =00 START of Control Table (4 byte address constants)
PADD DC A(ADD) =04
PSUB DC A(SUBTRACT) =08
PMUL DC A(MULTIPLY) =12
PDIV DC A(DIVIDE) =16
* the rest of the code remains the same as first example
'आगे बेहतर दुभाषिया' (औसत पर पहले उदाहरण की तुलना में '21 गुना कम निष्पादित निर्देश (जहां n> = 64)' और कई तुलनाओं का उपयोग करके 42 गुना कम की आवश्यकता होगी)।
256 विभिन्न निविष्ट मानों को संभालने के लिए, स्रोत कूटया उससे कम की लगभग 280 पंक्तियों की आवश्यकता होगी (मुख्य रूप से एकल पंक्ति तालिका प्रविष्टियाँ), जबकि एकाधिक 'तुलना और शाखा' के लिए लगभग 512 पंक्तियों की आवश्यकता होगी (द्विआधारी संचिका का आकार भी लगभग आधा है)।
* ------------------ interpreter --------------------------------------------*
SR R14,R14 ********* Set R14=0
CALC IC R14,INPUT1 * calc * put EBCDIC byte into lo order bits (24–31) of R14
IC R14,CT1X(R14) * * use EBCDIC value as index on table 'CT1X' to get new index
SLL R14,2 * * multiply index by 4 (additional instruction)
FOUND L R15,CT1(R14) ********* get pointer to subroutine using index (0,4, 8 etc.)
BALR R14,R15 Perform the sub-routine ("CALL" and return or Default)
B END go terminate this program
* --------------- additional translate table (EBCDIC --> pointer table INDEX) 256 bytes----*
CT1X DC 12AL1(00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00) 12 identical sets of 16 bytes of x'00'
* representing 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'
* the assembler can be used to automatically calculate the index values and make the values more user friendly
* (for e.g. '01' could be replaced with the symbolic expression 'PADD-CT1/4' in table CT1X above)
* modified CT1 (index now based on 0,1,2,3,4 not 0,4,8,12,16 to allow all 256 variations)
CT1 DC A(DEFAULT) index =00 START of Control Table (4 byte address constants)
PADD DC A(ADD) =01
PSUB DC A(SUBTRACT) =02
PMUL DC A(MULTIPLY) =03
PDIV DC A(DIVIDE) =04
* the rest of the code remains the same as the 2nd example
'सी (क्रमादेशन भाषा) उदाहरण' सा (क्रमादेशन भाषा) में यह उदाहरण दो तालिकाओं का उपयोग करता है, पहला (CT1) एक सरल रैखिक खोज एक-आयामी लुकअप तालिका है - निविष्ट (x), और दूसरा, संबद्ध तालिका (CT1p) का मिलान करके एक सूचकांक प्राप्त करने के लिए। जाने के लिए लेबल के पतों की एक तालिका है। <वाक्यविन्यास प्रकाश लैंग = सी>
static const char CT1[] = { "A", "S", "M", "D" }; /* permitted input values */
static const void *CT1p[] = { &&Add, &&Subtract, &&Multiply, &&Divide, &&Default}; /* labels to goto & default*/
for (int i = 0; i < sizeof(CT1); i++) /* loop thru ASCII values */
{if (x==CT1[i]) goto *CT1p[i]; } /* found --> appropriate label */
goto *CT1p[i+1]; /* not found --> default label */
</वाक्यविन्यास हाइलाइट> इसे और अधिक कुशल बनाया जा सकता है यदि एक 256 बाइट तालिका का उपयोग कच्चे ASCII मान (x) को सीधे एक सघन अनुक्रमिक सूचकांक मान में अनुवाद करने के लिए किया जाता है, जिसका उपयोग सीधे CT1p से शाखा के पते का पता लगाने के लिए किया जाता है (अर्थात बाइट-वाइड सरणी के साथ सूचकांक मानचित्रण) . इसके बाद यह x के सभी संभावित मानों के लिए निरंतर समय में निष्पादित होगा (यदि CT1 p में सूचक के अतिरिक्त फलन के नाम सम्मलित हैं, तो स्विच-जैसी गोटो को समाप्त करते हुए जंप को गतिक फलन कॉल से बदला जा सकता है - लेकिन अतिरिक्त लागत से प्रदर्शन में कमी फलन प्रबंधन (संगणन))। <वाक्यविन्यास प्रकाश लैंग = सी>
static const void *CT1p[] = {&&Default, &&Add, &&Subtract, &&Multiply, &&Divide};
/* the 256 byte table, below, holds values (1,2,3,4), in corresponding ASCII positions (A,S,M,D), all others set to 0x00 */
static const char 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'};
/* the following code will execute in constant time, irrespective of the value of the input character (x) */
i = CT1x(x); /* extract the correct subroutine index from table CT1x using its ASCII value as an index initially */ goto *CT1p[i]; /* goto (Switch to) the label corresponding to the index (0=default, 1=Add, 2=Subtract,.) - see CT1p */
</वाक्यविन्यास हाइलाइट>
नीचे दिया गया अगला उदाहरण बताता है कि कैसे एक समान प्रभाव उन भाषाओं में प्राप्त किया जा सकता है जो आँकड़ा संरचनाओं में सूचक परिभाषाओं का समर्थन नहीं करती हैं लेकिन एक उपनेमका के लिए अनुक्रमित शाखाओं का समर्थन करती हैं - एक (शून्य-आधारित संख्यािंग|0-आधारित) के अंदर निहित ) उपनेमिका सूचक्स की सरणी। तालिका (CT2) का उपयोग इंडेक्स (दूसरे पंक्ति से) को सूचक पंक्ति (CT2P) में निकालने के लिए किया जाता है। यदि सूचक सरणियों का समर्थन नहीं किया जाता है, तो स्विच प्रकथन या समतुल्य का उपयोग क्रमादेश लेबल्स के अनुक्रम में से एक में नियंत्रण प्रवाह को बदलने के लिए किया जा सकता है (उदाहरण: केस0, केस1, केस2, केस3, केस4) जो या तो सीधे निविष्ट को संसाधित करते हैं, या अन्यथा इससे निपटने के लिए उपयुक्त उपनेमका (स्वतः निर्धारित, जोड़ें, घटाएं, गुणा या विभाजित करें,..) पर कॉल करें (वा