Может ли Forth-подобный язык быть реализован только с одним стеком?
Форт имеет стек и возвратный стек.
Насколько я понимаю, смысл стека возврата - хранить предыдущие значения счетчика программы.
Программы на C помещают предыдущее значение счетчика программ в стек и не используют стек возврата.
Нужен ли Forth только возвратный стек, потому что он возвращает результаты в стеке, и, таким образом, предыдущее значение счетчика программы может быть скрыто?
3 ответа
"Portable Assembly Language" должен быть близок. Это концепция компилятора для языка, который почти идентичен стандартному / традиционному Forth. Существуют некоторые ограничения для написания программ. Главным образом, вы должны избегать ситуаций, когда глубина стека не может быть определена статически.
Этот язык может быть скомпилирован так, что требуется только один стек.
http://www.complang.tuwien.ac.at/anton/euroforth/ef13/papers/ertl-paf.pdf
Предисловие: я написал расширения для аппаратных отладчиков, чтобы отследить некоторые проблемы с перепутанными стеками вызовов, поэтому я видел некоторые шестнадцатеричные дампы реальных C
стеки.
C
Стек состоит из смеси адресов возврата, локальных переменных и параметров функции. Для каждой функции вы можете узнать, где она ожидает какое значение, но это знание ограничивается областью действия функции.
Вы можете сделать это таким образом с forth
также, но это означает гигантские накладные расходы: вы можете поместить свои параметры в стек и вызвать функцию, поместив адрес возврата поверх того же стека. Нет проблем: каждая команда знает, что операнды являются вторыми и следуют в стеке. Но теперь команда хочет вызвать другую команду со следующими значениями: это делает необходимым изменить порядок стека, чтобы снова поместить значения сверху, так как вызываемая команда не может знать, где они похоронены в стеке, так как вы написал.
Более сложный forth
Компилятор может отслеживать, сколько значений принимает каждая команда, и сортировать стек перед каждым вызовом команды. Но какой ценой!
Конечно, C
программы тоже имеют эти издержки. Если вы видите не встроенные вызовы функций во встроенной сборке, всегда есть некоторые перестановки в регистре. Но хорошо forth
Программы состоят из крошечных функций, поэтому у вас намного больше вызовов функций и намного больше накладных расходов.
И без какой-либо выгоды, как в современной компьютерной архитектуре, каждый регистр может использоваться как указатель стека, так что вы можете иметь несколько стеков без каких-либо проблем.
Итак, наконец, ответ на ваш вопрос: да, вы можете реализовать производную одного стека forth
Но это боль без выгоды.
«Форт имеет стек и стек возвратов». Это справедливо для всех существующих и предшествующих стандартов Форта, для достандартных диалектов и даже для диалектов, подобных колорфорту, которые некоторые не решаются называть Фортом.
Итак, вы сами ответили на свой вопрос: решительное нет. Два стека занимают центральное место в модели программирования Forth. Программист имеет право манипулировать обоими.
Причина, конечно, в том, что вы сами обрабатываете данные, и обратный адрес будет мешать. Если вы настаиваете на сравнении его с C, C обрабатывает данные по имени и обрабатывает возврат. На самом деле C не имеет стека в своей модели программирования. Использование одного стека — это деталь реализации, о которой вам не следует беспокоиться.