Введение

В вычислительной технике процедурный параметр — это параметр процедуры, который сам является процедурой. Эта концепция — чрезвычайно мощный и универсальный инструмент программирования, поскольку она позволяет программистам изменять определенные шаги процедуры библиотеки произвольно сложными способами, не прибегая к пониманию или изменению кода этой процедуры. Этот инструмент особенно эффективен и удобен в языках, поддерживающих определения локальных функций, таких как Pascal и современный диалект GNU C. Он становится еще более полезным при наличии замыканий функций. Аналогичную функциональность (и даже больше) предоставляют объекты в объектно-ориентированных языках программирования, но с существенно большими затратами. Процедурные параметры в некоторой степени связаны с понятиями функций первого класса и анонимных функций, но отличаются от них. Эти два понятия больше относятся к способам определения функций, чем к способам их использования.

Область действия

В языках, допускающих процедурные параметры, правила области видимости обычно определяются таким образом, что процедурные параметры выполняются в своей исходной области видимости. Более точно, предположим, что функция actf передается в качестве аргумента P, в качестве ее процедурного параметра f, и затем f вызывается изнутри тела P. Во время выполнения actf она видит окружение, в котором была определена. Реализация этих правил области видимости не является тривиальной задачей. К моменту фактического выполнения actf записи активации, содержащие ее переменные окружения, могут находиться на произвольной глубине стека. Это так называемая проблема передачи аргумента функции вниз по стеку.

История

Процедурные параметры были изобретены до появления электронных компьютеров математиком Алонзо Черчем в рамках его модели вычислений лямбда-исчисления. Как особенность языка программирования, процедурные параметры были введены в ALGOL 60. Фактически, ALGOL 60 обладал мощным механизмом передачи параметров "по имени", который мог упростить некоторые способы использования процедурных параметров; см. Устройство Дженсена. Процедурные параметры являлись важной особенностью языка программирования LISP, который также ввел понятие замыкания функции или funarg. Язык программирования C позволяет передавать указатели на функции в качестве параметров, что позволяет достичь того же результата и часто используется в качестве обратных вызовов в событийном программировании и в качестве обработчиков ошибок. Однако лишь немногие современные компиляторы C поддерживают вложенные определения функций, поэтому другие варианты их использования относительно редки. Процедурные параметры также были реализованы в Паскале вместе с определениями вложенных процедур; однако, поскольку стандартный Паскаль не поддерживал раздельное компилирование, эта возможность также мало использовалась в этом языке.