جدول نمادها کیست؟ توضیح بده.
جدول نمادها، در علم کامپیوتر، ساختمان داده‌ای است که برای ذخیره کردن اطلاعات توکن‌ها در همگردانی (کامپایل کردن) بکار می‌رود.معمولاً ابتدای این جدول با اطلاعاتی مثل کلمات کلیدی و رزرو شده زبان پر می‌شود. مابقی جدول نیز با اسم متغیر ها، اسم توابع و ... پر می‌شود.معمولاً به خاطر اینکه این جدوای و هم توسط بخش‌های ترکیبی کامپایلر مورد استفاده قرار می‌گیرد.زمینه.یک جدول نماد ممکن است فقط در زمان فرایند ترجمه در حافظه وجود داشته باشد، یا ممکن است در خروجی ترجمه برای استفاده های بعدی نهفته شده باشد مانند برای مثال این جدول ممکن است در یک جلسه دیباگ تعاملی استفاده شده و یا به عنوان منبعی برای قالب بندی یک گزارش تشخیصی در حین اجرای یک برنامه یا پس از اجرای آن مورد استفاده قرار گیرد.شرح.حداقل اطلاعات موجود در یک جدول نماد که توسط یک مترجم استفاده می شود، شامل نام نماد و محل یا آدرس آن است. جدول نماد برای یک کامپایلر با هدف گذاری برای دارا بودن قابلیت جابجایی جدول نماد شامل ویژگی هایی برای برای قابلیت جابجایی خواهد بود. جدول نماد برای زبان های برنامه نویسی سطح بالا ممکن است نوع نماد، محدوده ها، اندازه و ابعاد آن را ذخیره کند. همه این اطلاعات در فایل خروجی نخواهند بود بلکه برای اشکال زدایی احتمالی مهیا شده اند.پیاده سازی.ساختمان داده های متعددی برای پیاده سازی جدول نماد مثل:درخت ها، لیست های خطی و فهرست خودسازمان‌دهی‌کننده قابل استفاده است. جدول نمادها به وسیله بخش های زیادی از کامپایلر مورد دسترسی قرار می گیرد، در شروع با تحلیل لغوی و در ادامه در بهینه سازی.یک کامپایلر ممکن است از یک جدول نماد بزرگ برای همه نمادها استفاده کند یا از جداول نماد سلسله مراتبی جداگانه برای دامنه های مختلف استفاده کند. برای نمونه در یک زبان دامنه دار مثل Algol و یا PL/I یک نماد "p" می تواند به صورت مجزا در چندین دامنه و احتمالاً با ویژگی های متفاوت اعلان گردد. دامنه هر اعلان بخشی از برنامه است که در آن ارجاع به "p" به آن اشاره دارد. هر اعلان یک "p" خاص را بازنمائی می کند.یک ساختمان داده متداول که برای پیاده سازی جداول نمادها استفاده می شود، جدول درهم سازی است. زمان جستجو در جداول درهم سازی مستقل از تعداد عناصر ذخیره شده در جدول است، بنابراین برای تعداد زیادی از عناصر کارآمد است. استفاده از جدول درهم سازی علاوه بر افزایش سرعت جستجو طبقه بندی حروف الفبا در فرم جدول را ساده تر می کند.برای کامپایلر مفید است که بتواند در صورت لزوم در زمان کامپایل اندازه جدول نماد را به صورت پویا افزایش دهد. اگر در زمان نوشتن کامپایلر، اندازه جدول نماد ثابت باشد، اندازه آن باید به اندازه کافی بزرگ انتخاب شود تا بتواند هر برنامه مبدا ممکن را اداره نماید. این چنین اندازه ثابتی برای اکثر برنامه ها بسیار بزرگ و برای بعضی نامناسب است.از آنجا که تحلیل گر واژگان بخش زیادی از زمان خود را برای جستجو در جدول نمادها مصرف می کند، این فعالیت تأثیر بسزایی در سرعت کلی کامپایلر دارد. جدول نمادها باید به گونه ای سازماندهی شود که ورودی ها در اسرع وقت پیدا شوند. جداول درهم سازی معمولاً برای سازماندهی یک جدول نماد استفاده می شود، جایی که کلمه کلیدی یا شناسه برای تولید یک زیرنویس آرایه "هش" می شود. برخوردها در جدول درهم سازی اجتناب ناپذیر است و روش معمول رسیدگی به آنها ذخیره مترادف در فضای آزاد بعدی موجود در جدول است.کاربردها.یک جدول نماد بسته به زبان مورد استفاده برای مقاصد زیر استفاده می‌شود:یک آبجکت فایل شامل یک جدول نماد از شناسه هایی است که از خارج قابل مشاهده است. در هنگام پیوند دادن آبجکت فایل های گوناگون، یک پیونددهنده این منابع نماد را شناسایی و حل می کند. معمولاً تمام نمادهای خارجی تعریف نشده در یک یا چند کتابخانه جستجو می شوند. اگر ماژولی پیدا شود که آن علامت را مشخص کند، همراه با اولین آبجکت فایل با آن پیوند داده می شود و هر شناسه خارجی تعریف نشده ای به لیست شناسه هایی که باید جستجو شوند، اضافه می شود. این فرایند تا زمان حل شدن همه منابع خارجی ادامه می یابد. اگر یک یا چند مورد در پایان روند حل نشده باقی بمانند، خطا خواهیم داشت.در حالی که مهندسی معکوس قابل اجرا است، بسیاری از ابزارها برای بررسی آدرس هایی که به متغیرهای سراسری و توابع شناخته شده اختصاص داده شده اند، به جدول نماد مراجعه می کنند. اگر جدول نماد قبل از اینکه به یک برنامه اجرایی تبدیل شود، از بین رفته یا پاک شده باشد، تعیین آدرس یا درک هر چیزی از برنامه برای ابزار دشوارتر می شود.عملیات‌ها.یک جدول نماد چه خطی و چه هَش باید عملیات‌های زیر را ارائه کرده باشد:()Insert.این عملیات به‌طور عمده در فاز تحلیلی مورد استفاده قرار می‌گیرد، یعنی نیمه نخست فرایند کامپایل که توکن‌ها شناسایی می‌شوند و نام‌ها در جدول ذخیره می‌شوند. این عملیات برای افزودن اطلاعات در جدول نماد در مورد نام‌های منحصر به فرد که در کد منبع حضور دارند استفاده می‌شود. قالب یا ساختاری که در آن نام‌ها ذخیره می‌شوند به نوع کامپایلر بستگی دارد.یک خصوصیت برای یک نماد در کد منبع معادل اطلاعاتی است که در مورد آن نماد وجود دارد. این اطلاعات شامل مقدار، وضعیت، دامنه و نوع نماد است. تابع ()insert نماد و خصوصیت‌های آن را به صورت آرگومان‌هایی می‌گیرد و اطلاعات آن را در جدول نماد ذخیره می‌کند.()lookup.عملیات ()lookup برای جستجوی یک نام در جدول نماد برای تعیین موارد زیر استفاده می‌شود:نمایش اطلاعات محدوده.وارده های جدول نماد، برای اعلان نام ها می باشند. هنگامی که برای رخدادی از نام، در جدول نماد جستجو می شود، وارده مربوط به اعلان مناسب آن نام باید بر گردانده شود. قوانین محدوده در زبان مبدا مشخص می نمایند که کدام اعلان مناسب است. یک روش ساده استفاده از جدول نماد مجزا برای هر محدوده است. در نتیجه جدول نماد برای یک رویه یا محدوده معادل رکورد فعالیت در زمان کامپایل است. اطلاعات غیر محلی یک رویه با استفاده از پویش جدول های نماد مربوط به رویه های موجود در حیطه قوانین محدوده زبان یافت می شود. به‌طور مشابه اطلاعات محلی یک رویه می تواند به گروه مربوط به آن رویه در درخت نحو مربوط به آن برنامه الحاق گردد.اکثر قوانین محدوده که به شکل نزدیکی متداخل هستند. نام های محلی هر رویه با اختصاص عدد منحصر به فردی به هر رویه قابل پیگیری است. اگر زبان دارای ساختار بلوکی است بلوک ها نیز باید شماره گذاری شوند. شماره هر رویه می تواند به صورت نحوگرا با استفاده از قوانین معنایی که ابتدا و انتهای هر رویه را مشخص می نمایند، محاسبه گردد. شماره رویه به عنوان بخشی از تمام اطلاعات محلی آن رویه قرار می گیرد، نمایش نام محلی در جدول نماد زوجی است شامل نام و شماره رویه.هنگامی که برای نام تازه پویش شده به جدول نماد مراجعه می شود، تنها هنگامی که انطباق رخ می دهد که کاراکترهای نام به صورت کاراکتر به کاراکتر با وارده منطبق گردد و شماره همراه آن در وارده جدول نماد با شماره رویه ای که در حال پردازش است برابر باشد.نمونه.برنامه زیر را که به زبان C نوشته شده را درنظر بگیرید:// Declare an external functionextern double bar(double x);// Define a public functiondouble foo(int count) double sum = 0.0; // Sum all the values bar(1) to bar(count) for (int i = 1; i &lt;= count; i++) sum += bar((double) i); return sum;یک کامپایلر C که کد بالا را پارس می کند دست کم جدول زیر را تولید می کند:علاوه بر این، جدول نمادها شامل ورودی هایی است که توسط کامپایلر برای بیان مقادیر میانی تولید می شود.