प्रतीक तालिका: Difference between revisions

From Vigyanwiki
(Created page with "{{short description|Data structure used by a language translator such as a compiler or Interpreter}} {{redirect|Symbol (computing)|the data type|Symbol (programming)}} {{More...")
 
No edit summary
Line 1: Line 1:
{{short description|Data structure used by a language translator such as a compiler or Interpreter}}
{{short description|Data structure used by a language translator such as a compiler or Interpreter}}
{{redirect|Symbol (computing)|the data type|Symbol (programming)}}
{{redirect|प्रतीक (कंप्यूटिंग)|डेटा प्रकार|प्रतीक (प्रोग्रामिंग)}}
{{More citations needed|date=November 2012}}
{{More citations needed|date=November 2012}}
[[कंप्यूटर विज्ञान]] में, एक प्रतीक तालिका एक भाषा अनुवादक_ (कंप्यूटिंग) जैसे एक [[संकलक]] या [[दुभाषिया (कंप्यूटिंग)]] द्वारा उपयोग की जाने वाली [[डेटा संरचना]] है, जहां प्रत्येक पहचानकर्ता (कंप्यूटर भाषा) (या प्रतीक_ (प्रोग्रामिंग)), कॉन्स्टेंट_ (कंप्यूटर_प्रोग्रामिंग), विधि_ (कंप्यूटर_प्रोग्रामिंग) और प्रोग्राम के [[सोर्स कोड]] में [[सबरूटीन]] इसकी [[घोषणा (कंप्यूटर प्रोग्रामिंग)]] या स्रोत में उपस्थिति से संबंधित जानकारी से जुड़ा है। दूसरे शब्दों में, एक प्रतीक तालिका की प्रविष्टियाँ प्रविष्टि के संबंधित प्रतीक से संबंधित जानकारी संग्रहीत करती हैं।{{sfn|Copper|Torczon|2011|p=253}}
[[कंप्यूटर विज्ञान]] में, एक प्रतीक तालिका एक भाषा [[अनुवादक (कम्प्यूटिंग)|अनुवादक]] द्वारा उपयोग की जाने वाली डेटा संरचना है जैसे कि एक [[संकलक]] या दुभाषिया, जहां प्रत्येक पहचानकर्ता (या प्रतीक), [[स्थिरांक]], प्रक्रिया और कार्यक्रम के [[स्रोत कोड]] में कार्य इसकी घोषणा से संबंधित जानकारी से जुड़ा होता है या स्रोत में उपस्थिति। दूसरे शब्दों में, एक प्रतीक तालिका की प्रविष्टियाँ प्रविष्टि के संबंधित प्रतीक से संबंधित जानकारी को संग्रहीत करती हैं। [1]




== पृष्ठभूमि ==
== पृष्ठभूमि ==
एक प्रतीक तालिका केवल अनुवाद प्रक्रिया के दौरान स्मृति में मौजूद हो सकती है, या इसे अनुवाद के आउटपुट में एम्बेड किया जा सकता है, जैसे बाद में उपयोग के लिए [[अनुप्रयोग बाइनरी इंटरफ़ेस]] [[वस्तु फ़ाइल]] में। उदाहरण के लिए, इसका उपयोग इंटरएक्टिव [[डिबगर]] के दौरान या किसी प्रोग्राम के [[निष्पादन (कंप्यूटर)]] के दौरान या उसके बाद डायग्नोस्टिक रिपोर्ट को प्रारूपित करने के लिए एक संसाधन के रूप में किया जा सकता है।<ref>{{cite book|last1=Nguyen|first1=Binh|title=Linux Dictionary|date=2004|page=1482|url=https://books.google.com/books?id=vdZWBQAAQBAJ|accessdate=Apr 14, 2018}}</ref>
एक प्रतीक तालिका केवल अनुवाद प्रक्रिया के दौरान स्मृति में उपस्थित हो सकती है, या इसे अनुवाद के आउटपुट में सन्निहित किया जा सकता है, जैसे बाद में उपयोग के लिए [[अनुप्रयोग बाइनरी इंटरफ़ेस|अनुप्रयोग बाइनरी अंतरपृष्‍ठ]] [[वस्तु फ़ाइल]] में। उदाहरण के लिए, इसका उपयोग पारस्परिक  [[डिबगर]] के दौरान या किसी प्रोग्राम के [[निष्पादन (कंप्यूटर)|निष्पादन(कंप्यूटर)]] के दौरान या उसके बाद निदानकारी रिपोर्ट को प्रारूपित करने के लिए एक संसाधन के रूप में किया जा सकता है।<ref>{{cite book|last1=Nguyen|first1=Binh|title=Linux Dictionary|date=2004|page=1482|url=https://books.google.com/books?id=vdZWBQAAQBAJ|accessdate=Apr 14, 2018}}</ref>




== विवरण ==
== विवरण ==
एक अनुवादक और [[मध्यवर्ती प्रतिनिधित्व]] (आईआर) द्वारा उपयोग की जाने वाली प्रतीक तालिका में निहित न्यूनतम जानकारी में प्रतीक का नाम और उसका स्थान या पता शामिल है। रीलोकेटेबिलिटी की अवधारणा के साथ एक प्लेटफॉर्म को लक्षित करने वाले कंपाइलर के लिए, इसमें रीलोकैटेबिलिटी एट्रिब्यूट्स (पूर्ण, स्थानांतरित करने योग्य, आदि) और रिलोकेटेबल प्रतीकों के लिए आवश्यक स्थानांतरण जानकारी भी शामिल होगी। उच्च-स्तरीय प्रोग्रामिंग भाषाओं के लिए प्रतीक सारणी प्रतीक के प्रकार को संग्रहीत कर सकती हैं: स्ट्रिंग, पूर्णांक, फ़्लोटिंग-पॉइंट इत्यादि, इसका आकार, और इसके आयाम और इसकी सीमाएं। यह सारी जानकारी आउटपुट फ़ाइल में शामिल नहीं है, लेकिन [[डिबगिंग]] में उपयोग के लिए प्रदान की जा सकती है। कई मामलों में, प्रतीक की प्रति-संदर्भ जानकारी प्रतीक तालिका के साथ संग्रहीत या उससे जुड़ी होती है। अधिकांश कंपाइलर इस जानकारी के कुछ या सभी को अनुवाद के अंत में प्रतीक तालिका और [[प्रति संदर्भ]] लिस्टिंग में प्रिंट करते हैं।{{sfn|Copper|Torczon|2011|p=253}}
एक अनुवादक और [[मध्यवर्ती प्रतिनिधित्व]] (आईआर) द्वारा उपयोग की जाने वाली प्रतीक तालिका में निहित न्यूनतम जानकारी में प्रतीक का नाम और उसका स्थान या पता सम्मिलित है। रीलोकेटेबिलिटी की अवधारणा के साथ एक प्लेटफॉर्म को लक्षित करने वाले अनुभाषक के लिए, इसमें रीलोकैटेबिलिटी विशेषता (पूर्ण, स्थानांतरित करने योग्य, आदि) और रिलोकेटेबल प्रतीकों के लिए आवश्यक स्थानांतरण जानकारी भी सम्मिलित होगी। उच्च-स्तरीय प्रोग्रामिंग भाषाओं के लिए प्रतीक सारणी प्रतीक के प्रकार को संग्रहीत कर सकती हैं: स्ट्रिंग, पूर्णांक, फ़्लोटिंग-पॉइंट इत्यादि, इसका आकार, और इसके आयाम और इसकी सीमाएं। यह सारी जानकारी आउटपुट फ़ाइल में सम्मिलित नहीं है, लेकिन [[डिबगिंग]] में उपयोग के लिए प्रदान की जा सकती है। कई मामलों में, प्रतीक की प्रति-संदर्भ जानकारी प्रतीक तालिका के साथ संग्रहीत या उससे जुड़ी होती है। अधिकांश अनुभाषक इस जानकारी के कुछ या सभी को अनुवाद के अंत में प्रतीक तालिका और [[प्रति संदर्भ]] लिस्टिंग में प्रिंट करते हैं।{{sfn|Copper|Torczon|2011|p=253}}




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


एक कंपाइलर सभी प्रतीकों के लिए एक बड़ी प्रतीक तालिका का उपयोग कर सकता है या अलग-अलग [[कार्यक्षेत्र (प्रोग्रामिंग)]] के लिए अलग-अलग, श्रेणीबद्ध प्रतीक तालिकाओं का उपयोग कर सकता है। उदाहरण के लिए, [[ALGOL]] या PL/I जैसी एक दायरे वाली भाषा में एक प्रतीक p को अलग-अलग प्रक्रियाओं में अलग-अलग घोषित किया जा सकता है, शायद अलग-अलग विशेषताओं के साथ। प्रत्येक घोषणा का दायरा कार्यक्रम का वह भाग है जिसमें p के संदर्भ उस घोषणा को हल करते हैं। प्रत्येक घोषणा एक विशिष्ट पहचानकर्ता p का प्रतिनिधित्व करती है। प्रतीक तालिका में भिन्न p s के संदर्भों को विभेदित करने के कुछ साधन होने चाहिए।
एक अनुभाषक सभी प्रतीकों के लिए एक बड़ी प्रतीक तालिका का उपयोग कर सकता है या अलग-अलग [[कार्यक्षेत्र (प्रोग्रामिंग)|कार्यक्षेत्र(प्रोग्रामिंग)]] के लिए अलग-अलग, श्रेणीबद्ध प्रतीक तालिकाओं का उपयोग कर सकता है। उदाहरण के लिए, [[ALGOL|अल्गोल]] या पीएल/आई जैसी एक दायरे वाली भाषा में एक प्रतीक p को अलग-अलग प्रक्रियाओं में अलग-अलग घोषित किया जा सकता है, शायद अलग-अलग विशेषताओं के साथ। प्रत्येक घोषणा का दायरा कार्यक्रम का वह भाग है जिसमें p के संदर्भ उस घोषणा को हल करते हैं। प्रत्येक घोषणा एक विशिष्ट पहचानकर्ता p का प्रतिनिधित्व करती है। प्रतीक तालिका में भिन्न p s के संदर्भों को विभेदित करने के कुछ साधन होने चाहिए।


प्रतीक तालिकाओं को लागू करने के लिए उपयोग की जाने वाली एक सामान्य डेटा संरचना [[हैश तालिका]] है। हैश तालिका में खोज का समय तालिका में संग्रहीत तत्वों की संख्या से स्वतंत्र है, इसलिए यह बड़ी संख्या में तत्वों के लिए कुशल है। यह हैश कुंजी की गणना में वर्गीकरण को शामिल करके सारणीबद्ध प्रारूप में शाब्दिक वर्गीकरण को भी सरल करता है।{{sfn|Copper|Torczon|2011|p=254}}
प्रतीक तालिकाओं को लागू करने के लिए उपयोग की जाने वाली एक सामान्य डेटा संरचना [[हैश तालिका]] है। हैश तालिका में खोज का समय तालिका में संग्रहीत तत्वों की संख्या से स्वतंत्र है, इसलिए यह बड़ी संख्या में तत्वों के लिए कुशल है। यह हैश कुंजी की गणना में वर्गीकरण को सम्मिलित करके सारणीबद्ध प्रारूप में शाब्दिक वर्गीकरण को भी सरल करता है।{{sfn|Copper|Torczon|2011|p=254}}
जैसा कि लेक्सिकल एनालाइजर अपने समय का एक बड़ा हिस्सा सिंबल टेबल को देखने में खर्च करता है, इस गतिविधि का कंपाइलर की समग्र गति पर महत्वपूर्ण प्रभाव पड़ता है। एक प्रतीक तालिका को इस तरह व्यवस्थित किया जाना चाहिए कि प्रविष्टियों को जितनी जल्दी हो सके पाया जा सके। हैश टेबल का उपयोग आमतौर पर एक प्रतीक तालिका को व्यवस्थित करने के लिए किया जाता है, जहां सरणी सबस्क्रिप्ट बनाने के लिए कीवर्ड या पहचानकर्ता 'हैश' होता है। हैश टकराव एक हैश तालिका में अपरिहार्य हैं, और उन्हें संभालने का एक सामान्य तरीका तालिका में अगले उपलब्ध खाली स्थान में समानार्थी को स्टोर करना है।
 
जैसा कि लेक्सिकल एनालाइजर अपने समय का एक बड़ा हिस्सा प्रतीक तालिका को देखने में खर्च करता है, इस गतिविधि का अनुभाषक की समग्र गति पर महत्वपूर्ण प्रभाव पड़ता है। एक प्रतीक तालिका को इस तरह व्यवस्थित किया जाना चाहिए कि प्रविष्टियों को जितनी जल्दी हो सके पाया जा सके। हैश तालिका का उपयोग आमतौर पर एक प्रतीक तालिका को व्यवस्थित करने के लिए किया जाता है, जहां सरणी सबस्क्रिप्ट बनाने के लिए कीवर्ड या पहचानकर्ता 'हैश' होता है। हैश टकराव एक हैश तालिका में अपरिहार्य हैं, और उन्हें संभालने का एक सामान्य तरीका तालिका में अगले उपलब्ध खाली स्थान में समानार्थी को स्टोर करना है।


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


जबकि [[रिवर्स इंजीनियरिंग]] एक निष्पादन योग्य है, कई उपकरण वैश्विक चर और ज्ञात कार्यों के लिए कौन से पते निर्दिष्ट किए गए हैं, यह जांचने के लिए प्रतीक तालिका का संदर्भ लेते हैं। यदि सिंबल टेबल को [[पट्टी (यूनिक्स)]] कर दिया गया है या निष्पादन योग्य में परिवर्तित होने से पहले साफ कर दिया गया है, तो टूल को पते निर्धारित करने या प्रोग्राम के बारे में कुछ भी समझने में कठिनाई होगी।
जबकि [[रिवर्स इंजीनियरिंग]] एक निष्पादन योग्य है, कई उपकरण वैश्विक चर और ज्ञात कार्यों के लिए कौन से पते निर्दिष्ट किए गए हैं, यह जांचने के लिए प्रतीक तालिका का संदर्भ लेते हैं। यदि प्रतीक तालिका को [[पट्टी (यूनिक्स)|पट्टी(यूनिक्स)]] कर दिया गया है या निष्पादन योग्य में परिवर्तित होने से पहले साफ कर दिया गया है, तो टूल को पते निर्धारित करने या प्रोग्राम के बारे में कुछ भी समझने में कठिनाई होगी।


== उदाहरण ==
== उदाहरण ==


C (प्रोग्रामिंग लैंग्वेज) में लिखे गए निम्नलिखित प्रोग्राम पर विचार करें:
C (प्रोग्रामिंग भाषा ) में लिखे गए निम्नलिखित प्रोग्राम पर विचार करें:
 
<वाक्यविन्यास लैंग = सी>
<वाक्यविन्यास लैंग = सी>
// एक बाहरी कार्य की घोषणा करें
// एक बाहरी कार्य की घोषणा करें
बाहरी डबल बार (डबल एक्स);
बाहरी डबल बार (डबल एक्स);


// एक सार्वजनिक कार्य को परिभाषित करें
// एक सार्वजनिक कार्य को परिभाषित करें
डबल फू (इंट काउंट)
डबल फू (इंट काउंट)
{
{
     दोहरा योग = 0.0;
     दोहरा योग = 0.0;
Line 43: Line 49:
     वापसी राशि;
     वापसी राशि;
}
}
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


एसी कंपाइलर जो इस कोड को पार्स करता है उसमें कम से कम निम्न प्रतीक तालिका प्रविष्टियां होंगी:
एसी अनुभाषक जो इस कोड को पार्स करता है उसमें कम से कम निम्न प्रतीक तालिका प्रविष्टियां होंगी:
{| class="wikitable"
{| class="wikitable"
|- style="background:silver"
|- style="background:silver"
Line 65: Line 72:
|-
|-
|}
|}
इसके अलावा, प्रतीक तालिका में मध्यवर्ती अभिव्यक्ति मूल्यों के लिए संकलक द्वारा उत्पन्न प्रविष्टियाँ भी हो सकती हैं (उदाहरण के लिए, वह अभिव्यक्ति जो <code>i</code> लूप वेरिएबल में a <code>double</code>, और कार्य करने के लिए कॉल का वापसी मान <code>bar()</code>), कथन लेबल, इत्यादि।
इसके अतिरिक्त , प्रतीक तालिका में मध्यवर्ती अभिव्यक्ति मूल्यों के लिए संकलक द्वारा उत्पन्न प्रविष्टियाँ भी हो सकती हैं (उदाहरण के लिए, वह अभिव्यक्ति जो <code>i</code> लूप वेरिएबल में a <code>double</code>, और कार्य करने के लिए कॉल का वापसी मान <code>bar()</code>), कथन लेबल, इत्यादि।


== उदाहरण: SysV ABI ==
== उदाहरण:एसआईएसवी एबीआई ==


{| class="wikitable floatright"
{| class="wikitable floatright"
|+Example table: SysV ABI
|+Example table: SysV एबीआई
|-  
|-  
! Address !! Type !! Name
! Address !! Type !! Name
Line 172: Line 179:
|200009a4 || style="text-align:center;" | A || _end
|200009a4 || style="text-align:center;" | A || _end
|}
|}
[[SysV]] [[एप्लिकेशन बाइनरी इंटरफ़ेस]] (ABI) विनिर्देश में प्रतीक तालिका का एक उदाहरण पाया जा सकता है, जो यह अनिवार्य करता है कि [[प्रतीक (प्रोग्रामिंग)]] को बाइनरी फ़ाइल में कैसे रखा जाए, ताकि विभिन्न कंपाइलर, लिंकर और लोडर सभी लगातार खोज सकें और संकलित वस्तु में प्रतीकों के साथ काम करें।
[[SysV|एसआईएसवी]] [[एप्लिकेशन बाइनरी इंटरफ़ेस|एप्लिकेशन बाइनरी अंतरपृष्‍ठ]] (एबीआई) विनिर्देश में प्रतीक तालिका का एक उदाहरण पाया जा सकता है, जो यह अनिवार्य करता है कि [[प्रतीक (प्रोग्रामिंग)]] को बाइनरी फ़ाइल में कैसे रखा जाए, ताकि विभिन्न अनुवादक, लिंकर और लोडर सभी लगातार खोज सकें और संकलित वस्तु में प्रतीकों के साथ काम करें।


SysV ABI को GNU बाइनरी यूटिलिटीज|GNU बिनुटिल्स [[एनएम (यूनिक्स)]] यूटिलिटी में लागू किया गया है। यह प्रारूप एक क्रमबद्ध [[स्मृति पता]] फ़ील्ड, एक प्रतीक प्रकार फ़ील्ड और एक प्रतीक पहचानकर्ता (जिसे नाम कहा जाता है) का उपयोग करता है।<ref>{{cite web |title=nm |url=http://sourceware.org/binutils/docs-2.17/binutils/nm.html#nm|website=sourceware.org |accessdate=May 30, 2020}}</ref>
SysV एबीआई को जीएनयू बाइनरी यूटिलिटीज|जीएनयू बिनुटिल्स [[एनएम (यूनिक्स)]] यूटिलिटी में लागू किया गया है। यह प्रारूप एक क्रमबद्ध [[स्मृति पता]] फ़ील्ड, एक प्रतीक प्रकार फ़ील्ड और एक प्रतीक पहचानकर्ता (जिसे नाम कहा जाता है) का उपयोग करता है।<ref>{{cite web |title=nm |url=http://sourceware.org/binutils/docs-2.17/binutils/nm.html#nm|website=sourceware.org |accessdate=May 30, 2020}}</ref>
SysV ABI (और nm के आउटपुट) में प्रतीक प्रकार प्रतीक तालिका में प्रत्येक प्रविष्टि की प्रकृति को इंगित करते हैं। प्रत्येक प्रतीक प्रकार को एक वर्ण द्वारा दर्शाया जाता है। उदाहरण के लिए, आरंभिक डेटा का प्रतिनिधित्व करने वाली प्रतीक तालिका प्रविष्टियाँ वर्ण d द्वारा निरूपित की जाती हैं और फ़ंक्शंस के लिए प्रतीक तालिका प्रविष्टियों में प्रतीक प्रकार t होता है (क्योंकि निष्पादन योग्य कोड किसी ऑब्जेक्ट फ़ाइल के पाठ अनुभाग में स्थित होता है)। इसके अतिरिक्त, प्रतीक प्रकार का कैपिटलाइज़ेशन लिंकेज के प्रकार को इंगित करता है: लोअर-केस अक्षरों से संकेत मिलता है कि प्रतीक स्थानीय है और अपर-केस बाहरी (वैश्विक) लिंकेज को इंगित करता है।
 
SysV एबीआई (और nm के आउटपुट) में प्रतीक प्रकार प्रतीक तालिका में प्रत्येक प्रविष्टि की प्रकृति को इंगित करते हैं। प्रत्येक प्रतीक प्रकार को एक वर्ण द्वारा दर्शाया जाता है। उदाहरण के लिए, आरंभिक डेटा का प्रतिनिधित्व करने वाली प्रतीक तालिका प्रविष्टियाँ वर्ण d द्वारा निरूपित की जाती हैं और फ़ंक्शंस के लिए प्रतीक तालिका प्रविष्टियों में प्रतीक प्रकार t होता है (क्योंकि निष्पादन योग्य कोड किसी ऑब्जेक्ट फ़ाइल के पाठ अनुभाग में स्थित होता है)। इसके अतिरिक्त, प्रतीक प्रकार का पूंजीकरण लिंकेज के प्रकार को इंगित करता है: लोअर-केस अक्षरों से संकेत मिलता है कि प्रतीक स्थानीय है और अपर-केस बाहरी (वैश्विक) लिंकेज को इंगित करता है।


== उदाहरण: पायथन प्रतीक तालिका ==
== उदाहरण: पायथन प्रतीक तालिका ==
पायथन (प्रोग्रामिंग लैंग्वेज) प्रोग्रामिंग लैंग्वेज में सिंबल टेबल बनाने और मैनिपुलेट करने के लिए व्यापक समर्थन शामिल है।<ref>symtable — [https://docs.python.org/3/library/symtable.html Python documentation]</ref> जिन गुणों की पूछताछ की जा सकती है उनमें शामिल है कि क्या दिया गया प्रतीक एक [[मुक्त चर]] या [[बाध्य चर]] है, चाहे वह [[ब्लॉक गुंजाइश]] या [[वैश्विक कार्यक्षेत्र]] है, चाहे वह आयात किया गया हो, और यह किस नामस्थान से संबंधित है।
पायथन (प्रोग्रामिंग भाषा ) प्रोग्रामिंग भाषा में प्रतीक तालिका बनाने और युक्तियोजित करने के लिए व्यापक समर्थन सम्मिलित है।<ref>symtable — [https://docs.python.org/3/library/symtable.html Python documentation]</ref> जिन गुणों की पूछताछ की जा सकती है उनमें सम्मिलित है कि क्या दिया गया प्रतीक एक [[मुक्त चर]] या [[बाध्य चर]] है, चाहे वह [[ब्लॉक गुंजाइश|ब्लॉक स्कोप]]   या [[वैश्विक कार्यक्षेत्र]] है, चाहे वह आयात किया गया हो, और यह किस नामस्थान से संबंधित है।


== उदाहरण: गतिशील प्रतीक सारणी ==
== उदाहरण: गतिशील प्रतीक सारणी ==
कुछ प्रोग्रामिंग लैंग्वेज सिंबल टेबल को रन-टाइम में मैनिपुलेट करने की अनुमति देती हैं, ताकि सिंबल को किसी भी समय जोड़ा जा सके। [[रैकेट (प्रोग्रामिंग भाषा)]] ऐसी भाषा का एक उदाहरण है।<ref>Symbols - [https://docs.racket-lang.org/reference/symbols.html Racket Documentation]</ref>
कुछ प्रोग्रामिंग भाषा प्रतीक तालिका को रन-टाइम में युक्तियोजित करने की अनुमति देती हैं, ताकि प्रतीक को किसी भी समय जोड़ा जा सके। [[रैकेट (प्रोग्रामिंग भाषा)|रैकेट(प्रोग्रामिंग भाषा)]] ऐसी भाषा का एक उदाहरण है।<ref>Symbols - [https://docs.racket-lang.org/reference/symbols.html Racket Documentation]</ref>
एलआईएसपी और स्कीम (प्रोग्रामिंग लैंग्वेज) प्रोग्रामिंग लैंग्वेज दोनों ही प्रत्येक प्रतीक के साथ मनमाने, सामान्य गुणों को जोड़ने की अनुमति देती हैं।<ref>Symbols - [https://www.gnu.org/software/guile/manual/html_node/Symbols.html Guile Documentation]</ref>
 
एलआईएसपी और स्कीम (प्रोग्रामिंग भाषा ) प्रोग्रामिंग भाषा दोनों ही प्रत्येक प्रतीक के साथ मनमाने, सामान्य गुणों को जोड़ने की अनुमति देती हैं।<ref>Symbols - [https://www.gnu.org/software/guile/manual/html_node/Symbols.html Guile Documentation]</ref>
 
[[प्रोलॉग]] प्रोग्रामिंग भाषा अनिवार्य रूप से एक प्रतीक-तालिका हेरफेर भाषा है; प्रतीकों को परमाणु कहा जाता है, और प्रतीकों के बीच संबंधों पर तर्क दिया जा सकता है। इसी तरह, [[OpenCog]] एक गतिशील प्रतीक तालिका प्रदान करता है, जिसे एटमस्पेस कहा जाता है, जिसका उपयोग ज्ञान प्रतिनिधित्व के लिए किया जाता है।
[[प्रोलॉग]] प्रोग्रामिंग भाषा अनिवार्य रूप से एक प्रतीक-तालिका हेरफेर भाषा है; प्रतीकों को परमाणु कहा जाता है, और प्रतीकों के बीच संबंधों पर तर्क दिया जा सकता है। इसी तरह, [[OpenCog]] एक गतिशील प्रतीक तालिका प्रदान करता है, जिसे एटमस्पेस कहा जाता है, जिसका उपयोग ज्ञान प्रतिनिधित्व के लिए किया जाता है।



Revision as of 09:25, 24 February 2023

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


पृष्ठभूमि

एक प्रतीक तालिका केवल अनुवाद प्रक्रिया के दौरान स्मृति में उपस्थित हो सकती है, या इसे अनुवाद के आउटपुट में सन्निहित किया जा सकता है, जैसे बाद में उपयोग के लिए अनुप्रयोग बाइनरी अंतरपृष्‍ठ वस्तु फ़ाइल में। उदाहरण के लिए, इसका उपयोग पारस्परिक डिबगर के दौरान या किसी प्रोग्राम के निष्पादन(कंप्यूटर) के दौरान या उसके बाद निदानकारी रिपोर्ट को प्रारूपित करने के लिए एक संसाधन के रूप में किया जा सकता है।[1]


विवरण

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


कार्यान्वयन

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

एक अनुभाषक सभी प्रतीकों के लिए एक बड़ी प्रतीक तालिका का उपयोग कर सकता है या अलग-अलग कार्यक्षेत्र(प्रोग्रामिंग) के लिए अलग-अलग, श्रेणीबद्ध प्रतीक तालिकाओं का उपयोग कर सकता है। उदाहरण के लिए, अल्गोल या पीएल/आई जैसी एक दायरे वाली भाषा में एक प्रतीक 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()), कथन लेबल, इत्यादि।

उदाहरण:एसआईएसवी एबीआई

Example table: SysV एबीआई
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 एबीआई को जीएनयू बाइनरी यूटिलिटीज|जीएनयू बिनुटिल्स एनएम (यूनिक्स) यूटिलिटी में लागू किया गया है। यह प्रारूप एक क्रमबद्ध स्मृति पता फ़ील्ड, एक प्रतीक प्रकार फ़ील्ड और एक प्रतीक पहचानकर्ता (जिसे नाम कहा जाता है) का उपयोग करता है।[4]

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

उदाहरण: पायथन प्रतीक तालिका

पायथन (प्रोग्रामिंग भाषा ) प्रोग्रामिंग भाषा में प्रतीक तालिका बनाने और युक्तियोजित करने के लिए व्यापक समर्थन सम्मिलित है।[5] जिन गुणों की पूछताछ की जा सकती है उनमें सम्मिलित है कि क्या दिया गया प्रतीक एक मुक्त चर या बाध्य चर है, चाहे वह ब्लॉक स्कोप या वैश्विक कार्यक्षेत्र है, चाहे वह आयात किया गया हो, और यह किस नामस्थान से संबंधित है।

उदाहरण: गतिशील प्रतीक सारणी

कुछ प्रोग्रामिंग भाषा प्रतीक तालिका को रन-टाइम में युक्तियोजित करने की अनुमति देती हैं, ताकि प्रतीक को किसी भी समय जोड़ा जा सके। रैकेट(प्रोग्रामिंग भाषा) ऐसी भाषा का एक उदाहरण है।[6]

एलआईएसपी और स्कीम (प्रोग्रामिंग भाषा ) प्रोग्रामिंग भाषा दोनों ही प्रत्येक प्रतीक के साथ मनमाने, सामान्य गुणों को जोड़ने की अनुमति देती हैं।[7]

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

यह भी देखें

संदर्भ

  1. Nguyen, Binh (2004). Linux Dictionary. p. 1482. Retrieved Apr 14, 2018.
  2. Copper & Torczon 2011, p. 253.
  3. Copper & Torczon 2011, p. 254.
  4. "nm". sourceware.org. Retrieved May 30, 2020.
  5. symtable — Python documentation
  6. Symbols - Racket Documentation
  7. Symbols - Guile Documentation


ग्रन्थसूची