По принципу «разделяй и властвуй» мы должны разбить целое на кусочки и изолировать каждый кусочек, как только возможно. Но кусочки взаимодействуют, поэтому нужно контролировать связи (интерфейс) кусочков. Когда такой кусочек - процедура, ее интерфейс: 1)формальные параметры, 2)возвращаемое значение (для функции) и 3)обращение к внешним сущностям (переменным, константам ,типам, процедурам и пр).
Лучше всего с точки зрения контроля - формальные параметры, потому что они перечислены сразу в заголовке, там указан тип, по ссылке\значению, IN\OUT. Их имена локальны в этой процедуре, поэтому назвать их можно как угодно.
Тип возвращаемого значения тоже задается. В Обероне 7 значение возвращается только в конце – это тоже направлено на больший контроль за связями. RETURN, прекращающий действие процедуры, это «родственник» GOTO. Если нам понадобиться что-то дополнительно сделать перед выходом, придется найти все RETURN во всей процедуре. А в Обероне 7 такой RETURN только один, поэтому нет проблем поставить дополнительные действия перед ним.
А вот с внешними идентификаторами контроль связей наименьший. Называются они так, как они там называются внешне, и это не изменить. Обращаться к ним можно откуда угодно, и единого списка зависимостей нет.
Если забыть объявить идентификатор, то он понимается как внешний, находящийся в ближайшей охватывающей области. Охватывающая область определяется текстуально, а не порядком вызова процедур. В PHP, например, наоборот: глобальные переменные требуется объявить в списке global, а локальные объявлять не требуется.
Кроме того, есть технические сложности с обращением к локальным переменным (или параметрам) внешней процедуры. Ведь они находятся в стеке, поэтому не имеют определенного адреса, в отличие от глобальных переменных модуля. Поэтому требуется специальный механизм фреймов для поиска их местонахождения.
В описании Оберон-07 «The Programming Language Oberon Revision 1.10.2013 / 1.5.2016» в разделе 10 сказано: «In addition to its formal parameters and locally declared objects, the objects declared globally are also visible in the procedure.». В русском переводе от 1.11.2008
https://forum.oberoncore.ru/viewtopic.php?f=115&t=3026 вместо «declared globally» написано «объявленные в окружении процедуры». А что значит «declared globally»? Глобально на самом верхнем уровне (уровне модуля) или «на любом внешнем, охватывающем процедуру»? Вполне возможно, что Вирт хотел открыть доступ изнутри процедуры только к глобальным идентификаторам, чтобы не использовать сложный механизм фреймов.