Ответ 1
Предположим, что у меня есть функция, которая создает связанный список некоторого размера. Размер - это параметр функции.
Вопрос: где мне нужно выделить память для списка? Я не могу выделить его в стеке функций, поскольку он недействителен после выхода из функции. И я не могу выделить его в стеке вызывающего, поскольку я не знаю, сколько памяти мне нужно выделить перед вызовом функции. Поэтому мне нужно выделить его в кучу.
Я думаю, что может быть RAII с использованием ручного управления кучей, но я не вижу, как вообще исключить выделение кучи.
Изменить
Я не могу вместить все свои мысли в комментарий, поэтому я пишу их здесь.
Нет никакой магии о языках размещения на основе стека. Вам все еще нужно знать, когда ваши данные актуальны, и удалять их, когда они не являются.
Представьте, что у вас есть отдельный стек, и ваша функция имеет контроль, чтобы вставлять и вставлять данные в него. Во-первых, автоматическое управление памятью больше нет, т.е. Функция завершается, но данные не освобождаются автоматически. Во-вторых, если вы используете выделение некоторой памяти, необходимой для поддержки, например. вычисление списка, тогда все это будет перетасовано списком, который вы хотите вернуть. Нет никаких шансов, что вы можете освободить неиспользуемую память (другие списки, деревья или около того), так как у вас есть только операции push и pop. Если у вас есть другие операции, то в чем разница с кучей?
Как насчет нескольких стеков, а не одного?
Вам нужно выделить их где-нибудь, управлять их ростом и иногда возвращать их. Эти стеки представляют собой отдельные конструкции, которыми вам нужно управлять руками. Нет автоматического управления памятью.
Языки на основе стека одобрены, но забудьте о огромном количестве алгоритмов, которые были изобретены с понятием "получить память откуда-то" и "вернуть память назад", например, хеш-карты, красно-черные деревья, связанные списки, Конечно, мы можем выделить все эти структуры в стеке, но мы не можем освобождать их части, если они больше не нужны.
Как насчет "тривиального" перевода лямбда-исчисления на машину Тьюринга?
Конечно, это тривиально, если ресурсы бесконечны. Математическая теория ничего не разъясняет в отношении сложности времени и памяти таких переведенных конструкций. Он просто утверждает, что обе модели эквивалентны, и все, что мы можем сказать с машиной Тьюринга, мы можем сказать с помощью лямбда-исчисления и наоборот. Нет гарантий, что он может работать с реальными ограничениями.