438
ГЛАВА 8. ПОДПРОГРАММЫ
в результате выполнения процедуры, имеющей соответствующий выходной
параметр. Последнее — это пока что программистская экзотика, поскольку
процедурные типы являются типами более высокого порядка по сравнению
с типами обычных значений, а с ними связано очень много проблем, в том
числе и теоретических. Совмещенные параметры еще экзотичнее, хотя ситу-
ации, когда они были бы полезными, легко себе представить. Скажем, про-
цедура получает в качестве параметра некоторый алгоритм и в результате
своей работы порождает другой алгоритм, который заменяет исходный ва-
риант, например, на основании знания о конкретных условиях его работы.
Таким образом, если считать нормальным оперирование с типами высоко-
го порядка,
19
то процедурные параметры являются частным случаем ранее
рассмотренных назначений параметризации.
Когда нужно обеспечить возможность вызова алгоритмов-параметров по
ходу вычислений, можно было бы воспользоваться механизмом подстанов-
ки по имени. Это ближе всего к тому, что требуется. Но это слишком силь-
ное средство, т. к. для использования процедурного параметра не требуются
никакие окружающие его вычисления (вроде тех, что задаются реализацией
вызова по имени) и, соответственно, зависимость такого параметра от внеш-
него контекста минимальна. В реализационном плане самым приемлемым
вариантом процедур как входных параметров является передача ссылки на
фактический параметр-алгоритм, т. е. адреса передаваемой процедуры. По-
этому не случайно, что именно так задается процедурная параметризация в
языке
С/С++
, что не требует дополнительных механизмов, поскольку адрес
есть значение указательного типа, которым обладает соответствующий фор-
мальный параметр. Процедуры же как выходные параметры пока что не под-
держаны по сути современными системами программирования, и в лучшем
случае значением такого выходного параметра будет одна из фиксированно-
го конечного множества заранее описанных в программе процедур. Поэтому
и здесь решение
С/С++
достаточно на современном этапе.
20
19
Как в принципе и должно было бы быть, поскольку ввиду парадокса изобретателя умение
работать с сущностями высших порядков является единственным путем к снижению объема
программных систем для действительно сложных задач и, соответственно, единственным
путем к кардинальному повышению их надежности. Но на этом пути стоят, помимо чисто
технических, методологические и педагогические трудности: слишком мало людей оказы-
ваются подготовленными к восприятию сущностей высших порядков...
20
Если же процедуры станут полноправными значениями, то решение языка
C/C++
сразу
станет неудовлетворительным даже для входных параметров, поскольку ими тогда могли бы
быть процедурные выражения, составленные при помощи композиции и частичной параме-