8.2. ИМЕНОВАНИЕ ПРОЦЕДУР
375
Таким образом, требуется хранилище имен, которое необходимо и достаточ-
но для решения задач идентификации и работы со стеком контекстов. В ка-
честве структуры такого хранилища, обычно называемого таблицей имен,
целесообразно использовать дерево контекстов, каждая вершина которого
содержит секцию стека контекстов, соответствующую комплекту объектов,
описываемых в некоторой конструкции программы. Путь от корня к какой-
либо из вершин этой таблицы отражает появляющуюся в динамике вычисле-
ний структуру стека контекстов.
В современных языках программирования все чаще появляются проце-
дуры с одним и тем же именем, но обозначающие разные алгоритмы. В этой
связи встает вопрос о том, как трактовать именование таких процедур.
Прежде всего, данная ситуация знакома по другим языковым конструк-
циям, когда одно и то же обозначение имеет различный смысл, раскрывае-
мый в зависимости от ситуации. Так, в
Pascal
очень много смыслов имеет
служебное слово
end
. Каждый из них распознается при синтаксическом ана-
лизе текста и далее конкретного синтаксиса не распространяется. Различные
смыслы обозначаются знаками операций. Например, в
C/C++
,
Pascal
и дру-
гих языках знак “+” связан с различными алгоритмами для разных типов ар-
гументов, и типы аргументов указывают, какой из алгоритмов выбрать. Еще
больше вариантов смыслов в
C/C++
имеет знак “*”, который обозначает и
разные алгоритмы умножения, и то, что применяется указатель. Для опреде-
ления того, что имеется в виду при употреблении знака “*”, используется как
его синтаксическая позиция, так и типы аргументов. Заметим, что разное ис-
пользование символа (например, “+” как знак операции “+” или часть знака
“++”) — не относится к рассматриваемому вопросу, поскольку само понятие
смысла определяется, начиная с уровня лексем.
Эти иллюстрации показывают, что в языке программирования одно и то
же обозначение может относиться к разным сущностям, но за счет дополни-
тельной информации всегда однозначно понятно,какая конкретная сущность
должна быть использована. О таких обозначениях говорят, что они являются
полиморфными.
Важным видом полиморфизма является полиморфизм имен: один и тот
же идентификатор,описанный в разных пространствах имен,обозначает раз-
личное: данные, алгоритмы и др. Здесь смысл идентификатора, или, что то
же, то, имя какой сущности используется, раскрывается посредством приме-
нения правил локализации имен (см. следующий параграф). Процедуры с од-
ним и тем же именем, но обозначающие разные алгоритмы, (в
С++
, и др.) —
разновидность полиморфизма имен, раскрываемого за счет привлечения так