Нужна ли специальная обработка обработки рекурсии при разработке компилятора? - PullRequest
2 голосов
/ 08 сентября 2011

Вызовы функций обрабатываются через структуру данных стека. Этого достаточно для поддержки рекурсии?

1 Ответ

5 голосов
/ 08 сентября 2011

Наличие стека на всех равно особая обработка, которую должен иметь компилятор при поддержке рекурсии.

В более старых языках программирования, таких как ранние версии FORTRAN, среда выполнения не имеластек функций и каждая функция имела ровно одну запись активации, зарезервированную для нее где-то в памяти.Это означало, что рекурсия вообще невозможна, потому что если вы рекурсивно вызываете функцию, вы перезаписываете ее единственную запись активации, теряя при этом контекст того, как вы туда попали.

Введение функцииСтек - это то, что первая рекурсия позволила фактически выразить на языке программирования.До этого программисты использовали рекурсию как инструмент для абстрактного решения проблемы, но затем должны были бы преобразовать этот код в итеративную логику из-за отсутствия стека вызовов.

Для того, чтобы язык программированияДля поддержки рекурсии необходим механизм динамического обслуживания стека вызовов.Это не должно быть через явный стек;теоретически вы можете динамически распределить все кадры стека и связать их вместе в виде связанного списка.Это может быть полезно, например, если вы хотите поддерживать сопрограммы или замыкания и вам действительно нужно сохранить старые записи активации после возврата функции, чтобы данные могли быть сохранены позже.

Надеюсь, это поможет!

...