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

 

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

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

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

ак правило, в языках программирования контекст взова (за искл че-нием той его части, которая попадает в контекст описания), непосредственно процедуре недоступен. оэтому необходимо передать процедуре те элементы контекста вызова, которые должны обрабатываться (использоваться и/или модифицироваться).
В настоящее время распространены два способа передачи данных контекста вызова во внутренний контекст процедуры.
Определение 8.3.1. Параметризация — часть локальных данных процедуры (называемая совокупностью формалъных параметров) объявляется специально вделенной для передачи даннх меду внутренним контекстом процедуры и контекстом ее вызова. бие блоки —- некоторый контекст моет бть сделан часть внутреннего контекста нескольких фрагментов программы.
Конец определения 8.3.1.
Оба варианта передачи данных изображены на рис. 8.3. Серым цветом обозначен данне, совместно используеме тремя процедурами. ни предоставляются четырьмя общими блоками и через передачу параметров. Стрелки отраа т фактическое обраение к данным. з рисунка видно, что при использовании обих блоков подпрограммы вступа т равноправно, тогда как при параметризации нет этого свойства. Поскольку g вызывается внутри
8.3.
381
main f g
параметры
W
параметры
W
Рис. 8.3. Общие блоки и параметры
f, а та внутри main, то через формальные параметры g может получать данные из двух контекстов, f из двух, а главная программа может иметь лишь данные глобального контекста. Каждый из двух механизмов передачи данных вынуждает программиста думать о взаимоотношении подпрограмм по-разному, следовательно, они концептуально противоречат друг другу, что при совместном использовании проявляется в оибках и в неоправданной запутанности программ.
Остановимся вначале на менее распространенной дисциплине взаимосвязи вызова процедуры и других фрагментов программы — на общих блоках.
Пример 8.3.2. Общие блоки появились в языке FORTRAN. В этом языке текст основной программы и подпрограмм полность разделены. о мо -но в лбой подпрограмме описать обий блок, например,
COMMON /COORD/ X,Y,Z
В другой подпрограмме может быть такое же описание, и тогда каждая из них пользуется переменными X, Y, Z как элементами своего внутреннего контекста. о беда была в том, что соверенно не запреалось написать в другой программе
COMMON /COORD/A(3)
или даже
382
8.
COMMON /COORD/ CHAR STR(IO)
Общие блоки в языке FORTRAN понимаются лишь с точки зрения общей ма-
инной памяти, разделяемой подпрограммами. Конец примера 8.3.2.
В языке С++ имеется любопытный суррогат общих блоков, лишенный больинства из недостатков, присуих примитивной концепции язка FORTRAN. Если некоторый элемент класса определяется как static, то он разделяется всеми экземплярами данного класса.
роблема передачи параметров заслу ивает отдельного рассмотрения, а пока что мы займемся правилами разреения конфликтов при объединении контекстов (правилами локализации, см. определение 7.3.2).
различнх язках введен разные правила локализации. В язках с так называемой блочной структурой (к которым относится, например, Pascal) употребление имен языковх объектов регламентируется правилами, впервые сформулированными в Algol 60:
a) если некоторое имя, употребляемое в теле процедуры, встречается среди описаний ее локального контекста, то оно понимается в том смысле, в котором оно определено в локальном контексте;
b) если некоторое имя, употребляемое в теле процедуры, не встречается среди описаний ее локального контекста, то делается попытка найти его в объемлем контексте (т. е. в том контексте, в рамках описаний которого помещен текст процедуры), в той его части, которая непосредственно предествует описани данной процедуры;
c) если имя, употребляемое в теле процедуры, не удается найти в соответствии с правилами (a) и (b), то делается попытка найти его в следуем объемлем контексте до тех пор, пока контекст поиска имени не оказывается локальным контекстом процедуры. (Для С это правило не действует, поскольку нельзя описывать функции внутри функций; в С++ кон-струкци описания метода с точки зрения локализации имен мо но рассматривать как задание уровня вло енности в описания класса).
d) если в результате выполнения действий, указанных в правилах (a), (b) и (с) имя остается ненайденным, то оно считается не определенным, а его использование — некорректнм.
еречисленне правила локализации имен язковых объектов зачасту до-полня тся ее одним соглаением (это сделано, например, в язке Pascal):
8.3.
383
e) поиск использованного в программе или подпрограмме имени осуществляется среди тех описаний (какого-либо контекста), которые текстуально предшествуют точке использования имени.
Правило (e) впервые появилось в связи с идеей так называемой однопроходной трансляции (построения объектного кода за один просмотр текста программы), но в дальнейем оказалось, что оно хороо согласуется с принципами модульного и структурного программирования, и задача трансляции отола на второй план.
равила локализации имен — второе по ваности после именования средство языка, предопределяющее его возможности в части использования процедур. ни отвеча т на вопрос о регламенте взаимоотноения текста процедуры и текста программ .
Предыдущая << 1 .. 128 129 130 131 132 133 < 134 > 135 136 137 138 139 140 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100