Новосибирский Государственный Университет
Опубликован: 05.02.2007 | Доступ: свободный | Студентов: 2223 / 413 | Оценка: 4.30 / 4.23 | Длительность: 10:15:00
Лекция 10:

Свойства атомов и работа с памятью

< Лекция 9 || Лекция 10: 12 || Лекция 11 >
Аннотация: Теперь рассмотрим более подробно следующие механизмы эффективной работы со структурами данных в памяти. Рассмотрим списки свойств атома, работающие как встроенная база данных, организацию структуры данных в памяти и деструктивные, способные разрушить состояние памяти, операции над структурами данных, а также основной механизм повторного использования памяти - "Сборка мусора".

Списки свойств атомов

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

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

Согласно стандарту Common Lisp глобальные значения переменных и определения функций хранятся в фиксированных полях структуры атома. Они доступны с помощью специальных функций symbol-value и symbol-function соответственно. Полный список свойств можно получить функцией symbol-plist. Функция remprop в Clisp удаляет первое вхождение заданного индикатором свойства атома. Новое свойство атома можно ввести формой вида:

(setf (get Атом Индикатор ) Свойство)

Числа представляются в Лиспе как специальный тип атома без списка свойств. Атом такого типа состоит из указателя с тэгом, специфицирующим слово как число, тип числа (целые, дробные, вещественные), и адрес собственно числа, код которого может быть произвольной длины. В отличие от обычного атома одинаковые числа не совмещаются при хранении

Таблица 10.1. Функции для работы со списками свойств.
(get Атом Индикатор ) Дает адрес свойства атома, соответсвующее индикатору
(remprop атом индикатор) удаляет первое вхождение заданного индикатором свойства атома
(setf адрес свойство) Размещает новое значение свойства по заданному адресу
(symbol-function атом) Выдает определение функции
(symbol-plist атом) Список всех свойств атома
(symbol-value атом) глобальное значение переменной

Структура списков и памяти

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

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

Теперь можно дать правило представления S-выражений в машине. Представление атомов будет пояснено ниже.

Преимущества структур списков для хранения S -выражений в памяти:

  1. Размер и даже число выражений, с которыми программа будет иметь дело, можно не предсказывать. Кроме того, исключаются трудности размещения произвольных выражений в блоках памяти фиксированной длины.
  2. Ячейки можно переносить в список свободной памяти, как только исчезнет необходимость в них. Даже возврат одной ячейки в список свободной памяти имеет смысл. Но если бы выражения хранились линейно, то было бы труднее организовать использование лишнего или освободившегося пространства из разрозненных блоков ячеек.
  3. Выражения, являющиеся продолжением нескольких выражений, можно хранить только в одном экземпляре.

Для примера рассмотрим типичную двухуровневую структуру (A (B C)).

Она может быть построена из A, B и C с помощью

(cons 'A (cons (cons 'B(cons 'C NIL))NIL))

или, используя функцию list1List – функция произвольного числа аргументов, строящая список аргументов в порядке их перечисления. можно то же самое записать как

(list 'A (list 'B 'C))

Если дан список x из трех атомов x = (A B C), то аргументы A, B и C, используемые в предыдущем построении, можно найти как

A = (car x)
  B = (cadr x)
  C = (caddr x)

Исходную структуру из такого списка можно получить функцией grp, строящей (X (Y Z)) из списка вида (X Y Z).

(grp x)=(list(car x)(list(cadr x)(caddr x)))

Здесь grp применяется к списку X в предположении, что он заданного вида.

< Лекция 9 || Лекция 10: 12 || Лекция 11 >