Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Conspekt.doc
Скачиваний:
11
Добавлен:
31.08.2019
Размер:
1.39 Mб
Скачать

3.12 Программная реализация лисп - машин

Основное назначение Лисп-машины - интерпретировать s-выражение, подаваемое на ее вход. Любая Лисп-машина реализует три функции, которые выполняются циклически:

  • READ – чтение s-выражения,

  • EVAL – вычисление s-выражения,

  • PRINT – печать значения s-выражения.

Функционирование Лисп-машины можно представить в виде следующей структурной схемы.

Поведение Лисп-машины можно описать с помощью следующих

Команд на языке Лисп:

(PRINT '>>) приглашение – читаем s-выражение

(SETQ E (READ))

(SETQ V (EVAL E)) вычисляем E и значение связываем

с переменной V

(PRINT V) печать значения

зацикливание

Центральной функцией является функция EVAL, в основу функции EVAL положены следующие правила:

1.Если входное s-выражение-это число или один из атомов, со значением T или NIL, то функция EVAL не вычисляет такое s-выражение и возвращает результат без изменений, т.к. это значение совпадает с именем атома.

2.Если входное s-выражение - литеральный атом, то функция возвращает последнее значение этого атома, известное системе.

3.Если входное s-выражение- список, то функция пытается интерпретировать его следующим образом:

(f arg1 arg2 ... argn), где f- функция, если ее имя будет найдено в списке функций Лисп-машины, то далее будет предпринята попытка оценить значения аргументов по этим же правилам, которые записаны.

Если имени функции нет в списке, то выдается сообщение: "Неопределенное имя функции".

Если аргументы не соответствуют хотя бы одному из правил, то сообщение: "Аргумент не найден".

Лисп-машина решает также две важные дополнительные задачи:

1.управление памятью

2."сборка мусора".

Рассмотрим первую задачу управления памятью. Пусть переменные X и Z получат значение в результате выполнения функций

(SETQ X '(S M I T ))

(SETQ Z (APPEND (CDDR '(S M I T)) X)  (I T S M I T)

Тогда в памяти с переменными будет звязана следующая структура данных:

X

S M I T

Z

I T

По идее, под X и под Z должно отводиться в общей сложности 10 ячеек. На самом деле под Х и под Z отведено всего 6 лисповских ячеек. Данная работа выполняется специальным компонентом ЛИСП системы, оптимизацирующем структуры данных в памяти.

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

(SETQ L '((ЭТО СТАНЕТ МУСОРОМ) CDR ЧАСТЬ))

(SETQ L (CDR L)) -> (CDR ЧАСТЬ)

Указанному фрагменту программы в памяти будет соответствовать следующая структура данных:

L

L

CDR

ЧАСТЬ

ЭТО

СТАНЕТ

МУСОРОМ

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

Имеется специальная программа garbage collector – сборщик мусора, которая обнаруживает ячейки без ссылок и помечает их как свободные.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]