Пишем программу на Паскале-автокоде:
Она компилируется и печатает 25 25, как и ожидается.
А теперь берём и делаем тело программы пустым. Программа перестаёт компилироваться:
Потому что для вызова формального параметра-подпрограммы порождается код, содержащий вызов служебной процедуры, а код этой служебной процедуры формируется, только когда компилятор видит передачу подпрограммы в качестве фактического параметра.
А если не видит, то и не беда, если будет ошибка при компиляции: нечего держать в коде неиспользуемые куски.
_program main; _function f(i:integer):integer; _(f := i + 5 _); _function g(i:integer):integer; _(f := i * 5 _); _procedure p(i:integer; _function q:integer); _( writeln(q(i)) _); _( p(20, f); p(5, g); _).
Она компилируется и печатает 25 25, как и ожидается.
А теперь берём и делаем тело программы пустым. Программа перестаёт компилироваться:
СИСТЕМА ПУЛЬТ 23.01.82
ПАСКАЛЬ-АВТОКОД 9.(17.05.88)
,К;А7:ВМ13=17СА77773,РА3=17ПИ13,17ПИ2=ВМ16,ВМ1=13ЗЧ2,17САА10=,15ПА31=ВИ15,СД42=13ЛС1,13ЗЧ1=15ПА12,ВИ15=17ЗЧ,17СА6=2ИА3,15ПА=ВИ15
,СМ15=СМ,17ЗЧ1=17СА77770,15ПА6=2ИА4,12ПА=16ПВВП7ОШИБКА
06
06
БЫЛИ ОШИБКИ В АВТОКОД ПРОГРАММЕ
Потому что для вызова формального параметра-подпрограммы порождается код, содержащий вызов служебной процедуры, а код этой служебной процедуры формируется, только когда компилятор видит передачу подпрограммы в качестве фактического параметра.
А если не видит, то и не беда, если будет ошибка при компиляции: нечего держать в коде неиспользуемые куски.