Кіріспе

Есептеуде процедуралық параметр – өзі процедура болатын процедураның параметрі. Бұл түсінік өте қуатты және әмбебап бағдарламалау құралы болып табылады, себебі ол бағдарламашыларға кітапхана процедурасының белгілі бір қадамдарын кез келген күрделілікте өзгертуге мүмкіндік береді, осы процедураның кодын түсінуге немесе өзгертуге қажеттілік туындамайды. Бұл құрал, әсіресе, жергілікті функцияларды анықтауды қолдайтын тілдерде, мысалы, Паскаль және қазіргі GNU диалектісі C тілінде тиімді және ыңғайлы. Функциялық жабылулар (function closures) қолжетімді болғанда бұл мүмкіндік одан да артады. Объектіге бағытталған бағдарламалау тілдеріндегі объектілер де осыған ұқсас функционалдықты (және одан да көпті) ұсынады, бірақ бұл айтарлықтай қымбатқа түседі. Процедуралық параметрлер бірінші дәрежелі функция (first-class function) және анонимді функция түсініктерімен байланысты, бірақ олардан ерекшеленеді. Бұл екі түсінік функциялардың қалай анықталуымен, емес, қалай қолданылуымен байланысты.

Шаралық

Процедуралық параметрлерге рұқсат ететін тілдерде, көбінесе процедуралық параметрлер олардың туған аймағында орындалатындай етіп анықталады. Нақтырақ айтқанда, егер actf функциясы P-ге аргумент ретінде, оның процедуралық параметрі f ретінде жіберілсе; және f P функциясының ішінде шақырылса, actf орындалып жатқанда, ол өзінің анықталған ортасын көреді. Мұндай аймақтарды іске асыру оңай емес. actf толық орындалған кезде, оның орта айнымалылары сақталатын белсенді жазбалар стекте кез келген деңгейде болуы мүмкін. Бұл "төменге қарайғы аргумент" мәселесі деп аталады.

Тарих

Процедуралық параметрлер электронды компьютерлер пайда болғанға дейін математик Алонзо Черч өзінің лямбда-есептеу моделінің бір бөлігі ретінде ойлап тапқан. Процедуралық параметрлер бағдарламалау тілінің мүмкіндігі ретінде ALGOL 60 тілінде енгізілді. Шындығында, ALGOL 60 тілінде процедуралық параметрлерді қолдануды жеңілдете алатын "атымен шақыру" параметрін беру механизмі болды; Дженсеннің құрылғысына қараңыз. Процедуралық параметрлер LISP бағдарламалау тілінің маңызды ерекшелігі болды, ол функциялық жабу немесе funarg тұжырымын да енгізді. C бағдарламалау тілі функциялық көрсеткіштерді параметрлер ретінде беруге мүмкіндік береді, бұл соған ұқсас мақсатқа жетеді және көбінесе оқиға басқарылатын бағдарламалауда кері шақыру ретінде және қателерді өңдеуге пайдаланылады. Дегенмен, қазіргі заманғы C компиляторларының көпшілігі ішкі функциялардың анықтамаларын қолдауға мүмкіндік бермейді, сондықтан оның басқа қолданылуы салыстырмалы түрде аз. Процедуралық параметрлер Pascal тілінде де ұсынылды, сонымен қатар ішкі процедуралардың анықтамаларымен бірге; алайда, стандартты Pascal жеке компиляцияға рұқсат бермегендіктен, бұл мүмкіндік сол тілде де аз қолданылды.