Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 132

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 126 127 128 129 130 131 < 132 > 133 134 135 136 137 138 .. 316 >> Следующая

8.2.
375
Таким образом, требуется хранилие имен, которое необходимо и достаточно для решения задач идентификации и работы со стеком контекстов. В качестве структуры такого хранилища, обычно называемого таблицей имен, целесообразно использовать дерево контекстов, кадая верина которого содержит секцию стека контекстов, соответствующую комплекту объектов, описываемых в некоторой конструкции программы. уть от корня к какой-либо из вершин этой таблицы отражает появляющуюся в динамике вычислений структуру стека контекстов.
В современнх язках программирования все чае появля тся процедуры с одним и тем е именем, но обозначаие разные алгоритм . В этой связи встает вопрос о том, как трактовать именование таких процедур.
Прежде всего, данная ситуация знакома по другим языковым конструкциям, когда одно и то же обозначение имеет различный смысл, раскрываемый в зависимости от ситуации. Так, в Pascal очень много смыслов имеет служебное слово end. Каждый из них распознается при синтаксическом анализе текста и далее конкретного синтаксиса не распространяется. Различные смыслы обозначаются знаками операций. Например, в C/C++, Pascal и других языках знак "+" связан с различными алгоритмами для разных типов аргументов, и типы аргументов указывают, какой из алгоритмов выбрать. Еще больше вариантов смыслов в C/C++ имеет знак "*", который обозначает и разные алгоритм умно ения, и то, что применяется указатель. ля определения того, что имеется в виду при употреблении знака "*", используется как его синтаксическая позиция, так и типы аргументов. Заметим, что разное использование символа (например, "+" как знак операции "+" или часть знака "++") — не относится к рассматриваемому вопросу, поскольку само понятие смсла определяется, начиная с уровня лексем.
Эти иллстрации показва т, что в язке программирования одно и то же обозначение может относиться к разным сущностям, но за счет дополнительной информации всегда однозначно понятно, какая конкретная суность долна бть использована. таких обозначениях говорят, что они явля тся полиморфными.
Ваным видом полиморфизма является полиморфизм имен: один и тот же идентификатор, описанный в разных пространствах имен, обозначает различное: данные, алгоритм и др. Здесь смысл идентификатора, или, что то е, то, имя какой суности используется, раскрывается посредством применения правил локализации имен (см. следуий параграф). роцедуры с одним и тем е именем, но обозначаие разне алгоритмы, (в С++, и др.) — разновидность полиморфизма имен, раскрываемого за счет привлечения так
376
8.
называемых сигнатур — информации о количестве и типах параметров. Это в точности то же самое, что и полиморфизм операций в выражении, когда конкретный смысл операции выявляется типами аргументов.
ри рассу дениях о процедурах удобно рассматривать сигнатуру как часть имени. хотя такое рассмотрение несколько противоречит разграничени контекстно-свободного синтаксиса и контекстнх зависимостей, это противоречие не распространяется далее конкретного синтаксиса языка.4 Для читателей, сведущих в объектно-ориентированном программировании, заметим, что часть имени нельзя считать информаци о том, какая из одноименных виртуальных функций будет использована при вчислениях. Эта информация извлекается в динамике вычислений из того, к какому классу относится действующий в данный момент объект, когда понятие именования уже не рассматривается.5 Этот динамический полиморфизм зачастую рассматрива-т как единственный вид полиморфизма в языках программирования, что ничем не мотивированно.
В качестве сквозного примера, развиваемого в последуих разделах, приведем заголовки двух процедур, предназначенных для реализации ввода с клавиатуры квадратной матрицы размера N на N, размещаемой в "объемлющем" двумерном массиве, индексируемом значениями 1:NN, где NN — константа, (см. Рис. 8.2).
ервая процедура с заголовком
void MyOwnMatr(Matrix M, int SizeM); не вырабатывает значения, вторая — врабатывает значение, определяее размер массива:
int MyInpMatr(Matrix M); MyOwnMatr применима тогда, когда заранее известно значение N, а MyInpMatr— в случаях, когда величину N требуется определять при вводе, и тогда вырабатываемое функцией значение есть размер матрицы по каждому из измерений.
Сквозной пример носит иллюстративный характер: понятно, что две функции по своему назначени альтернативны (нет смсла использовать их в од-
4 Некоторая техническая трудность, возникающая при дополнении имени процедуры сигнатурой, преодолевается при синтаксическом анализе конструкции вызова (приходится выявлять сигнатуру), и анализе контекстных зависимостей, когда сигнатуру вызова нужно сопоставлять с сигнатурами описаний процедур. Придумайте алгоритмы, решающие поставленную задачу.
5 Впрочем, это зависит от того, как понимается имя в данном языке. Иногда (особенно в языках, ориентированных на интерпретацию) можно говорить о динамических именах объектов.
8.3. ЛОКАЛИЗАЦИЯ ИМЕН
377
N
N
Неиспользованная часть массива
NN
NN
Рис. 8.2. Представление матрицы размера N*N в массиве размера NN
Предыдущая << 1 .. 126 127 128 129 130 131 < 132 > 133 134 135 136 137 138 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100