Зачем нужна сборка мусора (GC) на языке стеков? Есть ли необходимость в сборке мусора на таких языках, как Forth или RPL (на калькуляторах HP )?
Я бы подумал, поскольку вывод выводится из стека, в этом не будет необходимости. Я что-то пропустил?
Зачем нужна сборка мусора (GC) на языке стеков? Есть ли необходимость в сборке мусора на таких языках, как Forth или RPL (на калькуляторах HP )?
Я бы подумал, поскольку вывод выводится из стека, в этом не будет необходимости. Я что-то пропустил?
Ответы:
GC обычно применяется к памяти, выделенной в куче. Я не знаком с Forth или RPL, но если нет кучи, и вместо этого все хранится в глобальном стеке, то GC ничего не может сделать.
Да, ты прав. Но основанность стека - это только часть всей истории. Например, интерпретатор байт-кода Java также основан на стеке (скомпилированный код работает - по соображениям эффективности - по-другому). Это говорит нам о том, что любой язык может быть преобразован в язык стека.
Важны объекты вне стека, те, кто может пережить текущее выполнение метода. Пока в языке нет ничего похожего malloc
или new
нет, таких объектов нет и вам не нужен delete
ни GC.
Язык, которому не хватает динамического выделения памяти, весьма ограничен в своей полезности.
Сборка мусора требуется, если язык будет поддерживать динамические структуры данных по своей природе. Это почти необходимо, если вы хотите сделать что-то выше уровня C. Без этого вы застряли только с фиксированными структурами данных и управляете памятью самостоятельно. Это то, что делает оригинальный Forth, конечно, но это, вероятно, не то, что вы хотели бы сделать сегодня, если только вы не делаете низкоуровневое системное кодирование.
Сборка мусора не требуется, если язык использует статическое распределение вместо размещения в стеке. Например, Fortran 77 с опцией -s (статическое хранилище) выделяет всю память при запуске программы, поэтому во время выполнения не происходит выделения памяти для освобождения. Хотя это требует некоторой дисциплины, возможно написание программ, особенно симуляций, для использования статического распределения памяти. Статическое распределение устраняет любые утечки памяти и приводит к потрясающей производительности кеша, поскольку компилятор может использовать статический анализ, чтобы определить, что загружать в кеш.