Как реализовать вызовы функций на интерпретируемых языках программирования?

#programming-languages

#программирование-языки

Вопрос:

Я создаю интерпретируемый язык программирования, и я хочу поддерживать вызовы функций.

Я попытался реализовать это следующим образом. Когда интерпретатор сталкивается с:

  • объявление функции, передайте ее в среду.
  • вызов функции, получение объявления функции в среде и выполнение ее тела.

Я не решался использовать этот подход, потому что он не линейный и, похоже, использует слишком много ресурсов.

В скомпилированных языках программирования метки и 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
 

Я хотел бы реализовать подход, который напоминает подход, используемый скомпилированными языками программирования.

Комментарии:

1. Как вы справляетесь с этим в целом? Преобразуется ли текст программы, введенный пользователем, в какую-либо внутреннюю форму для хранения? Независимо от того, сохраняете ли вы необработанный текст программы или какую-либо более удобную внутреннюю форму, вы должны где-то его хранить. (Я не знаю, что вы подразумеваете под «переносом в среду»). Во время вызова вы назначаете фактические параметры и начинаете интерпретировать сохраненное тело функции.

2. Возможно, вы объединяете «интерпретируемые» и «интерактивные»? Под последним я подразумеваю, что операторы выполняются сразу после их ввода. Это не является неизменной особенностью интерпретируемого языка.

3. Когда я говорю «отправить его в среду», я имею в виду сохранить все тело объявления функции, созданное анализатором, в таблице символов, где хранятся переменные.

4. Хорошо, итак, где-то хранится некоторое представление кода функции. В чем сложность заставить его выполняться в нужное время?

5. Можно ли хранить узел AST в таблице символов?