Процедурные параметры в программировании: история и применение
Procedural parameter
Процедурные параметры в программировании: передача функций как аргументов. Мощный инструмент для модификации кода библиотек без изменений в них. Pascal, C.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
В вычислительной технике процедурный параметр — это параметр процедуры, который сам является процедурой. Эта концепция — чрезвычайно мощный и универсальный инструмент программирования, поскольку она позволяет программистам изменять определенные шаги процедуры библиотеки произвольно сложными способами, не прибегая к пониманию или изменению кода этой процедуры. Этот инструмент особенно эффективен и удобен в языках, поддерживающих определения локальных функций, таких как Pascal и современный диалект GNU C. Он становится еще более полезным при наличии замыканий функций. Аналогичную функциональность (и даже больше) предоставляют объекты в объектно-ориентированных языках программирования, но с существенно большими затратами. Процедурные параметры в некоторой степени связаны с понятиями функций первого класса и анонимных функций, но отличаются от них. Эти два понятия больше относятся к способам определения функций, чем к способам их использования.
In computing, a procedural parameter is a parameter of a procedure that is itself a procedure. This concept is an extremely powerful and versatile programming tool, because it allows programmers to modify certain steps of a library procedure in arbitrarily complicated ways, without having to understand or modify the code of that procedure. This tool is particularly effective and convenient in languages that support local function definitions, such as Pascal and the modern GNU dialect of C. It is even more so when function closures are available. The same functionality (and more) is provided by objects in object oriented programming languages, but at a significantly higher cost. Procedural parameters are somewhat related to the concepts of first class function and anonymous function, but is distinct from them. These two concepts have more to do with how functions are defined, rather than how they are used.
Область действия
В языках, допускающих процедурные параметры, правила области видимости обычно определяются таким образом, что процедурные параметры выполняются в своей исходной области видимости. Более точно, предположим, что функция actf передается в качестве аргумента P, в качестве ее процедурного параметра f, и затем f вызывается изнутри тела P. Во время выполнения actf она видит окружение, в котором была определена. Реализация этих правил области видимости не является тривиальной задачей. К моменту фактического выполнения actf записи активации, содержащие ее переменные окружения, могут находиться на произвольной глубине стека. Это так называемая проблема передачи аргумента функции вниз по стеку.
In languages that allow procedural parameters, the scoping rules are usually defined in such a way that procedural parameters are executed in their native scope. More precisely, suppose that the function actf is passed as argument to P, as its procedural parameter f; and f is then called from inside the body of P. While actf is being executed, it sees the environment of its definition. The implementation of these scoping rules is not trivial. By the time that actf is finally executed, the activation records where its environment variables live may be arbitrarily deep in the stack. This is the so called downwards funarg problem.
История
Процедурные параметры были изобретены до появления электронных компьютеров математиком Алонзо Черчем в рамках его модели вычислений лямбда-исчисления. Как особенность языка программирования, процедурные параметры были введены в ALGOL 60. Фактически, ALGOL 60 обладал мощным механизмом передачи параметров "по имени", который мог упростить некоторые способы использования процедурных параметров; см. Устройство Дженсена. Процедурные параметры являлись важной особенностью языка программирования LISP, который также ввел понятие замыкания функции или funarg. Язык программирования C позволяет передавать указатели на функции в качестве параметров, что позволяет достичь того же результата и часто используется в качестве обратных вызовов в событийном программировании и в качестве обработчиков ошибок. Однако лишь немногие современные компиляторы C поддерживают вложенные определения функций, поэтому другие варианты их использования относительно редки. Процедурные параметры также были реализованы в Паскале вместе с определениями вложенных процедур; однако, поскольку стандартный Паскаль не поддерживал раздельное компилирование, эта возможность также мало использовалась в этом языке.
Procedural parameters were invented before the age of electronic computers, by mathematician Alonzo Church, as part of his lambda calculus model of computation. Procedural parameters as a programming language feature were introduced by ALGOL 60. In fact, ALGOL 60 had a powerful "call by name" parameter passing mechanism that could simplify some uses of procedural parameters; see Jensen's Device. Procedural parameters were an essential feature of the LISP programming language, which also introduced the concept of function closure or funarg. The C programming language allows function pointers to be passed as parameters, which accomplish the same end, and are often used as callbacks in event driven programming and as error handlers. However, only a few modern C compilers allow nested function definitions, so that its other uses are relatively uncommon. Procedural parameters were provided also in Pascal, together with nested procedure definitions; however, since standard Pascal did not allow separate compilation, the feature was little used in that language, too.