Стиль передачи продолжения против агрессивно урезанного стека вызовов? - PullRequest
3 голосов
/ 06 февраля 2009

Я рассматриваю что-то вроде 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 Ответ

2 голосов
/ 04 декабря 2009

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

...