Я создаю интерпретированный язык программирования и хочу поддерживать вызовы функций.
Я попытался реализовать это следующим образом.Когда интерпретатор встречает объявление функции:
- , отправьте его в среду.
- вызов функции, получите объявление функции в среде и выполните его тело.
Я не решался использовать этот подход, потому что он не линейный и, похоже, использует слишком много ресурсов.
В скомпилированных языках программирования метки и goto используются для реализации функций вызова.Он линейный и хранит только ссылку на тело функции.
Например, этот код C будет генерировать этот код сборки:
код C:
int sum (int x, int y) {
return x + y;
}
sum(2, 3);
код сборки:
sum:
push ebp
mov ebp, esp
mov eax, [ebp + 8]
mov edx, [ebp + 12]
add eax, edx
pop ebp
ret
push 3
push 2
call sum
add esp, 8
Я хотел бы реализовать подход, который напоминает подход, используемый в скомпилированных языках программирования.