Компиляция функциональных программ (SECD-машина).
Чем больше возможностей включено в язык (базовых функций, управляющих конструкций, способов вычисления аргументов функции) мы будем включать в язык, тем более сложным будет интерпретатор и сложнее его переделка. Обычно программа на языке LISP или scheme преобразуется в программу на языке гораздо более низкого уровня, похожем на машинный язык, который может выполняться с гораздо большей скоростью.
SECD-машина для интерпретации LISP-программа получила свое название по начальным буквам ее регистров. Каждый из регистров содержит указатель на S-выражение.
Регистр |
Назначение |
|
S |
Stack |
Стек для размещения промежуточных результатов во время вычисления выражения |
E |
Environment |
Служит для хранения значений, связываемых с переменными во время вычисления, соответствует списку значений v в интерпретаторе |
C |
Control list |
Указатель на выполняемую команду программы |
D |
Dump |
Стек для хранения других регистров при вызове новой функции |
Для ускорения доступа к значениям переменных вместо последовательного поиска в контексте используются индексные пары (j, j), где I- номер списка, j-номер элемента в списке.
В функциональном языке программист не заботится о размещении новых объектов в памяти и удалении их после того, как объект перестанет быть необходимым. Поэтому очень важной является сборка мусора, которая запускается каждый раз при нехватке памяти для дальнейшей работы функциональной программы. Для SECD-машины сборка мусора состоит в том, что все ячейки памяти, к которым нет прямых или косвенных ссылок из регистров, переводятся в список свободных ячеек памяти.