Стиль передачи продолжения против агрессивно урезанного стека вызовов?

Я рассматриваю что-то вроде CPS для использования в качестве переводчика для актерского языка.

Аргументы функции передаются в массиве вариантов, а продолжение возвращается в том же массиве, поэтому простая функция

def add (x,y) => x + y

поэтому вызов из цикла read/eval/ будет

print( add(7, 5) )

будет на входе

[&add, x, y, &print, _, &repl, ...]

где _ - пустой слот, в который записывается возвращаемое значение функции.

На следующем этапе выполнения аргументы становятся

[&print, 12, &repl, ...]

затем

[repl, ...]

и так далее. Реализация в C в основном

for (;;)
   args = (args[0].function_pointer)(args);

с проверками на запуск конца массива args и выделением большего пространства.

Аргументы являются смежными, и "продолжение" как объект является лишь подмножеством аргументов.

Если бы я реализовал первоклассные продолжения, им нужно было бы клонировать массив аргументов; Вы также не получаете закрытие бесплатно. Основная цель - это то, что хорошо сочетается с простым генерированием машинного кода и позволяет приостановить и возобновить выполнение.

Хотя эта схема была вдохновлена ​​размышлениями о CPS, она не совсем CPS и очень похожа на то, как может выглядеть агрессивно урезанный стек C - только живые переменные и точки возврата для каждой функции.

Есть ли имя для этого стиля, и в частности массив аргументов? Это своего рода батуты + стек, хотя то, что я привык называть "стеком", - это скорее история, а не будущее выполнения.

1 ответ

Решение

Это почти далее. Наличие первоклассного стека во многом похоже на продолжение.

Другие вопросы по тегам