#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 в таблице символов?