У інформатиці таблиця символів — це структура даних, у якій кожен ідентифікатор (символ) (що позначає змінні, константи, процедури, функції тощо) у коді програми пов'язаний з необхідною інформацією для його функціонування. Це може мати дві основні форми: У випадку об'єктних файлів та виконуваних файлів «кодом» є машинний код, а «інформацією» зазвичай є адреса пам'яті сутності, на яку посилається символ. У випадку мовних трансляторів, таких як компілятор або інтерпретатор, «кодом» зазвичай є початковий код, а «інформація» стосується оголошення або появи запису у початковому коді. (Інтерпретаторам також потрібен спосіб знаходити «значення» запису в таблиці, часто це адреса, що вказує на іншу структуру даних.) У випадку файлів із проміжним кодом «інформація» може бути проміжною між двома наведеними вище типами.

Таблиця символів другого типу зазвичай існує лише в пам'яті під час процесу трансляції. Таблиця символів першого типу вбудовується у результат трансляції, наприклад в двійковий програмний інтерфейс об'єктного файлу, для подальшого використання. Наприклад, вона може використовуватися під час завантаження динамічної бібліотеки, під час інтерактивного сеансу налагодження або як ресурс для форматування діагностичного звіту під час або після виконання програми.

Об'єктні файли та виконувані файли

Мінімальна інформація, що міститься в таблиці символів, яку використовує файл машинного коду, включає ім'я символу та його розташування або адресу. Для компілятора, орієнтованого на платформу з поняттям переміщуваності, вона також міститиме атрибути переміщуваності (абсолютний, переміщуваний тощо) та необхідну інформацію про переміщення для переміщуваних символів. Таблиці символів для мов програмування високого рівня можуть зберігати тип символу: рядок, ціле число, число з рухомою комою тощо, його розмір, а також його розмірності та межі. Не вся ця інформація включається у вихідний файл, але може надаватися для використання під час налагодження. У багатьох випадках інформація про перехресні посилання символу зберігається разом із таблицею символів або пов'язується з нею. Більшість компіляторів виводять частину або всю цю інформацію у списках таблиці символів і перехресних посилань наприкінці трансляції.

Таблиці символів машинного коду оптимізовані для компактності й зазвичай являють собою плоский масив структур. (Перетворення на «розумнішу» структуру даних, якщо воно взагалі потрібне, може виконуватися в ядрі комп'ютера після завантаження ним файлу.)

Застосування

Об'єктний модуль міститиме таблицю символів ідентифікаторів, які він містить і які є зовні видимими. Під час компонування різних об'єктних файлів компонувальник ідентифікує та розв'язує ці посилання на символи. Зазвичай усі невизначені зовнішні символи шукаються в одній або кількох об'єктних бібліотеках. Якщо знайдено модуль, що визначає цей символ, його компонують разом із першим об'єктним файлом, а всі невизначені зовнішні ідентифікатори додаються до списку ідентифікаторів, які потрібно шукати. Цей процес триває, доки всі зовнішні посилання не буде розв'язано. Якщо наприкінці процесу одне або більше посилань залишаються нерозв'язаними, це є помилкою.

Під час зворотної інженерії виконуваного файлу багато інструментів звертаються до таблиці символів, щоб перевірити, які адреси призначено глобальним змінним і відомим функціям. Якщо перед перетворенням на виконуваний файл таблицю символів було видалено, інструментам буде складніше визначити адреси або зрозуміти щось про програму.

Примітки