Таблица символов: различия между версиями

Материал из Поле цифровой дидактики
м 1 версия импортирована
Нет описания правки
 
Строка 1: Строка 1:
{{нет источников|date=July 2013}}
В [[информатика|информатике]] '''таблица символов''' это [[структура данных]], используемая [[транслятор]]ом ([[компилятор]]ом или [[интерпретатор]]ом), в которой каждый идентификатор переменной или функции из [[исходный код|исходного кода]] ассоциируется с информацией, связанной с его объявлением или появлением в коде: [[Тип данных|типом данных]], [[Область видимости|областью видимости]] и в некоторых случаях [[Адрес (информатика)|местом в памяти]] ([[Смещение (адресация)|смещением]]).
{{не путать|Набор символов|набором символов|таблицей, задающей кодировку символов алфавита}}
{{о|информации о функциях и переменных в объектных файлах|стандартной программе Windows|Таблица символов (Windows)|об1=1}}
В [[информатика|информатике]] '''таблица символов''' (от {{lang-en|symbol table}} «таблица идентификаторов») — это [[структура данных]], используемая [[транслятор]]ом ([[компилятор]]ом или [[интерпретатор]]ом), в которой каждый идентификатор переменной или функции из [[исходный код|исходного кода]] ассоциируется с информацией, связанной с его объявлением или появлением в коде: [[Тип данных|типом данных]], [[Область видимости|областью видимости]] и в некоторых случаях [[Адрес (информатика)|местом в памяти]] ([[Смещение (адресация)|смещением]]).


== Реализация ==
== Реализация ==
Общеиспользуемой реализацией является [[хеш-таблица]]. Компилятор может как использовать единую таблицу для символов, так и разделять символы на несколько иерархических таблиц по разным [[область видимости|областям видимости]]. Бывают также реализации в виде деревьев, линейных и самоорганизовываемых списков.
Общеиспользуемой реализацией является [[хеш-таблица]]. Компилятор может как использовать единую таблицу для символов, так и разделять символы на несколько иерархических таблиц по разным [[область видимости|областям видимости]]. Бывают также реализации в виде деревьев, линейных и самоорганизовываемых списков.
== Применение ==
[[Объектный модуль]] (англ. object file) содержит таблицу символов для внешне видимых (публичных) идентификаторов. При связывании ([[Компоновщик|линковке]]) разных объектных модулей [[компоновщик]] использует таблицы символов для разрешения межмодульных упоминаний.


Таблица символов может существовать лишь на протяжении трансляции, но иногда она вкладывается в вывод этого процесса<!--NOTE: не разложено, не объяснено, как в источнике; разъяснить и перевести обратно в англовики--> для дальнейшего использования, например, во время интерактивной [[отладка программы|отладки]], или как источник для форматирования диагностического отчета во время или после исполнения программы.
Таблица символов может существовать лишь на протяжении трансляции, но иногда она вкладывается в вывод этого процесса<!--NOTE: не разложено, не объяснено, как в источнике; разъяснить и перевести обратно в англовики--> для дальнейшего использования, например, во время интерактивной [[отладка программы|отладки]], или как источник для форматирования диагностического отчета во время или после исполнения программы.
Во время [[обратная разработка|реверс-инжиниринга]] многие утилиты с помощью таблицы проверяют, каким адресам принадлежат глобальные переменные и известные функции. Если таблица символов была убрана из объектных модулей до линковки (например, с помощью strip из [[GNU binary utilities|GNU binutils]]), утилитам будет сложнее определить адреса важных мест программы и проанализировать её.
При доступе к переменным и [[Динамическое распределение памяти|динамическом распределении памяти]] компилятор должен осуществить множество работ, отсюда — расширенной модели стека при динамическом распределении необходима таблица символов.{{Clarify|date=July 2013}}
Хорошим примером использования таблицы символов могут послужить модульные [[ядро операционной системы|ядра ОС]] [[UNIX-подобная операционная система|семейства Unix]]: таблица символов может использоваться подгружаемыми модулями ядра (например, драйверами) для доступа к неким символам. Однако это не является обязательным, если модуль не обращается к ядру, не использует внутренние функции, переменные, и т. д.<ref>{{книга
|автор              = Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman
|часть              = Гл. 2: Сборка и запуск модулей; Символьная таблица ядра
|заглавие        = Linux Device Drivers, Third Edition
|издательство = O'Reilly Media
|ссылка            = http://dmilvdv.narod.ru/Translate/LDD3/index.html?ldd_kernel_symbol_table.html
|год                  = 2005
|isbn                    = 0-596-00590-3
}} {{Wayback|url=http://dmilvdv.narod.ru/Translate/LDD3/index.html?ldd_kernel_symbol_table.html |date=20140328215511 }}</ref> Возможно обойтись без таблицы символов и обращаться к памяти внутри ядра напрямую, но в этом случае будет потеряна переносимость модулей, так как при разных конфигурациях ядра одинаковый код будет размещён в разных местах.{{Нет АИ|8|7|2013}}
== Пример ==
Снизу приведена таблица символов небольшой программы. Для её создания использовалась утилита [[nm (Unix)|nm]] из комплекта [[GNU binary utilities|GNU binutils]]. В таблице размечен один символ данных (отмечен как тип «D») и множество функций (как из стандартной библиотеки, так и принадлежащие самой программе). Первая колонка содержит адрес смещения в памяти, вторая — [http://sourceware.org/binutils/docs-2.17/binutils/nm.html#nm тип символа], третья — его название.
{| class="wikitable" style="text-align:center"
|+Пример таблицы
|-
! Адрес !! Тип !! Имя
|-
|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
|-
|200009a0 || D || holaamigosh
|-
|200009a4 || A || __bss_end__
|-
|200009a4 || A || __bss_start
|-
|200009a4 || A || __bss_start__
|-
|200009a4 || A || _edata
|-
|200009a4 || A || _end
|}
== См. также ==
* [[Отладочные символы]]
== Примечания ==
{{примечания}}


[[Категория:Структуры данных]]
[[Категория:Структуры данных]]
[[Категория:Теория компиляторов]]

Текущая версия от 12:24, 19 октября 2022

В информатике таблица символов — это структура данных, используемая транслятором (компилятором или интерпретатором), в которой каждый идентификатор переменной или функции из исходного кода ассоциируется с информацией, связанной с его объявлением или появлением в коде: типом данных, областью видимости и в некоторых случаях местом в памяти (смещением).

Реализация

Общеиспользуемой реализацией является хеш-таблица. Компилятор может как использовать единую таблицу для символов, так и разделять символы на несколько иерархических таблиц по разным областям видимости. Бывают также реализации в виде деревьев, линейных и самоорганизовываемых списков.

Таблица символов может существовать лишь на протяжении трансляции, но иногда она вкладывается в вывод этого процесса для дальнейшего использования, например, во время интерактивной отладки, или как источник для форматирования диагностического отчета во время или после исполнения программы.