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

 

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

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

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 143 144 145 146 147 148 < 149 > 150 151 152 153 154 155 .. 316 >> Следующая

Что касается выходного назначения параметра, то здесь ситуация еще бо-
422
8.
лее сложная. Стратегия ленивых вчислений предписвает откладывание определения выходного параметра до тех пор, пока не возникнет потребность в этом, а такая потребность может появляться уже после завершения выполнения процедур (в частности, при последовательнх вычислениях она с гарантией возникает после заверения). Как следствие, последний момент, когда ее возмо но вчислить выходной параметр, — это возврат из процедуры. Именно этот момент является предельным для откладывания необходимости вычисления выходного параметра.
ллстрация возмо нх переносов подстановки параметра по необходимости дана на рис. 8.8.
Вызов процедуры
Использование in-параметра
Вычисление out-параметра
Возврат из процедуры
Использование out-параметра
Рис. 8.8. Перенос назначения необходимости на более ранние сроки
еханизм передачи параметра по наименовани содерит некоторые черты подстановки по необходимости. В самом деле, санк выполняется тогда и только тогда, когда происходит обращение к формальному параметру. Однако есть одно существенное отличие: фактический параметр, передаваемый по необходимости, не должен вычисляться повторно при повторных обра-ениях к соответствуему формальному параметру. Этого можно достичь, например, следующим образом. Для каждого параметра при первом обраении к нему вставляется флаг, разграничиваий вариант выполняемых санков. В частности,
value N : by need
при первом обращении к N должно приводить к дозагрузке стека, а при по-следуих обраениях — к эффекту работ с обчной локальной переменной (санк становится ненужным). При первом обращении к N, определяемому как параметр-переменная
var N : by need
аналогично в стек загру ается ссылка на N .
Чтобы разобраться с вопросами параметризации, полезно познакомиться
8.5. ПАРАМЕТРИЗАЦИЯ
423
с тем, как представленне вые механизм зада тся в конкретнх языках.
Константные параметры. Осознание того, что некоторые передаваемые процедуре данные нуждаются в дополнительной защите, приводит разработчиков языков программирования к введени специальных спецификаторов параметров для таких случаев. бычно говорят о константном поведении параметра, или, короче, о константном параметре. Это понимается как ограничение возможности изменения значения фактического параметра в теле процедуры.
В Object Pascal константный параметр синтаксически оформляется сле-дуим образом:
procedure P ( const <описание формального параметра> );
В руководстве по языку Object Pascal сказано, что константный параметр описывает константу, доступную только в теле процедуры, получающую в качестве значения значение выра ения фактического параметра при вызове процедур или функции. Как и лбой другой константе, константному параметру нельзя присваивать значений (он не мо ет употребляться в качестве левой части оператора присваивания).
В С++ оформление константного параметра практически такое же: void P ( const <описание формального параметра> ); ля неуказательных типов это означает в точности е эффект, что и для Object Pascal, но у е по другой причине: здесь описывается некоторая область памяти в стеке с ограничением возможности присваивания значений точно так же, как и для любого локального константного описания.
Ситуация меняется, если речь идет об указателях. з требования руководства по Object Pascal следует, что описание формального параметра указательного типа определяет переменну этого типа с именем, вводимм этим описанием. Коль скоро она получает значение фактического параметра-указателя, это значение не может быть изменено. В С++ данная конструкция определяет память, к которой мо но обрааться с использованием имени формального параметра. ак в случае обычного описания, так и при описании формального параметра спецификатор const защищает от изменения эту память, а не значение самого указателя.
Представляют ли эти конструкции новый механизм параметризации? риведенное разъяснение явно показвает, что для обоих языков кон-стантнй параметр дает в точности то, что требуется от входнх параметров (с несколько различным пониманием того, что передается процедуре через параметр), но без дополнительной прагматической нагрузки параметров-значений, связанной с образованием переменой, получающей копию передава-
424
ГЛАВА 8. ПОДПРОГРАММЫ
емого значения. Напротив, для Object Pascal тот факт, что константные параметры не могут служить получателями в операторах присваивания, позволяет, в частности, организовывать передачу процедуре ссылки, когда фактические параметры оказываются переменными, с сохранением требуемой семантики. Это снимает противоречие между желанием передавать входные параметры-массивы по значени и стремлением к эффективности, которое заставляет во избежание копирования больших массивов данных пользоваться параметрами-переменными. А константный указательный параметр языка С++ непосредственно приспособлен к такому приему оперирования с массивами, структурами и другими составными типами.
Резюмируя обсуждение, можно сказать, что константные параметры есть всего лишь иное прагматическое оформление входных параметров.
Предыдущая << 1 .. 143 144 145 146 147 148 < 149 > 150 151 152 153 154 155 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100