Введение в программирование на Лиспе
773123a3

"Сборка мусора" - повторное распределение памяти


Самым интересным, можно сказать революционным, механизмом работы с памятью в Лиспе бесспорно явилась "сборка мусора". С начала 60-ых годов методам такой работы посвящены многочисленные исследования, продолжающиеся до наших дней и сильно активизировавшиеся в связи с включением похожего механизма в реализацию языка Java.

Общая идея всех таких методов достаточно проста:

  • пока памяти хватает, о ней можно не беспокоиться и располагать новые данные в новых блоках памяти,
  • если памяти вдруг не оказалось, то надо выполнить "сборку мусора", при которой можно найти блоки, ставшие бесполезными для программы,
  • если память нашлась, ее снова можно беззаботно тратить.

Специальная программа "сборка мусора" выполняет анализ достижимости всех блоков памяти просто пометкой узлов, видимых из конечного числа рабочих регистров системы программирования. К таким регистрам относятся промежуточные результаты вычислений, активная часть стека, ассоциативный список, таблица атомов и др. После пометки все непомеченные узлы объединяются в список свободной памяти, передающий их для повторного использования новым вызовам функции CONS. Такая автоматизация не лишена недостатков, но они обнаруживаются лишь в сравнительно сложных процессах, требования которых мы сейчас сознательно не рассматриваем.

Таблица 10.2. Clisp. Свойства атомов. Встроенные функции.

(Gensym )Создает новый уникальный атом
(Get Атом Индикатор)Выдает адрес свойства Атома, помеченного заданным Индикатором.
(Set Форма Данное )Устанавливает значение переменной, одноименной с атомом, полученным при вычислении Формы.
Setf
(Setq Атом Данное )Устанавливает значение Атома-переменной
Symbol-function
Symbol-plist
Symbol-value
Remprop
(Nconc Список … )Сцепляет списки без копирования, т.е. заменяя последний Nil очередного списка на указатель следующего списка.
(Rplaca Пара Объект )Заменяет левый элемент Пары на Объект.
(Rplacd Пара Объект )Заменяет правый элемент Пары на Объект.



Содержание раздела