5.3.1. Вложенные процедуры со статическими ссылками

Самый простой способ предоставить вложенной процедуре доступ к локальным переменным, объявленным во внешней процедуре, - просто передать ей вместе с па­раметрами адрес активизационной записи, содержащей эти переменные (см. рис. 17).

При этом, если процедура вызывает вложенную в себя процедуру, она просто передает ей свой ВР, например так:

push bp

call nested_proc

То есть статическая и динамическая ссылки в активизационной записи проце­дуры в этом случае не различаются. Если процедура вызывает дру­гую процедуру на том же уровне вложенности, она должна передать ей адрес

активизационной записи из общего предка:

push   ' [bp+4] call peer_proc

Если же процедура вызывает процедуру значительно меньшего уровня вло­женности, так же как если процедура хочет получить доступ к переменным, объявленным в процедуре меньшего уровня вложенности, она должна проследо­вать по цепочке статических ссылок наверх, вплоть до требуемого уровня. То есть, если процедура на уровне вложенности 5 должна вызвать процедуру на уровне вложенности 2, она должна поместить в стек адрес активизационной записи внеш­ней по отношению к ним обоим процедуры с уровня вложенности 1:

mov mov mov

push

call bx,[bp+4]

bx,ss:[bx+4]

bx,ss:[bp+4]

ss:[bx+4] proc_at_level2

Адрес Адрес Адрес Адрес записи уровня записи уровня записи уровня записи уровня

ВХ.

ВХ. ■

ВХ. стек.

Метод реализации вложенных процедур имеет как преимущества, так и недо­статки. С одной стороны, вся реализация вложенности сводится к тому, что в стек помещается всего одно дополнительное число, а с другой стороны - обращение к переменным, объявленным на низких уровнях вложенности (а большинство программистов определяет все глобальные переменные на уровне вложенности 0), так же как и вызов процедур, объявленных на низких уровнях вложенности, ока­зывается достаточно медленным. Многие реализации языков программирования, использующих статические помещают переменные, определяемые на

уровне 0, не в стек, а в сегмент данных, но тем не менее существует способ, откры­вающий быстрый доступ к локальным переменным с любых уровней.