Опубликован: 19.03.2004 | Уровень: специалист | Доступ: платный
Лекция 7:

Детализация базовых функций

< Лекция 6 || Лекция 7: 123 || Лекция 8 >
Аннотация: Рассматривается функциональный подход к низкоуровневому программированию на уровне ассемблера, использованный при реализации Лисп. Изучается понятие абстрактной машины (secd) для определения операционной семантики языка функционального программирования по Венской методике, а именно для отображения абстрактного синтаксиса языка на язык абстрактной машины. Анализируется процедура включения средств уровня ассемблера в высокоуровневую обстановку языка Лисп, опробованных при раскрутке Лисп-системы.
Ключевые слова: абстрактная машина, SECDED, спецификация машинно-зависимых аспектов, Лисп, ассемблер, LAP, patching, код программы, псевдо-функция, аргумент, листинг программы, таблица символов, ПО, ассоциативный список, начало программы, интерпретатор, индикатор, адрес, арность, команда, список свойств атомов, литерал, символ, список, значение, предикат, CLA, заплатка, ядро интерпретатора, операции, компилируемый код, компилятор, компиляция, надежность, функциональный подход, регистр, стек, контекст, вычисления программы, память, environment, control, list, dump, константы, определение, ветвление, CDR, CONS, атомарность, равенство, вычитание, останов, управляющие программы, элемент списка, длина, дамп, истинностное значение, программа, функция, системное программирование, конструирование, моделирование, парадигма программирования, объявление системы команд

Низкоуровневое программирование. Ассемблер

П.Лэндин (P.J.Landin) предложил специальную абстрактную машину SECD, удобную для спецификации машинно-зависимых аспектов семантики Лиспа, которая будет рассмотрена ниже. А в первых Лисп-системах для реализации ядра и встроенных операций использовался специальный Лисп- ассемблер LAP, описание которого приводим в качестве иллюстрации [1]. (LAP проектировался специально для нужд компилятора, но он применялся и для низкоуровневых определений функций, а также для обработки исправлений (patches). Это двухпроходный встроенный, исключительно внутренний ассемблер. Первый просмотр анализирует программу и выясняет взаимосвязи между ее частями и Лисп-системой. При ассемблировании на LAP не предусмотрено и не происходит никаких манипуляций с текстами программы в файлах. Ассемблирование кода программы выполняется в оперативной памяти во время второго просмотра, выполняющего сборку кода с установлением фактических адресов. LAP был включен в Лисп-систему как псевдо-функция от двух аргументов. Первый аргументлистинг программы, представленный в виде списка, второй — исходная таблица символов. Результат — окончательная таблица символов, по формату напоминающая ассоциативный список.)

(LAP листинг символы)

Можно сказать, что первые Лисп-системы обеспечивали Лисп-интерфейс для доступа ко всем возможностям оборудования в стиле работы с ассемблером, но по форме как с обычными символьными данными.

Началом листинга ассемблерной программы является строка, сообщающая ассемблеру, с какой позиции стартовать и предстоит ли полученный в результате код программы встраивать в интерпретатор как Лисп-функцию. По завершении работы ассемблера индикатор "Тип" будет размещен в списке свойств атома "Название" вместе со специально сконструированной структурой данных, хранящей адрес построенного кода, арность и команду для вызова этого кода как подпрограммы из Лисп-интерпретатора. Тип - это обычно SUBR или FSUBR, отражает разницу в методах обработки параметров обычными и специальными функциями. При ассемблировании атомарных форм список свойств атома проверяется на вхождение индикаторов SUBR, FSUBR.

Формы вида ( QUOTE a ) рассматриваются как литеральная величина, содержащая a. Ее адрес - результат ассемблирования. Величина защищена от выметания. Новый литерал не создается, если он совпадает с ранее построенным.

Определение операций ассемблера выполнялось OPDEFINE, псевдо-функцией для введения новых команд для LAP. Она устанавливает индикатор SYM в списке свойств атома, который предстоит определить как обозначение или символ команды. Ее аргумент - список пар. Каждая пара - символ и его численное значение. Здесь пара означает не "точечная" пара, а двухэлементный список.

(OPDEFINE ( (CLA 500Q8)
            (TRA 2Q9)
            (LOAD 1000)
            (OVBGN 7432Q) ))
Пример 7.1.

Примеры применения ассемблера

Предикат GREATER наводит некоторый канонический порядок среди атомов.

(LAP ( (GREATER SUBR 2) 
              (TLQ (* 3))
              (PXA 0 0)
              (TRA 1 4)
              (CLA (QUOTE *T* ) )
              (TRA 1 4) ) 
            NIL)
Пример 7.2. Лисп-функция.

Команда TSX 6204Q должна быть вставлена после позиции 6217Q. Последняя содержит CLA 6243Q и эти команды должны быть перемещены для заплатки.

(LAP (6217Q (TRA NIL) )NIL) 
    (LAP (NIL (CLA A) 
                  (TSX 6204Q) 
	  (TRA B) )
           ( (A . 6243Q) (B . 6220Q) )
    )
Пример 7.3. Заплатка для кода программы.
< Лекция 6 || Лекция 7: 123 || Лекция 8 >
Дарья Федотова
Дарья Федотова
Сергей Березовский
Сергей Березовский

В рамках проф. переподготовки по программе "Программирование"

Есть курсы, которые я уже прошел. Но войдя в курс я вижу, что они не зачтены (Язык Ассемблера и архитектура ЭВМ, Программирование на С++ для профессионалов). Это как?

Алина Ленкова
Алина Ленкова
Россия, Ставрополь, СФ МГУПИ, 2014
Валерий Ромашов
Валерий Ромашов
Россия