Те, кто знаком с программированием сборки x86, очень привыкли к типичной функции пролог/эпилог:
push ebp
mov esp, ebp
sub esp, [size of local variables]
...
mov esp, ebp
pop ebp
ret
Эта же последовательность кода также может быть реализована с помощью инструкций ENTER
и LEAVE
:
enter [size of local variables], 0
...
leave
ret
Второй операнд ENTER
инструкции - это уровень вложенности, который позволяет получить доступ к нескольким родительским кадрам из вызываемой функции.
Это не используется в C, потому что нет вложенных функций; локальные переменные имеют только область действия функции, в которой они объявлены. Эта конструкция не существует (хотя иногда мне это хотелось):
void func_a(void)
{
int a1 = 7;
void func_b(void)
{
printf("a1 = %d\n", a1); /* a1 inherited from func_a() */
}
func_b();
}
Однако у Python есть вложенные функции, которые ведут себя следующим образом:
def func_a():
a1 = 7
def func_b():
print 'a1 = %d' % a1 # a1 inherited from func_a()
func_b()
Конечно, код Python не переводится непосредственно на машинный код x86 и, следовательно, не сможет (вряд ли?) воспользоваться этой инструкцией.
Существуют ли какие-либо языки, которые компилируются на x86 и предоставляют вложенные функции? Существуют ли компиляторы, которые будут генерировать инструкцию ENTER
с ненулевым вторым операндом?
Intel инвестировала ненулевое количество времени/денег в этот операнд уровня вложенности, и в основном мне просто интересно, если кто-нибудь его использует: -)
Литература: