Основные причины, почему среды выполнения языка программирования используют стеки? - PullRequest
3 голосов
/ 16 января 2011

Многие среды выполнения языков программирования используют стеки в качестве своей основной структуры хранения (например, см. Байт-код JVM для примера выполнения ).

Быстро вспоминая я вижу следующие преимущества:

  • Простая структура (pop / push), тривиальная реализация
  • Большинство процессоров в любом случае оптимизированы для операций со стеком, поэтому это очень быстро
  • Меньше проблем с фрагментацией памяти, это всегда перемещение указателя памяти вверх и вниз для выделения и освобождения полных блоков памяти путем сброса указателя на последнее смещение записи.

Список заполнен или я что-то упустил? Существуют ли среды исполнения языка программирования, которые вообще не используют стеки для хранения?

Ответы [ 4 ]

3 голосов
/ 16 января 2011

Просто решил включить ссылку на одного из самых проницательных разработчиков (и активных), архитектора горячей точки JVM:

Когда вы сравниваете скорость и мощность процессора, выполняющего байт-коды,вы увидите множество аппаратных сложностей вокруг основных проблем с исполнением (я пропускаю множество очевидных примеров, но вот один: макет стека отстой для широкой проблемы из-за прямых зависимостей стека).

http://www.azulsystems.com/blog/cliff-click/2010-04-21-un-bear-able

1 голос
/ 16 января 2011

Да, есть среды выполнения, в которых не используются стеки, или, по крайней мере, не наивная модель с одним стеком и инструкциями по загрузке / извлечению процессора. Более новые языки, разработанные для параллелизма / многопоточности, обычно избегают модели с одним стеком. Язык Go является примером.

Одна проблема с "аппаратным стеком" заключается в том, что обработка ошибок может быть сложной, когда стек переполняется (обработчику, возможно, придется использовать пространство стека). Явное ведение стека в куче, как, возможно, связанный список, позволяет избежать этой проблемы, хотя это означает, что переполнение стека сводится к переполнению кучи, а бесконечная рекурсия требует больше времени для обнаружения.

0 голосов
/ 16 января 2011

Стек также используется для передачи параметров между методами. Обычно параметры помещаются в стек вызывающим абонентом, а затем вызываемый будет знать, где находятся параметры в стеке (смещение -ve от текущего указателя стека).

0 голосов
/ 16 января 2011

Поскольку методы могут вызывать другие методы, которые могут вызывать другие и т. Д., И хранилище для каждого должно поддерживаться до тех пор, пока вызываемый метод не вернется, использование стекового фрейма для хранения хранилища является очевидным решением.

...