Императивное программирование на ассемблере — КиберПедия 

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Императивное программирование на ассемблере

2021-01-31 164
Императивное программирование на ассемблере 0.00 из 5.00 0 оценок
Заказать работу

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

«сверхточной» детализации программ на языке ассемблера. Результатив- ность представления программ обеспечивает макротехника или автоматный подход к реализации алгоритмов – методика автоматного программирования, поддерживающая выделение шагов модели программы независимо от базо- вых средств ЯНУ. Автоматное программирование возникло до появления ЯВУ11.

 
Для языков ассемблера в дополнение к общей семантике элементарного уровня ЯНУ характерно наличие команд над вещественными числами и об- работки кодов. Работа с идентификаторами реализуется аппаратными воз- можностями адресации памяти, обычно обеспечивающей доступ практиче- ски к любому хранимому в памяти данному или команде. Управление вычис- лениями   может         учитывать          результаты       промежуточных вычислений (ветвления и переключатели), выполнять итерирование участков повторяе- мости (циклы) и вызовы подпрограмм, а также обрабатывать внутренние и внешние прерывания. В качестве поддержки структур данных можно рас- сматривать пересылки блоков заданной длины, а также средства работы с текстом программы. В качестве опорных языков рассмотрены ассемблеры MIX, MSX, P-код, RISC-машина, byte-код (muLisp и Java), MASM и БЭМШ. Традиционно ассемблер реализуют как упрощенный компилятор. Учиты- вая повышенную нагрузку низкоуровневого программирования на отладку

 

11 Поликарпова Н. И., Шалыто А. А. Автоматное программирование. СПб.: Питер, 2009. 176 с.


 

 

программ, иногда включают в систему программирования дизассемблер и интерпретатор ассемблера, обеспечивающие кроме удобства отладки широ- кий спектр преобразования программ на ассемблере, их оптимизации и адап- тации к развитию аппаратуры. Интерпретирующий автомат для ассемблера устроен проще, чем автомат для абстрактной машины SECD, благодаря встроенной реализации команд – языка конкретной машины и отсутствию локализации имен и их областей действия. Процесс перевода программы с языка ассемблера в язык машинных команд называют ассемблированием.

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

При ассемблировании текст программы отображается в частично адре- суемый код программы, исполнение которого обычно сводится к поячееч- ному изменению состояния памяти:

ассемблер = (Текст → {Код | Адрес}): Пам [ячейка] → Пам

 

Число слов, отводимое ассемблером под одну символическую команду, зависит не только от собственно кода команды, но и от метода адресации операндов, а возможно, и от других аспектов кодирования программ и дан- ных, обсуждение которых здесь не предполагается. Достаточно констатиро- вать, что программа при ассемблировании распадается на конечные последо- вательности команд K1... Kn, которым сопоставляются конечные интервалы машинных слов W1... Wm(a) в зависимости от а – системы аспектов кодиро- вания:

 

[K1... Kn] → [W1... Wm(a)]

 

Фактически, операндная часть команды – это адреса, специальные реги- стры, сумматоры, значения в общей памяти, шкала прерываний и состояний или что-то другое, специфичное для конкретной архитектуры.

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

– резервирование памяти для последовательности команд, образующих ассемблируемую программу;

– сопоставление используемых в программе идентификаторов с адресами в памяти;


 

 

– отображение ассемблерных команд и идентификаторов в их машинные эквиваленты.

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

 
Язык ассемблера обычно различает следующие категории команд:

– вычисления с результатом в сумматоре, для которых следующая ко- манда расположена по соседству;

– изменение части состояния общей памяти, при котором следующая ко- манда расположена по соседству;

– управление процессом вычислений со своими правилами выбора сле- дующей команды;

– обработка текста программы без генерации нового кода.

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

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

 
Имеются команды условного перехода, возвратный вызов процедуры с использованием регистра возврата и передача управления со счетчиком числа циклов. Встречаются и другие команды, разнообразие которых не влияет на особенности ассемблирования и применения ассемблеров в систе- мах программирования. Именно язык ассемблера традиционно выступает в системах программирования в роли конкретной машины (КМ) при компиля- ции программ.

Программирование на ассемблере подразумевает знание специфики си- стемы команд процессора, методов обслуживания устройств и обработки прерываний. Система команд может быть расширена микропрограммами и системными вызовами в зависимости от комплектации оборудования и опе- рационной системы. Это влияет на решения по адресации памяти и коммута-


 

 

 
ции комплекта доступных устройств. Но есть и достаточно общие соглаше- ния о представлении и реализации средств обработки информации на уровне машинного кода.

Обычно ассемблер обеспечивает средства управления распределением памяти и управления компиляцией кода независимо от системы команд, что позволяет программисту принимать достаточно точные решения на уровне машинного языка. Существуют средства отладочного исполнения и распе- чатки листингов. Управление ассемблированием обычно обеспечивает сред- ства авторизации, взаимодействия с отладчиком, текстовым редактором, опе- рационной системой и средствами приаппаратного уровня, доступными че- рез операционную систему и аппаратные средства ввода-вывода (BIOS).

По тексту программы при ассемблировании формируется код программы, выполняющий пошаговое преобразование памяти.

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

Спецификация команд абстрактной машины ассемблера может быть за- дана над тройкой <S, C, M >, в которой S и C – простые регистры, а M – вектор, представляющий общую память.

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

 

Таблица 11

 
Пример системы команд ассемблера

Обозна- чение команды Описание команды 12 Примечание
LDC Засылка адреса в сумматор

Подготовка операндов

LDM Засылка адресуемого слова в сумматор
LDS Косвенная засылка слова в сумматор

 

12 Следующая команда расположена по соседству или задана командой передачи управления.


 

 

Продолжение т абл. 11

 

Обозна- чение команды   Описание команды   Примечание
RV Пересылка из сумматора в память13

Сохранение результата

RVS Пересылка слова по адресу из сумматора в па- мять
GO Безусловная передача управления.

Обход или пере- дача управления

GS0 Условная передача управления по нулевому значению сумматора
GS1 Условная передача управления по ненулевому значению сумматора
GSUB Передача управления с запоминанием адреса возврата в сумматоре Подпрограмма
DEC Вычитание 1 из содержимого сумматора

Арифметические операции

INC Прибавить 1 к содержимому сумматора
ADD Прибавление адреса к содержимому сумматора
SUM Суммирование адресуемого слова и содержи- мого сумматора

 

 
Можно пояснить и семантику таких команд.

 

 
Таблица 12

Пример спецификации команд ассемблера

RA RA’ Примечание
s (LDC Adr. c) m → (s:=Adr) c m Операнд из команды
s (LDM Adr. c) m → (s:=[Adr]) c m Операнд из памяти
(s:Adr) (LDS. c) m → (s:=[Adr]) c m Операнд по адресу в сум- маторе
s (RV Adr. c) m → s c (m|m.Adr:=[s]) Результат из сумматора
(s:Adrs) (RVS Adr. c) m →            s            c (m|m.Adr:=[Adrs]) Результат по адресу
s (GO Adr. c) m → s Adr m

Обходы или передачи управления

(s:0) (GS0 Adr. c) m → s Adr m
(s:1) (GS1 Adr. c) m → s Adr m
s (GSUB Adr. c) m → @c Adr m Укрупнение действий
s (DEC. c) m → (s-1) c m

Арифметические операции

s (INC. c) m → (s+1) c m
s (ADD Adr. c) m → (s+Adr) c m
s (SUM Adr. c) m → (s+[Adr]) c m

 

13 Пересылки – это изменение части состояния общей памяти.


 

 

 
Применение ассемблера для разработки многократно используемых мо- дулей налагает определенные ограничения на структуру кода программы и его свойства:

– перемещаемость. Свойство удобно, когда код программы устроен так, что его можно расположить по любому абсолютному адресу;

– листание страниц памяти. Соотношение между адресуемой и реально доступной памятью может требовать пересмотра в процессе выполнения про- граммы;

– зависимость от данных. Программа должна учитывать готовность дан- ных и вероятность их обновления, особенно в случае обмена информацией через порты или буферы устройств;

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

 

Фрагмент программы Примечание
LD HL, ADR1 откуда Установить регистр HL
LD DE, ADR2 куда Установить регистр DE
LD BC, 2048 сколько Установить регистр BC
LDIR Переместить данные в соответствии
  с содержимым регистров HL, DE, BC

Пример 1. Пример из ассемблера MSX: пересылка блока (тип данных не имеет значения)

Такую же работу на двухадресной архитектуре типа PDP-11 можно вы- полнить с помощью цикла поячеечной пересылки, а на архитектуре типа Intel понадобится еще учитывать разрядность машинного слова.

Ассемблер отличается от компилятора меньшей сложностью исходного языка, перевод с которого в машинный язык можно выполнить «один-в- один». Ассемблер часто сопровождается возможностью дизассемблирова- ния, что отличает его от большинства других языков программирования. Изу- чить язык ассемблера проще, чем любой язык высокого уровня. Знание ас- семблера помогает понимать код программы, подготовленной на других язы- ках.

 
Основной механизм укрупнения действий – передача управления подпро- грамме. При необходимости уровень языка может быть повышен с помощью макросов.

Императивный стиль программирования на ассемблере наследуется боль- шинством ЯВУ, поддерживающих процедурно-императивное и объектно- ориентированное программирование.


 

 

Таблица 13

 
Парадигмальная характеристика ассемблера

Параметр Конкретика
Эксплуатационная прагматика ЯП Ассемблер – средство эффективного программирования при решении задач доступа к полному спектру возможностей оборудования
Регистры абстрактной машины S C M S – сумматор; C – поток команд программы с указателем на текущую команду; M – вектор памяти произвольного доступа. Результат рассредоточен по ячейкам памяти
Категории команд абстрактной машины – вычисления с результатом в сумматоре, для которых следующая команда расположена по соседству; – изменение части состояния общей памяти, при котором следующая команда расположена по соседству; – обработка текста программы без генерации нового кода; – управление со своими правилами выбора следующей команды; – команды «знают», где их операнды
Реализационная прагматика Парадигмальная специфика – перемещаемость. Код можно расположить по любому абсолютному адресу; – листание страниц памяти; – зависимость от данных; – динамика размещения; – объектный код; – билистинг; – прокрутка и отладчик; – реассемблирование. Классический язык императивного машинно- ориентированного программирования

Стековая машина Forth

 
Для машинно-ориентированных языков, таких как Forth [2], система вы- числений распадается на подсистемы по величине обрабатываемого слова (16 и 32, возможно, 64). Основа работы с памятью – стек. Средства управле- ния вычислениями обогащены средствами блокировки и кодирования про- грамм, что позволяет повышать эффективность информационной обработки.


 

 

Используется механизм замкнутых процедур с неявными – стековыми – па- раметрами. Стек реализован как указатель на текущий элемент в предполо- жении, что перед ним по порядку расположены предшествующие элементы. Программа – отдельный поток, использующий расширяемый словарь.

Принята постфиксная запись, удобная для стековой обработки данных. Стек- ориентированная дисциплина обработки освобождает от необходимости в понятии «переменная», хотя оно при необходимости моделируется.

 
Программирование на Forth-е сопровождается систематической сверткой понятий, синтаксис применения которых созвучен польской записи. Можно сказать, что хорошая программа на Forth-е – это специализированная вирту- альная машина, приспособленная к дальнейшему расширению по мере раз- вития постановки задачи.

Интерпретатор языка Forth сортирует слова по принадлежности словарю:

– слова, не найденные в словаре, записываются в стек для предстоящей обработки;

– словарным словам, встроенным в интерпретатор, соответствует правило преобразования стека;

– возможно определение новых слов, запоминаемое в словаре (от «:» до

«;»);

– за корректность воздействий на стек отвечает программа;

– результатом считается состояние стека при завершении программы. Программа на языке Forth строится как последовательность слов, некото-

рые их которых включены в расширяемый словарь языка:

Forth: текст/словарь → стек: стек →

стек': слово → словарь

Данные – это тоже слова. Логическое значение «истина» – 0. Новые слова можно вводить в форме:

: имя опр;

Абстрактный синтаксис языка отличается от АС ассемблера допущением произвольного числа неявных аргументов определяемых команд:

 
S E C → S’ E’ C’

S – стек результатов,

E – словарь, представленный как вектор строк, C – поток слов, образующих программу.

Исполнение программы организовано как диалог над стеком. Каждая ко- манда знает, что взять из стека, во что преобразовать стек для получения ре- зультата программы и какие результаты разместить в стеке.


 

Таблица 14

 
Команды стековой машины языка Forth

SCS Описание команды Примечание
LDC Засылка из программы в стек Операнды
DROP Сбросить из стека верхний элемент

Манипуляции с фик- сированным числом элементов стека

DUP Скопировать верхний элемент
NIP Сбросить предпоследний элемент стека
OVER Предпоследний элемент переставить наверх
PICK Выборка из стека элемента с указанным но- мером
SWAP Обмен местами двух верхних элементов
TUCK Копирование верхнего элемента под второй с сохранением
DEPTH Глубина стека Контроль
PICK Выборка из стека элемента с указанным но- мером

Манипуляции с за- данным числом эле- ментов стека

ROLL Перестановка на заданную глубину элемента из стека
?DUP Скопировать ненулевой верхний элемент Условие
LDF Загрузить в словарь определение

Укрупнение дей-

ствий

AP Применить словарное определение

Укрупнение действий – это новые определения с неявными параметрами в стеке.

 

Таблица 15

 
Спецификация команд стековой машины языка Forth

RS RS Примечание
s e (LDC X. c) (X. s) e c

Подготовка стека к пред- стоящим опера- циям.

N – длина стека

Глубина стека

(X. s) e (DROP. c) → s e c
(X. s) e (DUP. c) → (X X. s) e c
(X2 X1. s) e (NIP. c) → (X1. s) e c
(X2 X1. s) e (OVER. c) → (X2 X1 X2. s) e c
(XN... X0 N. s) e (PICK. c) → (XN... X0 XN. s) e c
(XN... X0 N. s) e (ROLL. c) → (XN-1... X0 XN. s) e c
(X3 X2 X1. s) e (ROT. c) → (X2 X1 X3. s) e c
(X2 X1. s) e (SWAP. c) → (X1 X2. s) e c
(X2 X1. s) e (TUCK. c) → (X1 X2 X1. s) e c
s (DEPTH. c) → (N. s) e c

Продолжение т абл. 15

 

RS RS Примечание
(0. s) e (?DUP. c) → (0. s) e c

УСЛОВИЕ

(X. s) e (?DUP. c) → (X X. s) e c
(NF. s) e (LDF F “;”. c) → s (e|e[NF]=F) c Пополнение словаря
(NF. s) e (AP. c) → s e (e[NF]. c) Применение словарного определения

 
Система программирования для языка Forth содержит пару «интерпрета- тор – компилятор», причем техника компиляции весьма эффективна благо- даря специальной технике шитого кода. Система использует единый порядок представления данных и команд в программе это последовательности слов. Данные располагают перед операциями по их обработке. Операция – это из- вестное системе слово. Данные просто загружаются на стек, из которого опе- рация берет их в соответствии с числом ее параметров.

Интерпретирующий автомат для языка Forth по сложности сравним с ав- томатом для ассемблера. Основные различия таковы:

– словарь Forth-а хранит строки произвольной длины, а таблица меток ас- семблера хранит адреса фиксированного размера;

– вместо запоминания адреса возврата при организации подпро- грамм/функций определения размещаются расширяемом словаре;

– неявные параметры функций заранее размещаются в стеке, их число из- вестно;

– результаты вычислений сконцентрированы в стеке.

 
Таким образом, обеспечены базовые функциональные возможности, ха- рактерные для систем программирования на языках высокого уровня.

 

Фрагмент программы Примечание
(x y z → x y*z)   OVER (x y*z → x y*z x) (x y*z x → x y*z - x) SWAP (x y*z - x → y*z – x x) DUP   (y*z – x x → y*z – x x x) *          (y*z – x x x → y*z – x  x*x) +         (y*z – x x*x → y*z – x + x*x) Перемножение двух верхних элементов стека Копирование второго элемента на верх стека Разность двух верхних элементов Перестановка двух верхних элементов Дубль верхнего элемента Перемножение двух верхних элементов Сумма

Пример 2. Программа на языке Forth для подсчета по формуле (x y z → x**2 + y*z – x) – в круглых скобках – комментарии


 

Фрагмент программы Примечание
: SQ     (вводится слово SQ в словарь) DUP               (A B → A B B) * SWAP (A B B → A B**2 → B**2 A) DUP *  (B**2 A → B**2 A A → B**2 A**2) +           (B**2 A**2 → B**2 + A**2) ;            (конец определения нового слова) Объявление имени укрупнен- ного действия Дубль верхнего элемента Перемножение и перестановка = Дубль и квадрат Сумма – результат в стеке

Пример 3. Введение нового слова SQ для подсчета суммы квадратов (A B → A**2 + B**2)

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

Язык Forth – пример организации вычислений над стеком. Его можно рас- сматривать как язык-ядро с возможностью практически неограниченного проблемно-ориентированного расширения машинно-независимых эффек- тивных средств программирования. Язык допускает порождение эффектив- ного кода «хорошо» написанных программ.

Программирование на Forth-е требует вдумчивости и аккуратности. До- стижимость лаконичных форм дается ценой нестандартных индивидуальных решений, мало приспособленных к передаче программ в чужие руки. Ло- зунги «Программируйте все сами!» и «Не бойтесь все переписывать заново!» правильно отражают подход к программированию на Forth-е. Успех достига- ется максимализмом в тщательной отладке и способностью видеть задачу программирования в развитии.

Автор языка Forth Чарльз Маури в 1968 году отметил: «Forth не уравни- тель, а усилитель!».

К середине 1970-х годов Forth стал третьим по популярности после Бей- сика и Паскаля, завоевав свои позиции при освоении микропроцессорных средств. По технике программирования Forth похож на макроассемблер, только вместо системы команд над машинными словами в нем используется система операций над стеком.

Таблица 16

 
Парадигмальная характеристика языка Forth

Параметр Конкретика
Эксплуатаци- Средство разработки специализированных систем,
онная прагма- создаваемых по методике раскрутки, начиная с тщательно
тика ЯП минимизированного ядра с рядом последовательных шагов
  расширения в рамках единой оболочки. Мало приспособлен
  к передаче программ в чужие руки. Компактный язык-ядро
  для пошагового решения задач с расширяемой постановкой

Продолжение т абл. 16

 

Параметр Конкретика
Регистры абстрактной машины S E C S – стек операндов и результатов. E – словарь определений. C – программа – поток операций и значений
Категории ко- манд абстракт- ной машины Преобразование содержимого стека. Вычисление над стеком. Применение программируемых определений
Реализацион- ная прагматика Стек – вектор заданного системой размера. Элементы стека – слова фиксированной разрядности. Система программирования использует пару интерпретатор- компилятор
Парадигмати- ческая специ- фика Механизм реализации выражений в большинстве ЯВУ. Forth обладает концептуальным родством с языком Lisp

 

3.3.
 
Продукционная макротехника

 
Макротехника дает весьма мощные, но не вполне безопасные средства повышения выразительности ЯП. Для макропроцессоров семантика ЯНУ обычно сопровождает средства работы со строками в стиле открытых проце- дур. Программа представляет собой поток макроопределений и макровызо- вов. Имена макросов могут рассматриваться равноправно с базовыми сред- ствами. При определении и реализации макросов используется понятие по- зиции и шаблона для подстановки параметров. Встречается стиль нумерации позиций, который позволяет обойтись без их именования в виде переменных. В результате подстановки макросов формируется текст, равноправный с ис- ходным, возможно, содержащий вторичные макросы. Макропроцессор часто используется в паре с ассемблером (макроассемблер) и другими ЯП. В каче- стве опорных рассмотрены макропроцессоры GPM, TRAC, а также два мак- ропроцессора из системы подготовки программ на языке SETL.

Для автономных макропроцессоров характерны специальные механизмы регулярного конструирования различимых текстов:

– управляющие символы;

– счетчики;

– генераторы уникальных значений;

– блоки активности (разметка);

– встроенные функции;

– управление вводом-выводом.

Большинство макропроцессоров допускают переменные макропериода – глобальные и локальные макропеременные.


 

 

Для макропроцессора программа – это содержащий макровызовы текст, при обработке которого программа преобразуется в новый текст программы, полученный в результате макропреобразований:

Макро = (Прог = Текст): Прог → Прог'

Интерпретатор макропроцессора при последовательном сканировании текста выделяет в нем следующие категории строк:

– макроопределение, которое следует поместить в таблицу макросов (c → e);

– макровызов без параметров, определение которого следует скопировать из таблицы в результат (e → c);

 
макровызов с параметрами, значения которых следует установить, а за- тем подставить в буферную копию определения, и преобразованное опреде- ление разместить в результат (e → p → c);

– простая строка, сохраняемая в результате без преобразований;

– конец текста.

Абстрактный синтаксис макротекстов показывает появление функций с произвольным числом параметров, открыто подставляемых в шаблон опре- деления.

(DEF Name Arg1 Arg2 … ArgN Patern) – разделители и ограничители сняты при переходе к АС.

(Name Txt1 Txt2 … TxtN) – однократная открытая подстановка текстов в шаблон на место соответствующих аргументов.

 
Спецификация команд абстрактной машины макропроцессора может быть задана парой <E, C>, в которой C – строка, а E – вектор определений.

Таблица 17

Пример системы команд макропроцессора

SCM Описание команды Примечание
LDF Ввод шаблона макроса в таблицу под за- данным именем Укрупнение действия
LDN Размещение параметра макроса в таблице под заданным номером Локальные параметры
SP Сцепление строки с текстом = обход строки Константа
ARG Копирование параметра в текст Подстановка параметра
AP Применение макроса Применение макроса

Таблица 18

 
Спецификация макрокоманд

RM RM’ Примечание
e (LDF Mac Ptn. c) → (e|e[Mac]:=Ptn) c Размещение макроса в таблица определений
e (LDN Num Arg. c) → (e|e[Num]:=Arg) c Размещение параметров в таб- лице определений
e (SP X. c) → e c Пропуск константы
e (ARG Num. c) → e (e[Num] | c) Подстановка параметра
e (AP Mac. c) → e (e[Mac] | c) Подстановка макроса

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

Макровызовы могут выполняться за одни просмотр или до исчерпания при итеративном анализе текста. Встречаются средства управления глубиной макроподстановки. Популярно синтаксическое подобие макросов выраже- ниям базового языка, хотя это может вызывать путаницу в понимании реаль- ных механизмов при порождении кода программы.

 
Техника строковой обработки обычно поддерживается операциями вы- числения длины строки, выделения подстроки и конкатенации строк.

В системах программирования макротехника применяется на двух уров- нях: препроцессоры обычно формируют входной текст для компилятора, а макроассемблеры выполняют сборку кода на уровне генерации ассемблерной программы или ее объектного кода. Кроме того, встречаются макропреобра- зования структур данных.

Макропроцессор получает логическое завершение, поддерживая динами- чески формируемые макроопределения, возможно используя макровызовы в аргументах.

Встречается интересное применение вложенности макровызовов и мак- роопределений, включая рекурсию вида:

ФАКТ (сч) = если <сч = 0> то [ 1 ] иначе [ (| сч | *] | ФАКТ [ сч - 1 ] | [) ].


 

Макроопределение Примечание
  ФАКТ (сч) = <сч = 0> → [ 1 ]   Строка для значения 0
[ (| сч | * ] ФАКТ [ сч - 1 ]   [) ] Строка из «(», значения «сч» и «*» Строка из макроса от «сч», уменьшенного на 1 Строка из «)»
ФАКТ (6) = (6 * (5 * (4 * (3 * (2 * (1 * 1)))))) Результат макроса на значении 6

 
Пример 4. Рекурсивное макроопределение факториала

 

 

Макроопределение Примечание
  §A, §Def, A, <D>; §Def, B, <C>;;   Вызов «А», где «А» указывает на «D», а «В» на «С»

Пример 5. Пример макропрограммы на GPM. Моделирование

«if A=B then C else D» обеспечено побочным эффектом на глобальной таблице имен

Техника выполнения макропреобразований достаточно разнообразна. Так, например, язык GPM всю работу с макросами сводит к макровызову вида:

§ mak, a1, a2,... aN;       – вызов макроса.

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

~0 ~1 ~2... ~N       – описание не нужно.

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

< S > – блокировка подстановок в S.

Макрогенератору GPM достаточно всего одной встроенной функции DEF, выполняющей введение макроопределений.

 

Макроопределение Примечание
§Def, mak, опр; Команда создания нового макроса

Пример 6. Введение новых макроопределений GPM


 

Макроопределение Примечание
§Def, size, 6; Определение макроса
§size;     => 6 Варианты вызовов макроса
x (§size, §size) => x(6,6)  
size§size => size6 &n

Поделиться с друзьями:

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

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.171 с.