प्रतीक तालिका
This article needs additional citations for verification. (November 2012) (Learn how and when to remove this template message) |
कंप्यूटर विज्ञान में, एक प्रतीक तालिका एक भाषा अनुवादक_ (कंप्यूटिंग) जैसे एक संकलक या दुभाषिया (कंप्यूटिंग) द्वारा उपयोग की जाने वाली डेटा संरचना है, जहां प्रत्येक पहचानकर्ता (कंप्यूटर भाषा) (या प्रतीक_ (प्रोग्रामिंग)), कॉन्स्टेंट_ (कंप्यूटर_प्रोग्रामिंग), विधि_ (कंप्यूटर_प्रोग्रामिंग) और प्रोग्राम के सोर्स कोड में सबरूटीन इसकी घोषणा (कंप्यूटर प्रोग्रामिंग) या स्रोत में उपस्थिति से संबंधित जानकारी से जुड़ा है। दूसरे शब्दों में, एक प्रतीक तालिका की प्रविष्टियाँ प्रविष्टि के संबंधित प्रतीक से संबंधित जानकारी संग्रहीत करती हैं।[1]
पृष्ठभूमि
एक प्रतीक तालिका केवल अनुवाद प्रक्रिया के दौरान स्मृति में मौजूद हो सकती है, या इसे अनुवाद के आउटपुट में एम्बेड किया जा सकता है, जैसे बाद में उपयोग के लिए अनुप्रयोग बाइनरी इंटरफ़ेस वस्तु फ़ाइल में। उदाहरण के लिए, इसका उपयोग इंटरएक्टिव डिबगर के दौरान या किसी प्रोग्राम के निष्पादन (कंप्यूटर) के दौरान या उसके बाद डायग्नोस्टिक रिपोर्ट को प्रारूपित करने के लिए एक संसाधन के रूप में किया जा सकता है।[2]
विवरण
एक अनुवादक और मध्यवर्ती प्रतिनिधित्व (आईआर) द्वारा उपयोग की जाने वाली प्रतीक तालिका में निहित न्यूनतम जानकारी में प्रतीक का नाम और उसका स्थान या पता शामिल है। रीलोकेटेबिलिटी की अवधारणा के साथ एक प्लेटफॉर्म को लक्षित करने वाले कंपाइलर के लिए, इसमें रीलोकैटेबिलिटी एट्रिब्यूट्स (पूर्ण, स्थानांतरित करने योग्य, आदि) और रिलोकेटेबल प्रतीकों के लिए आवश्यक स्थानांतरण जानकारी भी शामिल होगी। उच्च-स्तरीय प्रोग्रामिंग भाषाओं के लिए प्रतीक सारणी प्रतीक के प्रकार को संग्रहीत कर सकती हैं: स्ट्रिंग, पूर्णांक, फ़्लोटिंग-पॉइंट इत्यादि, इसका आकार, और इसके आयाम और इसकी सीमाएं। यह सारी जानकारी आउटपुट फ़ाइल में शामिल नहीं है, लेकिन डिबगिंग में उपयोग के लिए प्रदान की जा सकती है। कई मामलों में, प्रतीक की प्रति-संदर्भ जानकारी प्रतीक तालिका के साथ संग्रहीत या उससे जुड़ी होती है। अधिकांश कंपाइलर इस जानकारी के कुछ या सभी को अनुवाद के अंत में प्रतीक तालिका और प्रति संदर्भ लिस्टिंग में प्रिंट करते हैं।[1]
कार्यान्वयन
तालिकाओं को लागू करने के लिए कई डेटा संरचनाएँ उपलब्ध हैं। सिंबल टेबल को लागू करने के लिए ट्री, लीनियर लिस्ट और स्व-आयोजन सूची का इस्तेमाल किया जा सकता है। एक कंपाइलर के अधिकांश चरणों में प्रतीक तालिका का उपयोग किया जाता है, लेक्सिकल विश्लेषण से शुरू होता है, और अनुकूलन के माध्यम से जारी रहता है।
एक कंपाइलर सभी प्रतीकों के लिए एक बड़ी प्रतीक तालिका का उपयोग कर सकता है या अलग-अलग कार्यक्षेत्र (प्रोग्रामिंग) के लिए अलग-अलग, श्रेणीबद्ध प्रतीक तालिकाओं का उपयोग कर सकता है। उदाहरण के लिए, ALGOL या PL/I जैसी एक दायरे वाली भाषा में एक प्रतीक p को अलग-अलग प्रक्रियाओं में अलग-अलग घोषित किया जा सकता है, शायद अलग-अलग विशेषताओं के साथ। प्रत्येक घोषणा का दायरा कार्यक्रम का वह भाग है जिसमें p के संदर्भ उस घोषणा को हल करते हैं। प्रत्येक घोषणा एक विशिष्ट पहचानकर्ता p का प्रतिनिधित्व करती है। प्रतीक तालिका में भिन्न p s के संदर्भों को विभेदित करने के कुछ साधन होने चाहिए।
प्रतीक तालिकाओं को लागू करने के लिए उपयोग की जाने वाली एक सामान्य डेटा संरचना हैश तालिका है। हैश तालिका में खोज का समय तालिका में संग्रहीत तत्वों की संख्या से स्वतंत्र है, इसलिए यह बड़ी संख्या में तत्वों के लिए कुशल है। यह हैश कुंजी की गणना में वर्गीकरण को शामिल करके सारणीबद्ध प्रारूप में शाब्दिक वर्गीकरण को भी सरल करता है।[3] जैसा कि लेक्सिकल एनालाइजर अपने समय का एक बड़ा हिस्सा सिंबल टेबल को देखने में खर्च करता है, इस गतिविधि का कंपाइलर की समग्र गति पर महत्वपूर्ण प्रभाव पड़ता है। एक प्रतीक तालिका को इस तरह व्यवस्थित किया जाना चाहिए कि प्रविष्टियों को जितनी जल्दी हो सके पाया जा सके। हैश टेबल का उपयोग आमतौर पर एक प्रतीक तालिका को व्यवस्थित करने के लिए किया जाता है, जहां सरणी सबस्क्रिप्ट बनाने के लिए कीवर्ड या पहचानकर्ता 'हैश' होता है। हैश टकराव एक हैश तालिका में अपरिहार्य हैं, और उन्हें संभालने का एक सामान्य तरीका तालिका में अगले उपलब्ध खाली स्थान में समानार्थी को स्टोर करना है।
अनुप्रयोग
एक ऑब्जेक्ट फ़ाइल में उन पहचानकर्ताओं की एक प्रतीक तालिका होगी जो इसमें शामिल हैं जो बाहरी रूप से दिखाई दे रहे हैं। विभिन्न ऑब्जेक्ट फ़ाइलों को जोड़ने के दौरान, एक लिंकर (कंप्यूटिंग) इन प्रतीक संदर्भों की पहचान करेगा और उनका समाधान करेगा। आमतौर पर सभी अपरिभाषित बाहरी प्रतीकों को एक या अधिक पुस्तकालय (कम्प्यूटिंग) में खोजा जाएगा। यदि कोई मॉड्यूल पाया जाता है जो उस प्रतीक को परिभाषित करता है तो यह पहली ऑब्जेक्ट फ़ाइल के साथ जुड़ा हुआ है, और किसी भी अपरिभाषित बाहरी पहचानकर्ता को पहचानकर्ताओं की सूची में जोड़ा जाता है। यह प्रक्रिया तब तक जारी रहती है जब तक कि सभी बाहरी संदर्भ हल नहीं हो जाते। यदि प्रक्रिया के अंत में एक या अधिक अनसुलझे रहते हैं तो यह एक त्रुटि है।
जबकि रिवर्स इंजीनियरिंग एक निष्पादन योग्य है, कई उपकरण वैश्विक चर और ज्ञात कार्यों के लिए कौन से पते निर्दिष्ट किए गए हैं, यह जांचने के लिए प्रतीक तालिका का संदर्भ लेते हैं। यदि सिंबल टेबल को पट्टी (यूनिक्स) कर दिया गया है या निष्पादन योग्य में परिवर्तित होने से पहले साफ कर दिया गया है, तो टूल को पते निर्धारित करने या प्रोग्राम के बारे में कुछ भी समझने में कठिनाई होगी।
उदाहरण
C (प्रोग्रामिंग लैंग्वेज) में लिखे गए निम्नलिखित प्रोग्राम पर विचार करें: <वाक्यविन्यास लैंग = सी> // एक बाहरी कार्य की घोषणा करें बाहरी डबल बार (डबल एक्स);
// एक सार्वजनिक कार्य को परिभाषित करें डबल फू (इंट काउंट) {
दोहरा योग = 0.0;
// सभी मान बार (1) से बार (गिनती) का योग करें के लिए (int i = 1; i <= गिनती; i++) योग + = बार ((डबल) i); वापसी राशि;
} </वाक्यविन्यास हाइलाइट>
एसी कंपाइलर जो इस कोड को पार्स करता है उसमें कम से कम निम्न प्रतीक तालिका प्रविष्टियां होंगी:
Symbol name | Type | Scope |
---|---|---|
bar |
function, double | extern |
x |
double | function parameter |
foo |
function, double | global |
count |
int | function parameter |
sum |
double | block local |
i |
int | for-loop statement |
इसके अलावा, प्रतीक तालिका में मध्यवर्ती अभिव्यक्ति मूल्यों के लिए संकलक द्वारा उत्पन्न प्रविष्टियाँ भी हो सकती हैं (उदाहरण के लिए, वह अभिव्यक्ति जो i
लूप वेरिएबल में a double
, और कार्य करने के लिए कॉल का वापसी मान bar()
), कथन लेबल, इत्यादि।
उदाहरण: SysV ABI
Address | Type | Name |
---|---|---|
00000020 | a | T_BIT |
00000040 | a | F_BIT |
00000080 | a | I_BIT |
20000004 | t | irqvec |
20000008 | t | fiqvec |
2000000c | t | InitReset |
20000018 | T | _main |
20000024 | t | End |
20000030 | T | AT91F_US3_CfgPIO_useB |
2000005c | t | AT91F_PIO_CfgPeriph |
200000b0 | T | main |
20000120 | T | AT91F_DBGU_Printk |
20000190 | t | AT91F_US_TxReady |
200001c0 | t | AT91F_US_PutChar |
200001f8 | T | AT91F_SpuriousHandler |
20000214 | T | AT91F_DataAbort |
20000230 | T | AT91F_FetchAbort |
2000024c | T | AT91F_Undef |
20000268 | T | AT91F_UndefHandler |
20000284 | T | AT91F_LowLevelInit |
200002e0 | t | AT91F_DBGU_CfgPIO |
2000030c | t | AT91F_PIO_CfgPeriph |
20000360 | t | AT91F_US_Configure |
200003dc | t | AT91F_US_SetBaudrate |
2000041c | t | AT91F_US_Baudrate |
200004ec | t | AT91F_US_SetTimeguard |
2000051c | t | AT91F_PDC_Open |
2000059c | t | AT91F_PDC_DisableRx |
200005c8 | t | AT91F_PDC_DisableTx |
200005f4 | t | AT91F_PDC_SetNextTx |
20000638 | t | AT91F_PDC_SetNextRx |
2000067c | t | AT91F_PDC_SetTx |
200006c0 | t | AT91F_PDC_SetRx |
20000704 | t | AT91F_PDC_EnableRx |
20000730 | t | AT91F_PDC_EnableTx |
2000075c | t | AT91F_US_EnableTx |
20000788 | T | __aeabi_uidiv |
20000788 | T | __udivsi3 |
20000884 | T | __aeabi_uidivmod |
2000089c | T | __aeabi_idiv0 |
2000089c | T | __aeabi_ldiv0 |
2000089c | T | __div0 |
200009a0 | D | _data |
200009a0 | A | _etext |
200009a4 | A | __bss_end__ |
200009a4 | A | __bss_start |
200009a4 | A | __bss_start__ |
200009a4 | A | _edata |
200009a4 | A | _end |
SysV एप्लिकेशन बाइनरी इंटरफ़ेस (ABI) विनिर्देश में प्रतीक तालिका का एक उदाहरण पाया जा सकता है, जो यह अनिवार्य करता है कि प्रतीक (प्रोग्रामिंग) को बाइनरी फ़ाइल में कैसे रखा जाए, ताकि विभिन्न कंपाइलर, लिंकर और लोडर सभी लगातार खोज सकें और संकलित वस्तु में प्रतीकों के साथ काम करें।
SysV ABI को GNU बाइनरी यूटिलिटीज|GNU बिनुटिल्स एनएम (यूनिक्स) यूटिलिटी में लागू किया गया है। यह प्रारूप एक क्रमबद्ध स्मृति पता फ़ील्ड, एक प्रतीक प्रकार फ़ील्ड और एक प्रतीक पहचानकर्ता (जिसे नाम कहा जाता है) का उपयोग करता है।[4] SysV ABI (और nm के आउटपुट) में प्रतीक प्रकार प्रतीक तालिका में प्रत्येक प्रविष्टि की प्रकृति को इंगित करते हैं। प्रत्येक प्रतीक प्रकार को एक वर्ण द्वारा दर्शाया जाता है। उदाहरण के लिए, आरंभिक डेटा का प्रतिनिधित्व करने वाली प्रतीक तालिका प्रविष्टियाँ वर्ण d द्वारा निरूपित की जाती हैं और फ़ंक्शंस के लिए प्रतीक तालिका प्रविष्टियों में प्रतीक प्रकार t होता है (क्योंकि निष्पादन योग्य कोड किसी ऑब्जेक्ट फ़ाइल के पाठ अनुभाग में स्थित होता है)। इसके अतिरिक्त, प्रतीक प्रकार का कैपिटलाइज़ेशन लिंकेज के प्रकार को इंगित करता है: लोअर-केस अक्षरों से संकेत मिलता है कि प्रतीक स्थानीय है और अपर-केस बाहरी (वैश्विक) लिंकेज को इंगित करता है।
उदाहरण: पायथन प्रतीक तालिका
पायथन (प्रोग्रामिंग लैंग्वेज) प्रोग्रामिंग लैंग्वेज में सिंबल टेबल बनाने और मैनिपुलेट करने के लिए व्यापक समर्थन शामिल है।[5] जिन गुणों की पूछताछ की जा सकती है उनमें शामिल है कि क्या दिया गया प्रतीक एक मुक्त चर या बाध्य चर है, चाहे वह ब्लॉक गुंजाइश या वैश्विक कार्यक्षेत्र है, चाहे वह आयात किया गया हो, और यह किस नामस्थान से संबंधित है।
उदाहरण: गतिशील प्रतीक सारणी
कुछ प्रोग्रामिंग लैंग्वेज सिंबल टेबल को रन-टाइम में मैनिपुलेट करने की अनुमति देती हैं, ताकि सिंबल को किसी भी समय जोड़ा जा सके। रैकेट (प्रोग्रामिंग भाषा) ऐसी भाषा का एक उदाहरण है।[6] एलआईएसपी और स्कीम (प्रोग्रामिंग लैंग्वेज) प्रोग्रामिंग लैंग्वेज दोनों ही प्रत्येक प्रतीक के साथ मनमाने, सामान्य गुणों को जोड़ने की अनुमति देती हैं।[7] प्रोलॉग प्रोग्रामिंग भाषा अनिवार्य रूप से एक प्रतीक-तालिका हेरफेर भाषा है; प्रतीकों को परमाणु कहा जाता है, और प्रतीकों के बीच संबंधों पर तर्क दिया जा सकता है। इसी तरह, OpenCog एक गतिशील प्रतीक तालिका प्रदान करता है, जिसे एटमस्पेस कहा जाता है, जिसका उपयोग ज्ञान प्रतिनिधित्व के लिए किया जाता है।
यह भी देखें
संदर्भ
- ↑ 1.0 1.1 Copper & Torczon 2011, p. 253.
- ↑ Nguyen, Binh (2004). Linux Dictionary. p. 1482. Retrieved Apr 14, 2018.
- ↑ Copper & Torczon 2011, p. 254.
- ↑ "nm". sourceware.org. Retrieved May 30, 2020.
- ↑ symtable — Python documentation
- ↑ Symbols - Racket Documentation
- ↑ Symbols - Guile Documentation
ग्रन्थसूची
- Copper, Keith D.; Torczon, Linda (18 January 2011). Engineering a Compiler (2 ed.). Houston, Texas: Elsevier, Rice University. doi:10.1016/C2009-0-27982-7. ISBN 978-0-12-088478-0. S2CID 40425497.