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