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

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

  • datastack
  • retainstack
  • стек вызовов
  • namestack
  • catchstack

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

1 ответ

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

  • хранилище данных: используется для обычного нажатия и извлечения значений. 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 может избежать этого.

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

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

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