стек вызовов?retainstack?namestack? - PullRequest
       23

стек вызовов?retainstack?namestack?

6 голосов
/ 20 февраля 2012

На этой странице руководства Фактора говорится о следующих типах стеков, которые хранятся в продолжениях:

  • datastack
  • retainstack
  • 1010 * CallStack *
  • namestack
  • catchstack

Что именно эти стеки содержат? Три самых запутанных для меня - это стеки вызовов, стеки удержания и стеки имен.

1 Ответ

8 голосов
/ 06 июля 2012

Я, конечно, не фактор гуру, но поскольку их имена, кажется, подразумевают их использование:

  • набор данных : используется для обычного нажатия и извлечения значений,3 4 + использует набор данных, чтобы нажать «3», а затем «4».Выполнение «+» выводит 2 значения из набора данных и возвращает ответ 5 обратно в набор данных.При запуске интерактивного сеанса фактора (по крайней мере, в Linux) содержимое этого стека печатается после каждого взаимодействия:

    $> 1
    --- Data stack:
    1
    $> 2
    --- Data stack:
    1
    2
    $> +
    --- Data stack:
    3
    $> .
    3
    $>
    
  • callstack : используется для хранения слови их индивидуальный прогресс, в то время как их составляющие слова выполняются.Представьте, что вы определили лучший вариант суммы: : sum' ( seq-of-int -- summmation ) 0 [ + ] reduce 20 + ; (это лучше, потому что вы получаете дополнительные 20 бесплатно!).Желая повторно использовать код, вы использовали слово reduce со стандартным коэффициентом.Пока среда выполнения выполняет sum', она вызывает реализацию reduce.Но, так как нам все еще нужно добавить дополнительные 20, кто-то должен записать, где запускаться снова, когда вернется reduce.Эти заметки хранятся в стеке вызовов, скорее всего, с некоторыми вспомогательными данными во время выполнения отладки, чтобы помочь отладчикам понять, что происходит.

  • retainstack : используется для сохранения значенийна своего рода вспомогательный набор данных.В Forth можно использовать стек возвратов (аналог Forth для стека вызовов), чтобы действовать в качестве ретейста.Одна из проблем, связанных с этим подходом, заключается в том, что если вы вернетесь к своему слову, не очистив свой грязный хак, вы будете прыгать в неправильные места и наносить общий ущерб.Среда выполнения Forth увидит ваши значения, ожидая, что они будут хорошими примечаниями, которые он делает при вызове слова, и запутывается.Используя отдельный стек для адресов возврата, Factor может избежать этого.

  • стек имен : используется для хранения данных, необходимых для реализации динамических переменных ,Используя стек, вы можете скрыть старые имена с новыми при выполнении подпрограммы, а затем извлечь привязку, и старые имена будут восстановлены.

  • catchstack : использованоподдерживать обработку исключений.Используя стек, подпрограммы могут регистрировать свои собственные специальные обработчики для исключений и теневого поведения по умолчанию.Затем, когда слово вернется, старые обработчики можно будет легко восстановить, извлекая их из стека.

...