Пример программы Algol, которая не делает ничего полезного, но здесь для иллюстрации смысла:
begin
int x; x:=3;
procedure p;
begin
integer y; y:=4;
procedure q(n);
value n; integer n;
if n > 0
then q(n-1)
else begin
integer z; z:=x+y;
print(z)
end;
q(1)
end;
p; comment a parameterless procedure call;
end;
Основная проблема здесь - это вложенные области видимости.Процедура q
зависит от окружающих блоков, которые определяют целые числа x
и y
.Процедура p
также зависит (в силу содержания q
) от блока, который определяет x
.
Итак, вы увидите, что каждая часть этой глупой программы-примера неотделима отокружающий текст.Это естественный способ выражения для Алголеров;вкладывать процедуры так, чтобы это имело смысл для написанной программы.В целом это делает отдельную компиляцию довольно сложной.Это отличается от C-подобных языков, которые не имеют вложенных процедур (функций и т. Д.), Потому что единственные нелокальные идентификаторы, на которые они могут ссылаться, это область файла или глобальная область (если я правильно понимаю эти термины).
Здесьпеременные x
и y
являются локальными для некоторой процедуры и поэтому находятся в стеке.Просто чтобы сделать его более сложным, q
является рекурсивным, что делает «расстояние вниз по стеку» от его самого внутреннего вызова до местоположений x
и y
переменной величиной, так что это не просто вопрос компиляциификсированное значение в некотором указателе стекового фрейма.
Тем не менее, были некоторые системы, которые допускали отдельную компиляцию.Насколько я помню, были ограничения, такие как единица компиляции (если хотите, файл), которая должна содержать только процедуры «на верхнем уровне».Возможно, им также понадобился некоторый расширенный синтаксис (например, «внешняя процедура foo»), чтобы сообщить компилятору, что в текущем файле не должно быть определено что-то, на что ссылаются.