Учебная работа. Реферат: Структура и реализация макроязыков
кафедра САПР
Реферат
Тема III
Разработка ощего программного обеспечения
Педагог:
Зайцева Л. В.
Студент:
Омельченко С. А.
МАКРОЯЗЫК И МАКРОПРОЦЕССОР
Оператор, работающий в какой-либо системе, часто встречается с неоходимостью повторять некоторые последовательности действий много раз? Такая последовательность может, например, со100ять из ввода некоторой тек100вой последовательности, нажатии определенной последовательности клавиш, выполнении однотипного ряда каких-либо арифметических операций. В подобных случаях часто можно воспользоваться аппаратом макрокоманд.
(часто называемые
либо
) являются однострочными сокращениями для группы команд. Используя макрокоманду, программист по существу определяет одну “команду” для представления некоторой последовательности команд.
Определяя соответствующие макрокоманды, оператор может удобным для себя оразом вводить свои собственные средства более высокого уровня, не заботясь о структуре системы. Он может достигнуть краткости и про100ты управления системой, не теряя при всем этом основных преимуществ использования исходной системы, такой, как например язык ассемблера. Крупные макрооперации упрощают пользование, отладку и модификацию прогр, и олегчают стандартизацию. Многие разработчик вычислительных машин используют макрокоманды для автоматизации составления “подходящих” операционных систем в процессе, называемом
МАКРОКОМАНДЫ
В своей простейшей форме макрокоманда представляет собой сокращение для обозначения последовательности операций
Рассмотрим следующий набор команд, взятый из макроязыка IDE для Borland C++ версии 3.1 (TEMC). Рассмотрим следующую программу, написанную с помощью этих операций
Пример 1
.
.
.
SetPrevPos;
FixScreenPos;
PageScreenUp;
FixCursorPos;
.
.
.
SetPrevPos;
FixScreenPos;
PageScreenUp;
FixCursorPos;
.
.
.
В приведенной программе последовательность команд
SetPrevPos;
FixScreenPos;
PageScreenUp;
FixCursorPos;
встречается дважды.
Аппарат макрокоманд позволяет присвоить данной для нас последовательности имя и использовать это имя вме100 нее. Можно также определить некоторый макроязык, позволяющий рассматривать данную конструкцию, как определение и в дальнейшем использовать это определение.
Фактически, макропроцессор представляет собой отдельный языковой процессор со своим собственным языком.
Форматы макроопределений в различных системах может отличаться друг от друга. В данном случае последовательность команд, определяющая макрокоманду имеет следующий формат
MACRO <macro name>
——————
——————
——————
END;
Псевдокоманда MACRO
— первая строка определения — определяет следующий за ней идентификатор, как
. Вослед за данной для нас строкой располагается последовательность команд, называемых “телом макроопределения”. Определение заканчивается строкой с псевдокомандой END
.
Если макрокоманда определена, то использование имени соответствующей макрокоманды в качестве мнемоники кода в программе эквивалентно использованию соответствующей последовательности команд. Если повторяющейся последовательности команд отдать имя “MacPageUp”, то наш пример можно будет переписать следующим оразом:
MACRO MacPageUp
SetPrevPos;
FixScreenPos;
PageScreenUp;
FixCursorPos;
END;
.
.
.
MacPageUp
.
.
.
MacPageUp
.
.
.
.
.
.
SetPrevPos;
FixScreenPos;
PageScreenUp;
FixCursorPos;
.
.
.
SetPrevPos;
FixScreenPos;
PageScreenUp;
FixCursorPos;
.
.
.
В данном случае макропроцессор заменяет каждую макрокоманду (макровыклич) строками:
SetPrevPos;
FixScreenPos;
PageScreenUp;
FixCursorPos;
Такой процесс замены называется
макрокоманды. Заметим, что само макроопределение не появляется в расширении исходного тек100. Определение сохраняется макропроцессором. Вхождение в исходную программу имени макрокоманды как мнемоники операции называется
ОПЕРАТОРЫ МАКРОКОМАНД
Аппарат макрокоманд в том виде, как он был описан до сего времени, позволяет подставлять последовательности команд вме100 макровызовов, причем все оращения к макроопределению будут заменены идентичными последовательностями команд. Такой аппарат недостаточно гибок: в макровызове нет средств модифицировать коды, которые его заменяют. Существенное расширение возможностей макросредств достигается добавлением операндов (параметров) макрокоманд.
Рассмотрим следующую программу:
Пример 2:
.
.
.
SetPrevPos;
MoveToMark(1);
CenterFixScreenPos;
.
.
.
SetPrevPos;
MoveToMark(2);
CenterFixScreenPos;
.
.
.
В данном случае последовательности команд весьма похожи, но не абсосвирепно идентичны. В первой последовательности используется операнд “1”, а во втором — операнд “2”. Можно считать, что они выполняют одну и ту же операцию с переменным параметром, либо операндом. Такой параметр называют “
либо
и он обычно объявляется в той же строке, где и имя макроса. В случае работы с языком макроассемблера, он обычно помечается символом &, что отличает его как символ макроязыка от символов ассемблера. В нашем случае, фирма Борланд не предусмотрела в своем макроязыке работы с макрооперандами, однако можно предположить, что если бы макроопределения в языке TEMC могли бы орабатывать подобную ситуацию, то формат макроопределения мог бы выглядеть следующим оразом:
MACRO <macro name>(<paramlist>)
——————
——————
——————
END;
где <paramlist>
это перечисление через запятую всех операндов макроса.
Предыдущая программа в таком случае может быть переписана следующим оразом:
MACRO MacGoto(labelno)
SetPrevPos;
MoveToMark(labelno);
CenterFixScreenPos;
END;
.
.
.
MacGoto(1)
.
.
.
MacGoto(2)
.
.
.
.
.
.
SetPrevPos;
MoveToMark(1);
CenterFixScreenPos;
.
.
.
SetPrevPos;
MoveToMark(2);
CenterFixScreenPos;
.
.
.
Следует заметить, что макрокоманда может иметь и более одного операнда. Каждый операнд должен при всем этом соответствовать формальному параметру в строке определения имени макроса.
Рассмотрим следующий пример:
Пример 3:
.
.
.
ScrollScreenDown;
ScrollScreenLeft(0);
FixCursorPos;
.
.
.
ScrollScreenUp;
ScrollScreenLeft(1);
FixCursorPos;
.
.
.
В данном случае операнды в исходных последовательностях команд различны, как и команды. Эта программа может быть переписана так:
MACRO MacMove(cmd,left)
cmd;
ScrollScreenLeft(left);
FixCursorPos;
END;
.
.
.
MacMove(ScrollScreenDown,0)
.
.
.
MacMove(ScrollScreenUp,1)
.
.
ScrollScreenDown;
ScrollScreenLeft(0);
FixCursorPos;
.
.
.
ScrollScreenUp;
ScrollScreenLeft(1);
FixCursorPos;
.
.
.
Следует отметить, что существует два основных способа задания операндов. Первый способ —
показан в вышестоящем примере. Существует также способ указания с применением
, который позволяет оращаться к формальным операторам, как по именам так и по позиции. Ссылаясь на формальные операторы в определении MacMove можно также использовать следующий выклич:
MacMove(cmd=ScrollScreenUp,left=1)
УСЛОВНОЕ МАКРОРАСШИРЕНИЕ
Иногда возникают потребности изменять порядок установок макрорасширения внутри макроса.
Рассмотрим следующую программу:
Пример 4:
.
.
.
ScrollScreenLeft(1);
LiteralChar(‘-‘);
.
.
.
ScrollScreenDown;
ScrollScreenLeft(2);
LiteralChar(‘*’);
.
.
.
В этом примере не только параметры, да и количество команд — переменная величина. Эта программа может быть записана следующим оразом:
.
.
.
MACRO Mac1(p1,left,chr)
IF p1==1 THEN
ScrollScreenDown;
ENDIF
ScrollScreenLeft(2);
LiteralChar(‘*’);
END
.
.
.
Mac1(1,2,’-’)
.
.
.
Mac1(0,1,’*’)
.
.
.
.
.
.
ScrollScreenLeft(1);
LiteralChar(‘-‘);
.
.
.
ScrollScreenDown;
ScrollScreenLeft(2);
LiteralChar(‘*’);
.
.
.
Комбинация IF…THEN…ELSE является
либо
и не появляются в выходном тексте макропроцессора. В макроязыке также могут быть предусмотрены псевдокоманды
и
на псевдо-метку, с которой макропроцессор продолжит оработку тек100 программы. Точно так же, как и в случае выполнения программы, операторы переходов служат для указания выполнения операторов программы, операторы макро-переходов служат для указания порядка компиляции тек100 программы. Это дает возможность в процессе расширения получать конкретные варианты последовательностей команд, соответствующие данному случаю применения макрокоманды. Выполнение переходов и проверок внутри выполняемого кода увеличивает его размер и время выполнения, в то время, как проверка и переходы в макросах происходят на 100дии компиляции и поэтому не требуют затрат времени при выполнении кода. Эта возможность избирательной выборки нужных частей тек100 является одним из самых мощных средств в системном программировании.
МАКРОВЫЗОВЫ ВНУТРИ МАКРООПРЕДЕЛЕНИЯ
Поскольку макроопределения являются, по сути, “сокращениями” для последовательности команд, то полезным собственныйством была бы возможность производить такие “сокращения” внутри самих макроопределений.
Пример 5:
.
.
.
MACRO Mac1
SetPrevPos;
CursorCharRight;
END
.
.
.
MACRO Mac2
Mac1
Mac1
END
.
.
.
Внутри макроопределения Mac2 дважды происходит ссылка на макроопределение Mac1. Это помогло нам уменьшить длину макроопределения Mac2 и сделало его более легким для понимания. Такое использование макросредств приводит к макрорасширениям на нескольких уровнях вложенности, например:
.
.
.
MACRO Mac1
SetPrevPos;
CursorCharRight;
END
MACRO Mac2
Mac1
Mac1
END
.
.
.
Mac2
.
.
.
MACRO Mac2
SetPrevPos;
CursorCharRight;
SetPrevPos;
CursorCharRight;
END
Mac2
.
.
.
SetPrevPos;
CursorCharRight;
SetPrevPos;
CursorCharRight;
.
.
.
Макровызовы, внутри макроопределений могут включать несколько уровней. Например, команда Mac2 могла бы быть выполнена внутри другого макроопределения. Фактически, такие средства, как макро-переходы дают возможность любое число раз оращаться к любому макроопределению, и даже к самому себе. Такие вызовы называются
МАКРООПРЕДЕЛЕНИЯ В МАКРООПРЕДЕЛЕНИЯХ
Мы рассматривали макрокоманды, как обобщенные сокращения для последовательности команд. Представляется разумным разрешить использование в теле макроопределения любых допустимых синтаксисом предложений, в том числе и другие макроопределения.
Неоходимо, однако, понимама, что внутреннее макроопределение не будет определено до того времени, пока не произойдет выклич внешнего макроса. Это — следствие метода реализации макроопределений. Например, пусть пользователь хочет определить группу макроопределений для оращения к подпрограммам с помощью какой-то стандартизированной вызывающей последовательности. Приведенный ниже пример определяет макрокоманду DEFINE, которая при указании в качестве ее операнда имени подпрограммы определяет соответствующий этому имени макрос. Отдельные генерируемые макроопределения получают имена связанных с ними подпрогр.
Пример 6:
.
.
.
МАСRO DEFINE sub
…….
…….
MACRO sub(param)
……
……
sub(param)
……
……
END
……
……
END
Пользователь может оратиться к этому макроопределению следующим оразом:
DEFINE(cos)
определяя таким оразом новое макроопределение с именем cos, к которому впоследствии можно оращаться следующим оразом:
cos(х)
и макропроцессор сгенерирует соответствующую последовательность вызова функции.
РЕАЛИЗАЦИЯ
Таким оразом, нами был описан вариант реализации макроязыка. Рассмотрим метод реализации макроязыка. В качестве примера возьмем классический язык макроассемблера.
ПО СТАНОВКА ЗАДАЧИ
Любой процессор макрокоманд должен решать следующие четыре основные задачи:
Процессор макрокоманд должен распознавать макроопределения, выделяемые соответствующими псевдокомандами. В языке макроассемблера этими псевдооператорами являются псевдокоманды MACRO и MEND. Эта задача может быть усложнена тем, что внутри макроопределений могут встречаться также другие макроопределения. Когда макроопределения
вроде было продемонстрировано выше, макропроцессор должен правильно распознавать вложения и сопоставить начало и конец макроса. Весь вложенный текст, включая и другие макроопределения определяет отдельную макрокоманду.
Процессор должен запомнить определения макрокоманд, которые будут впоследствии использоваться для расширения макровызовов
Неоходимо также и распознавать макровызовы, представленные в виде мнемонического кода операции. Это предполагает, что имена макрокоманд орабатываются на тех же самых основаниях, как и один из кодов операции.
Вме100 формальных параметров макроопределения макропроцессор должен под100вить соответствующие операнды макрокоманды. Этот текст, в свою очередь может содернажимать как макрокоманды так и макроопределения.
Таким оразом, макропроцессор должен распознавать и орабатывать макроопределения и макрокоманды.
Что все-таки касается формальных параметров, то здесь нужно принять несколько решений. Неоходимо определить — могут ли они встречаться в качестве кода операции, каков синтаксис допустимых параметров. В разных реализациях макроязыков могут встречаться разные варианты методы реализации подобных ситуаций, поэтому можно только отдать некоторые разумные варианты, покрывающие боль шую часть возможных реализаций. Формальные параметры могут встречаться в макроопределении где угодно, в том числе и в команде и в коде операции. Мы хотим, чтобы была обеспечена возможность конкатенации формальных параметров макроопределения с фиксированными символьными строками. В таком случае встает вопрос о некоем разделительном символе, обеспечивающем конкатенацию формальных параметров и заданных пользователем символьных последовательностей.
Например, если из один из параметров должен быть соединен с другим (macro[x,y] = xy), то возможен синтаксис x&y, что означает конкатенацию формального параметра x с формальным параметром y. Этот случай не вызывает боль ших трудностей. Гораздо сложней орабатывается случай, когда речь идет о под100новке параметра внутри символьной строки. В таком случае возможным выходом будет конкатенация по умолчанию 2-ух последовательно друг за другом идущих символьных строк, а также преоразование формального параметра, заключенного в скобки к символьной строке. Таким оразом, если мы хотим, чтобы в макросе фигурировала строка вида “blablabla[x]xxxxx”, где [x] должно заменяться формальным параметром вполне возможно заменить строку такого вида строкой типа “blablabla”(x)”xxxxx”.
Надо заметить, что множество замечательных мыслях по реализации подобных макроязыков реализовано в языке REXX, поддерживаемом на системном уровне операционной системой OS/2 компании IBM.
Также для выполнения функций условных переходов должны вычисляться некоторые арифметические выражения (возьмем в пример хотя бы обыкновенных счетчик). Таким оразом часто оказывается полезной возможность использования псевдо-переменных времени компиляции внутри макросов.
ДВУПРОСМОТРОВЫЙ АЛГОРИТМ
Начнем с некоторых упрощающих предположений. Будем считать, что наш макропроцессор функционально независим от основного компилятора и его текст будет передаваться этому компилятору. Сначала не разрешим макровызовы и макроопределения внутри макроопределений.
Макропроцессор, как и язык ассемблера, просматривает и орабатывает строки тек100. Но в языке все строки связаны адресацией — одна строка может ссылаться на другую при помощи адреса либо имени, которое должно быть “известно” ассемблеру. Более того, адрес присваеваемый каждой отдельной строке зависит от содержимого, количества и адресов предшествующих строк. Если рассматривать макроопределение, как единый объект, то можно сказать, что строки нашего макроопределения не так сильно взаимосвязаны. Макроопределения не могут ссылаться на объекты вовне этого макроопределения. Предположим, что в теле макроопределения есть строка INCR X, причем перед данной для нас командой параметр Х получил значение 10. Макропроцессор не производит синтаксический анализ, а производит простую тек100вую под100новку вме100 “Х” подставляется “10”.
Наш алгоритм будет выполнять 2 систематических просмотра входного тек100. В первый проход будут детерминированы все макроопределения, во второй проход будут открыты все ссылки на макросы. Так же, как и язык ассемблера не может выполнить ссылку на символ до того момента, как он встретит этот символ, язык макрокоманд не может выполнить расширение до того времени, пока не встретит соответствующее макроопределение. Во время первого просмотра проверяется каждый код операции, макроопределения запоминаются в таблице макроопределений, а копия исходного тек100 без макроопределений запоминается во внешней памяти, для использования ее при втором проходе. Помимо таблицы макроопределений во время первого прохода будет также таблица имен, во второй проход она будет использоваться для выделения макроопераций и расширения их до тек100 соответствующего макроопределения.
ДАННЫЕ ДЛЯ ПЕРВОГО ПРОСМОТРА
1. ВХТ — Входной текст
2. ВЫХ1 — Выходная копия тек100 для использования во второй проход.
3. МДТ — таблица макроопределений, в которой хранятся тела макроопределений
4. МНТ — таблица имен, неоходимая для хранения имен макрокоманд, определенных в МНТ
5. МДТС — счетчик для таблицы МДТ
6. МНТС — счетчик для таблицы МНТ
7. АЛА — массив списка параметров для под100новки индексных маркеров вме100 формальных параметров, перед запоминанием определения.
ДАННЫЕ ДЛЯ ВТОРОГО ПРОСМОТРА
1. ВЫХ1 — Выходная копия тек100 после первого прохода
2. ВЫХ2 — Выходная копия тек100 после второго прохода
3. МДТ — таблица макроопределений, в которой хранятся тела макроопределений
4. МНТ — таблица имен, неоходимая для хранения имен макрокоманд, определенных в МНТ
5. МДТС — счетчик для таблицы МДТ
6. МНТС — счетчик для таблицы МНТ
7. АЛА — массив списка параметров для под100новки индексных маркеров вме100 формальных параметров, перед запоминанием определения.
АЛГОРИТМ
Ниже приведена формальная запись соответствующих алгоритмов оработки макроопределений 2-ухпросмотровым способом.
Каждый из алгоритмов осуществляет построчный просмотр входного тек100.
ПЕРВЫЙ ПРОСМОТР — МАКРООПРЕДЕЛЕНИЯ: Алгоритм первого просмотра проверяет каждую строку входного тек100. Если она представляет собой псевдооперацию MACRO, то все следующие за ней строки запоминаются в ближайших свободных ячейках МДТ. Первая строка макроопределения — это имя самого макроса. Имя заносится в таблицу имен МНТ с индексом данной для нас строки в МДТ. При всем этом происходит также под100новка номеров формальных параметров, вме100 их имен. Если в течение просмотра встречается команда END, то это означает, что весь текст оработан, и управление можно передавать второму просмотру для оработки макрокоманд.
ВТОРОЙ ПРОСМОТР — РАСШИРЕНИЕ МАКРОКОМАНД: Алгоритм второго просмотра проверяет мнемонический код каждого предложения. Если это имя содержится в МНТ, то происходит оработка макропредложения по следующему правилу: из таблицы МНТ берется указатель на начало описания макроса в МДТ. Макропроцессор готовит массив списка АЛА содержащий таблицу индексов формальных параметров и соответствующих операндов макрокоманды. Чтение производится из МДТ, после чего в прочитанную строку подставляются неоходимые параметры, и полученная таким оразом строка записывается в ВЫХТ2. Когда встречается директива END, текст полученного кода передается для компиляции ассемблеру.
Начало алгоритма
МДТС = 0
МНТС = 0
ФЛАГ ВЫХОДА = 0
цикл пока (ФЛАГ ВЫХОДА == 0) {
чтение последующей строчки ВХТ
если !(операция MACRO) {
вывод строчки в ВЫХТ1
если (операция END) ФЛАГ ВЫХОДА = 1
}
по другому {
чтение идентификатора
запись имени и индекса в МНТ
МНТС ++
приготовить массив перечня АЛА
запись имени в МДТ
МДТС ++
цикл {
чтение последующей строчки ВХТ
подстановка индекса операторов
добавление в МДТ
МДТС ++
} пока !(операция MEND)
}
}
переход ко второму проходу
конец метода
Начало метода
ФЛАГ ВЫХОДА = 0
цикл пока (ФЛАГ ВЫХОДА == 0) {
чтение строчки из ВЫХТ1
НАЙДЕНО = поиск кода в МНТ
если !(НАЙДЕНО) {
запись в ВЫХТ2 строчки
если (операция END) {
ФЛАГ ВЫХОДА = 1
}
}
по другому {
УКАЗАТЕЛЬ = индекс из МНТ
Наполнение перечня характеристик АЛА
цикл {
УКАЗАТЕЛЬ ++
чтение след. строчки из МДТ
подстановка характеристик
вывод в ВЫХТ2
} пока !(операция MEND)
}
}
переход к компиляции
конец метода
ОДНОПРОСМОТРОВЫЙ АЛГОРИТМ
Представим, что мы допускаем реализацию макроопределения снутри макроопределений. Основная неувязка тут заключена в том, что внутреннее макро определено лишь опосля того, как выполнен вызов наружного. Для обеспечения использования внутреннего макро нам придется повторять как просмотр обработки макроопределений, так и просмотр обработки макрокоманд. Но существует и очередное решение, которое дозволяет произвести определение и расширение в один просмотр.
Разглядим аналогию с ассемблером. Макроопределение обязано обрабатываться до обработки макрокоманд, так как макро должны быть определены для микропроцессора ранее, чем макрокоманды воззвания к ним. Но, если мы наложим ограничение, что каждое макроопределение обязано быть определено до того, как произойдет воззвание к нему, мы устраним основное препятствие для однопросмотровой обработки. Заметим, что то же самое быть может правильно и для символических имен в ассемблере, но такое требование было бы неоправданным ограничением для программера. В случае же макрорасширения быть может полностью естественно востребовать, чтоб объявления макро предшествовали вызовам. Это не накладывает весьма существенных ограничений на внедрение аппарата макрокоманд. Этот механизм даже не воспрещает воззвание макро к себе, так как воззвание ведется в тот момент, когда имя макроса уже определено. расширение же макроса идет не в процессе разбора макроса, а в процессе следующего вызова.
Предложенный ниже метод соединяет воединыжды два вышеприведенных метода для двупросмотрового макроассемблера в один.
АЛГОРИТМ
Начало метода
МТДС = 0
МНТС = 0
ФЛАГ ВЫХОДА = 0
цикл пока !(ФЛАГ ВЫХОДА) {
чтение последующей строчки ВХТ
НАЙДЕНО = поиск кода в МНТ
если (НАЙДЕНО) {
МДИ = 1
УКАЗАТЕЛЬ = индекс из МНТ
Наполнение перечня характеристик АЛА
цикл {
УКАЗАТЕЛЬ ++
чтение след. строчки из МДТ
подстановка характеристик
вставка во ВХТ
} пока !(операция MEND)
по другому если !(операция MACRO) {
вывод строчки в ВЫХТ1
если (операция END) ФЛАГ ВЫХОДА = 1
}
по другому {
чтение идентификатора
запись имени и индекса в МНТ
МНТС ++
приготовить массив перечня АЛА
запись имени в МДТ
МДТС ++
цикл {
чтение последующей строчки ВХТ
подстановка индекса операторов
добавление в МДТ
МДТС ++
} пока !(операция MEND)
}
}
конец метода
ОПИСАНИЕ АЛГОРИТМА
данный метод является упрощением метода приведенного в [1], глава 4.3.2. Различие заключается в том, что современные средства интеллектуализации программирования дают нам возможность производить вставки и удаления из больших массивов с минимальными затратами процессорного времени, что было нереально при использовании перфокарт. Не считая того, скорость работы современных микропроцессоров так велика, что дозволяет создавать прямые вставки и удаления в массивах данных средней величины (скажем, до 64 кб) в режиме настоящего времени. Таковым образом, расширение начального макроса быть может впрямую вставлено в массив начального текста и обработано в расширенном виде. Таковая разработка дозволяет существенно упростить метод обработки макроязыка.
РЕАЛИЗАЦИЯ ВНУТРИ АССЕМБЛЕРА
Макропроцессор, описанный нами предназначался для обработки текста в режиме препроцессора, то-есть он делал полный просмотр входного текста, до того, как передать управление ассемблеру. Но макропроцессор также быть может реализован снутри первого прохода ассемблера. Таковая реализация дозволяет исключить промежные файлы, и дозволяет достигнуть на порядок большей интеграции макропроцессора и ассемблера методом объединения схожих функций. к примеру, может быть объединение таблиц имен макросов и имен кода операции; особый признак может указывать на то макро это либо интегрированная операция.
Главные достоинства включения макропроцессора в 1-ый просмотр состоят в последующем:
Почти все функции не нужно реализовывать два раза (к примеру, функции ввода-вывода, проверки на тип, и.т.п.)
В процессе обработки отпадает необходимость создавать промежные файлы либо массивы данных.
У программера возникают доп способности по совмещению средств ассемблера (к примеру, команды EUQ) вместе с макрокомандами.
Главные недочеты:
программка обязана добиваться больше оперативки, что критично на неких типах ЭВМ , не имеющих много оперативки.
Реализация подобного типа задачки может оказаться на порядок труднее, чем отдельная реализация ассемблера и макропроцессора.
Раздельно от рассмотрения реализации аппарата макросредств в ассемблер лежит рассмотрение доп просмотра, применяемого почти всеми программками для выявления определенных черт начальной программки, таковых как типы данных. Располагая таковым макропроцессором, можно применять команды условной компиляции, дозволяющие поставить расширение макрокоманд в зависимость от определенных черт программки.
ВЫВОДЫ
Макроязыки и надлежащие им макропроцессоры представляют собой самостоятельную форму языков программирования. При использовании вкупе с ассемблером, макропроцессор является для программера полезным инвентарем и по существу, дозволяет ему самому определять собственный язык “высокого” уровня.
Есть четыре главных задачки, решаемых макропроцессором:
Определение макроопределений
Хранение макроопределений
Определение макрокоманд
расширение макрокоманд и подстановка характеристик
Макропроцессор в ассемблере быть может реализован несколькими методами:
Независящий двухпросмотровый ассемблер
Независящий однопросмотровый ассемблер
машина — комплекс технических средств, предназначенных для автоматической обработки информации в процессе решения вычислительных и информационных задач) (либо вычислительной системы) которое делает арифметические и логические операции данные программкой преобразования инфы управляет вычислительным действием и коор, совмещенный с первым проходом обычного двухпросмотрового ассемблера.
ССЫЛКИ
В работе над рефератом использовалась последующая литература:
[1] Дж. Джордан — “Системное программирование”
[2] IBM OS/2 — “REXX Programmer’s Reference”
[3] Borland C++ — Included documentation and sources.
]]>