Что на самом деле означает, что они не имеют стека? Значит ли это, что они не используют стек вызовов?
Да, примерно так.
Если они не используют стек вызовов, что они используют?
Точная реализация, конечно, будет отличаться от языка к языку. В Stackless Python есть диспетчер, который запускает интерпретатор Python, используя самый верхний фрейм и его результаты. Интерпретатор обрабатывает коды операций по мере необходимости, пока не достигнет кода операции CALL_FUNCTION
- сигнала, который вы собираетесь ввести в функцию. Это заставляет диспетчера построить новый фрейм с соответствующей информацией и вернуться к диспетчеру с флагом размотки. Оттуда диспетчер начинает заново, указывая переводчику на самый верхний кадр.
Языки без стеков избегают стеков вызовов по ряду причин, но во многих случаях они используются, так что определенные программные конструкции становятся намного проще в реализации. Каноническим является продолжений . Продолжения - это очень мощные, очень простые структуры управления, которые могут представлять любую из обычных структур управления, с которыми вы, вероятно, уже знакомы (while
, do
, if
, switch
и т. Д.).
Если это сбивает с толку, вы можете попробовать обернуть голову вокруг статьи в Википедии, и в частности поучительной аналогии с продолжением сэндвича :
Скажем, вы на кухне перед холодильником и думаете о сэндвиче. Вы берете продолжение прямо там и суете его в карман. Затем вы достаете немного индейки и хлеба из холодильника и делаете себе бутерброд, который сейчас стоит на прилавке. Вы вызываете продолжение в своем кармане, и вы снова стоите перед холодильником, думая о бутерброде. Но, к счастью, на прилавке есть бутерброд, и все материалы, использованные для его приготовления, исчезли. Так ты ешь.