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

 

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

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

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

Именно передача параметра по ссылке в С/С++ реализуется с помощью механизма передачи по значению. В этом языке весьма развиты средства оперирования с указателями, а потому авторы языка предпочли "забыть о лишних" механизмах. В самом деле, заголовок функции
void S (int *x)
предписвает, что фактическим параметром мо ет быть нечто, указва -ее на целочисленное значение. В частности, выра ение
&Variable
при вычислении дает адрес переменной Variable. А это именно то, что нужно для передачи параметра по ссылке.
Передача параметра по необходимости — это скорее подход, чем кон-кретнй механизм. ри передаче по необходимости параметр вчисляется в тот момент, когда в теле процедуры в первый раз происходит обращение
420
8.
к нему. В частности, если входной параметр так и не используется, то его вычисления просто не произойдет.
Передача по необходимости является частным проявлением так называемой стратегии ленивых вычислений (lazy evaluations). Суть стратегии в том, чтобы откладвать отдельные части вчисления до тех пор, пока м хоть что-либо мо ем сделать, не используя их результат . Таким образом, действия производятся лишь тогда, когда их результаты с необходимостью требуются для дальнейшего продвижения процесса вычислений. В результате мо но (чуть-чуть нестрого) утвердать, что при стратегии ленивых вчи-слений не будут произведены линие действия. а самом деле так происходит только в случаях, когда анализ необходимости вычислений оказвается намного эффективнее самих откладываемых вычислений.
У параметризации по необходимости три цели:
• обеспечение вычислений с некорректно заданными параметрами в тех случаях, когда эти параметры фактически не будут использованы для вычислений;
• обеспечение того, что м используем наиболее ' све ее' значение параметра, доступное к тому моменту, когда он фактически ну ен для вычислений.
• повение эффективности вычислений.
ервая цель ка ется несколько искусственной, но на самом деле ее ваность иллюстрирует вычисление логических операторов в C, где фактически реализована подстановка по необходимости. Когда мы вычисляем A&&B в C, то вычисление B производится лишь после того, как вычислено A и получено значение true. Из-за этого, в частности, корректен следующий оператор (li x — интергральный логарифм x, который определен лишь при x > 0):
if (x>0&& li(x)>y) x+=epsilon; (8.2)
ператоры, подобные данному, часто применя тся для организации вычислений с одновременной проверкой корректности областей действия.
Вычисление логических операций в С поучительно сопоставить с их вычислением в Pascal, где стандарт языка, во-первых, предписывает совместность вычисления операндов (как для любых выражений — см. § 5.2), а во-вторых, разреает оптимизаци вычислений, т. е. прекраение их, когда истинность или ло ность вра ения вясняется до того, как все составля -щие выражения вычислены (есть прагматически устанавливаемый режим, в
8.5. ПАРАМЕТРИЗАЦИЯ
421
котором запреается подобная оптимизация). В результате транслятору разрешаются любые перестановки операндов логических выражений, сохраняющие их истинность или ложность, с тем, чтобы выбрать наиболее эффективный путь вычислений. Как следствие, пример, подобный (8.2) может оказаться некорректно вчислен в стандартном Pascal. рагматическая полезность такого употребления логических выра ений приводит к тому, что в большинстве систем программирования на языке Pascal принята стратегия их вычисления, в точности соответствующая тому, что предписано стандартом С/С++.
Красноречивй пример-иллстрация для второй цели параметризации по необходимости — распределенные вчисления. усть программа работает с данными, доступ к которым возможен лишь через сеть и которые непрерывно модифицируются другой программой. Предположим, что наша программа не изменяет данные, но принимает реение на основе их анализа. Это дает возможность оставить в стороне много трудных проблем, связанных с организацией совместного доступа к даннм. о нам вано проанализировать ту информацию, которая соответствует реальному состоянию дел. И поэтому параметр, соответствующий данным, хранящимся в другом месте сети, естественно передавать по необходимости, а не по значени .
Тот е пример иллстрирует и треть цель параметризации по необходимости. ля установления связи и последуей работы с удаленными данн -ми целесообразна передача по необходимости, поскольку, с одной сторон , установление связи — операция долгая, а с другой — не исключено, что ситуация сложится так, что без удаленных данных можно будет обойтись. Еще один пример, когда анализ наступления необходимости тривиален, демонстрируют логические операции: &&, || и др. (смотри анализ первой цели).
То, что два естественнх примера группиру т цели попарно, показвает. что три цели передачи по необходимости отлично согласованы друг с другом и концепция имеет право на суествование.
Рассмотрим, как соотносится механизм подстановки параметра по необходимости с другими механизмами параметризации.
ередача по необходимости моделирует входной параметр в том случае, когда вычисления, идущие после вызова процедуры до момента использования параметра не изменя т передаваемй процедуре фактический параметр. е следует в связи с этим искл чать предельной возмо ности, когда параметр, передаваемй по необходимости, придется передавать в момент вызова (т. е. как параметр-значение).
Предыдущая << 1 .. 142 143 144 145 146 147 < 148 > 149 150 151 152 153 154 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100