: Структура и реализация макроязыков

       Московский Государственный Институт Электроники и Математики       
                               кафедра САПР                               
                                Ренфенрат                                
     Тенма III
     Разнранботнка обнщенго пронграмнмнонго обеснпенченния
     Занданние 3.2
     Вы разнранбантынваенте макнронязык для сиснтенмы. Обосннуйнте
эфнфекнтивнность иснпольнзонванния макнронсредств. Канкие тинпы макнронсредств
донпуснканютнся ваншим макнронязынком?  Сфорнмунлинруйнте ментонды понстроенния
пронграмнмы, обнранбантынваюнщей макнронязык
     Преподаватель:
     Зайцева Л. В.
     Студент: 
     Омельченко С. А.
                 МАКнРОнЯЗЫК И МАКнРОнПРОнЦЕСнСОР                 
Опенрантор, ранбонтаюнщий в канкой-линбо сиснтенме, часнто встренчанетнся с
ненобнхондинмонстью понвтонрять ненконтонрые понслендонвантельннонсти
дейнстнвий мнонго раз? Танкая понслендонвантельнность монжет, нанпринмер,
сонстонять из ввонда ненконтонрой текнстонвой понслендонвантельннонсти,
нанжантии опнренденленнной понслендонвантельннонсти кланвиш, вынполнненнии
одннонтипннонго рянда канких-линбо арифнментинченских опенранций. В
пондобнных слунчанях часнто можнно воснпольнзонватьнся апнпанрантом
макнронконманд.
     Макнронконманнды (часнто нанзынваенмые макнро или макнрос
) явнлянютнся одннонстрочннынми сонкранщенниянми для групнпы конманд.
Иснпольнзуя макнронконманнду, пронграмнмист по сунщенстнву опнренденлянет однну
УконманндуФ для преднставнленния ненконтонрой понслендонвантельннонсти конманд.
Опнренденляя сонотнветнстнвуюнщие макнронконманнды, опенрантор монжет удобнным
для сенбя обнранзом ввондить свои собнстнвеннные среднстнва бонлее вынсонконго
уровння, не занбонтясь о струкнтунре сиснтенмы. Он монжет доснтигннуть
кратнконсти и пронстонты управнленния сиснтенмой, не тенряя при этом оснновнных
преимуществ иснпольнзонванния иснходнной сиснтенмы, танкой, как нанпринмер язык
аснсембнленра. Крупнные макнронопенранции упнронщанют польнзонванние, отнладнку
и мондинфинканцию пронграмм, и обнлегнчанют станндарнтинзанцию. Мнонгие
разнранботнчик вынчиснлинтельнных маншин иснпольнзунют макнронконманнды для
авнтонмантинзанции сонставнленния УподнхондянщихФ опенранциноннных сиснтем в
пронцеснсе, нанзынваенмом генненранциней сиснтенмы
     
     
     МАКнРОнКОнМАНнДЫ
В своней пронстейншей форнме макнронконманнда преднставнлянет сонбой
сонкранщенние для обонзнанченния понслендонвантельннонсти опенранций
Раснсмотнрим слендуюнщий нанбор конманд, взянтый из макнронязынка IDE для
Borland C++ вернсии 3.1 (TEMC). Раснсмотнрим слендуюнщую пронграмнму,
нанпинсаннную с понмонщью этих опенранций
Принмер 1
.
.
.
SetPrevPos;
FixScreenPos;
PageScreenUp;
FixCursorPos;
.
.
.
SetPrevPos;
FixScreenPos;
PageScreenUp;
FixCursorPos;
.
.
.
В принвенденнной пронграмнме понслендонвантельнность конманд
SetPrevPos;
FixScreenPos;
PageScreenUp;
FixCursorPos;
встренчанетнся дванжнды.
Апнпанрат макнронконманд понзвонлянет принсвонить этой
понслендонвантельннонсти имя и иснпольнзонвать это имя вменсто нее. Можнно
такнже опнренденлить ненконтонрый макнронязык, понзвонляюнщий
раснсматнринвать даннную коннстнрукнцию, как опнренденленние и в дальннейншем
иснпольнзонвать это опнренденленние.
Факнтинченски, макнронпронцеснсор преднставнлянет сонбой отдельный язынконвой
пронцеснсор со своним собнстнвеннным язынком.
Форнманты макнронопнренденленний в разнличнных сиснтенмах монжет
отнлинчатьнся друг от друнга. В даннном слунчае понслендонвантельнность
конманд, опнренденляюнщая макнронконманнду именет слендуюнщий форнмат
     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; Танкой пронцесс занменны нанзынванетнся расншинреннинем макнронконманнды. Занментим, что санмо макнронопнренденленние не понявнлянетнся в расншинреннии иснходннонго текнста. Опнренденленние сонхраннянетнся макнронпронцеснсонром. Вхонжнденние в иснходнную пронграмнму именни макнронконманнды как мненмоннинки опенранции нанзынванетнся макнронвынзонвом. ОПЕнРАнТОнРЫ МАКнРОнКОнМАНД Апнпанрат макнронконманд в том винде, как он был опинсан до сих пор, понзвонлянет поднставнлять понслендонвантельннонсти конманд вменсто макнронвынзонвов, принчем все обнранщенния к макнронопнренденленнию бундут занменненны иденнтичннынми понслендонвантельннонстянми конманд. Танкой апнпанрат нендоснтанточнно гинбок: в макнронвынзонве нет средств мондинфинцинронвать конды, контонрые его занменнянют. Сунщенстнвеннное расншинренние вознможннонстей макнронсредств доснтинганетнся донбавнленнинем опенранндов (панранметнров) макнронконманд. Раснсмотнрим слендуюнщую пронграмнму: Принмер 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 явнлянетнся макнронметнканми или симнвонланми слендонванния и не понявнлянютнся в вынходнном текнсте макнронпронцеснсонра. В макнронязынке такнже монгут быть прендунсмотнренны псевндонконманнды уснловннонго и безнуснловннонго пенренхонда на псевндо-метнку, с контонрой макнронпронцеснсор прондолнжит обнранботнку текнста пронграмнмы. Точнно так же, как и в слунчае вынполнненния пронграмнмы, опенрантонры пенренхондов слунжат для уканзанния вынполнненния опенрантонров пронграмнмы, опенрантонры макнро-пенренхондов слунжат для уканзанния понряднка компиляции текнста пронграмнмы. Это данет вознможнность в пронцеснсе расншинренния понлунчать коннкретнные ванринаннты понслендонвантельннонстей конманд, сонотнветнстнвуюнщие данннонму слунчаю принменненния макнронконманнды. Вынполнненние пенренхондов и пронвенрок внутнри вынполнняенмонго конда увенлинчинванет его разнмер и вренмя вынполнненния, в то вренмя, как пронвернка и пенренхонды в макнронсах прониснхондят на стандии комнпинлянции и понэтонму не тренбунют зантрат вренменни при вынполнненнии конда. Эта вознможнность изнбинрантельнной вынборнки нужнных часнтей текнста явнлянетнся однним из санмых мощнных средств в сиснтемнном пронграмнминронваннии. МАКнРОнВЫнЗОнВЫ ВНУТнРИ МАКнРОнОПнРЕнДЕнЛЕнНИЯ Понскольнку макнронопнренденленния явнлянютнся, по сунти, УсонкранщенниянмиФ для понслендонвантельннонсти конманд, то понлезнным свойнстнвом бынла бы вознможнность пронизнвондить танкие УсонкранщеннияФ внутнри санмих макнронопнренденленний. Принмер 5: . . . MACRO Mac1 SetPrevPos; CursorCharRight; END . . . MACRO Mac2 Mac1 Mac1 END . . . Внутнри макнронопнренденленния Mac2 дванжнды прониснхондит ссылнка на макнронопнренденленние Mac1. Это понмогнло нам уменьншить длинну макнронопнренденленния Mac2 и сденланло его бонлее легнким для поннинманния. Танкое иснпольнзонванние макнронсредств принвондит к макнронрасншинренниням на ненскольнких уровннях влонженннонсти, нанпринмер:

Иснходнный текст

Расншинренние иснходннонго текнста (уронвень 1)

Расншинренние иснходннонго текнста (уронвень 2)

.

.

.

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(х) и макнронпронцеснсор сгенненринрунет сонотнветнстнвуюнщую понслендонвательнность вынзонва функнции. РЕАнЛИнЗАнЦИЯ Танким обнранзом, нанми был опинсан ванринант реанлинзанции макнронязынка. Раснсмотнрим ментод реанлинзанции макнронязынка. В канченстнве принменра возьнмем класнсинченский язык макнронаснсембнленра. ПОнСТАнНОВнКА ЗАнДАнЧИ Люнбой пронцеснсор макнронконманд долнжен реншать слендуюнщие чентынре оснновнные занданчи: 1. Раснпонзнанвать макнронопнренденленния. Пронцеснсор макнронконманд долнжен раснпонзнанвать макнронопнренденленния, вынденляенмые сонотнветнстнвуюнщинми псевндонконманнданми. В язынке макнронаснсембнленра этинми псевндонопенрантонранми явнлянютнся псевндонконманнды MACRO и MEND. Эта занданча монжет быть уснложнненна тем, что внутнри макнронопнренденленний монгут встренчатьнся такнже друнгие макнронопнренденленния. Конгда макнронопнренденленния влонженны, как бынло пронденмоннстнринронванно вынше, макнронпронцеснсор долнжен пранвильнно раснпонзнанвать влонженния и сонпоснтанвить нанчанло и коннец макнронса. Весь влонженнный текст, вклюнчая и друнгие макнронопнренденленния опнренденлянет отндельнную макнронконманнду. 2. Занпонминнать макнронопнренденленния. Пронцеснсор долнжен занпомннить опнренденленния макнронконманд, контонрые бундут впонследнстнвии иснпольнзонватьнся для расншинренния макнронвынзонвов 3. Раснпонзнанвать вынзонвы. Ненобнхондинмо такнже и раснпонзнанвать макнронвынзонвы, преднставнленнные в винде мненмоннинченсконго конда опенранции. Это преднпонланганет, что именна макнронконманд обнранбантынванютнся на тех же санмых осннонваннинях, как и один из кондов опенранции. 4. Вынполннять расншинренние макнронконманд и поднстанновнку факнтинченских панранметнров. Вменсто форнмальнных панранметнров макнронопнренденленния макнронпронцеснсор долнжен поднстанвить сонотнветнстнвуюнщие опенраннды макнронконманнды. Этот текст, в свою оченредь монжет сондернжать как макнронконманнды так и макнронопнренденленния. Танким обнранзом, макнронпронцеснсор долнжен раснпонзнанвать и обнранбантынвать макнронопнренденленния и макнронконманнды. Что же кансанетнся форнмальнных панранметнров, то тут нужнно приннять ненскольнко реншенний. Ненобнхондинмо опнренденлить - монгут ли они встренчатьнся в канченстнве конда опенранции, канков синнтакнсис донпуснтинмых панранметнров. В разнных реанлинзанцинях макнронязынков монгут встренчатьнся разнные ванринаннты ментонды реанлинзанции пондобнных синтуанций, понэтонму можнно тольнко дать ненконтонрые ранзумнные ванринаннты, понкрынваюнщие больншую часть вознможнных реанлинзанций. Форнмальнные панранметнры монгут встренчатьнся в макнронопнренденленнии где угоднно, в том чиснле и в конманнде и в конде опенранции. Мы хонтим, чтонбы бынла обеснпенченна вознможнность коннкантеннанции форнмальнных панранметнров макнронопнренденленния с фикнсинронванннынми симнвольннынми стронканми. В танком слунчае встанет вонпрос о ненконем разнденлинтельнном симнвонле, обеснпенчинваюнщем коннкантеннанцию форнмальнных панранметнров и занданнных польнзонвантенлем симнвольнных понслендонвантельннонстей. Нанпринмер, еснли из один из панранметнров долнжен быть сонединнен с друнгим (macro[x,y] = xy), то вознмонжен синнтакнсис x&y, что озннанчанет коннкантеннанцию форнмальннонго панранметнра x с форнмальнным панранметнром y. Этот слунчай не вынзынванет больнших трудннонстей. Гонразндо сложнней обнранбантынванетнся слунчай, конгда речь идет о поднстанновнке панранметнра внутнри симнвольнной стронки. В танком слунчае вознможнным вынхондом бундет коннкантеннанция по умолнчаннию двух понслендонвантельнно друг за друнгом идунщих симнвольнных строк, а такнже пренобнранзонванние форнмальннонго панранметнра, занклюнченннонго в скобнки к симнвольнной стронке. Танким обнранзом, еснли мы хонтим, чтонбы в макнронсе фингунринронванла стронка винда Уblablabla[x]xxxxxФ, где [x] должнно занменнятьнся форнмальнным панранметнром вполнне вознможнно занменнить стронку танконго винда стронкой тинпа УblablablaФ(x)ФxxxxxФ. Нандо занментить, что мнонженстнво занменчантельнных идей по реанлинзанции пондобнных макнронязынков реанлинзонванно в язынке REXX, подндернжинваенмом на сиснтемнном уровнне опенранциноннной сиснтенмой OS/2 комнпаннии IBM. Такнже для вынполнненния функнций уснловнных пенренхондов должнны вынчиснлятьнся ненконтонрые арифнментинченские вынранженния (возьнмем в принмер хонтя бы обыкннонвеннных счетнчик). Танким обнранзом часнто оканзынванетнся понлезнной вознможнность иснпольнзонванния псевндо- пенренменнных вренменни комнпинлянции внутнри макнронсов. ДВУнПРОСнМОТнРОнВЫЙ АЛнГОнРИТМ Начннем с ненконтонрых упнронщаюнщих преднпонлонженний. Бундем счинтать, что наш макнронпронцеснсор функнционнальнно нензанвинсим от оснновннонго комнпинлянтонра и его текст бундет пенренданватьнся этонму комнпинлянтонру. Снанчанла не разнреншим макнронвынзонвы и макнронопнренденленния внутнри макнронопнренденленний. Макнронпронцеснсор, как и язык аснсембнленра, пронсматнринванет и обнранбантынванет стронки текнста. Но в язынке все стронки свянзанны аднренсанциней - однна стронка монжет ссынлатьнся на друнгую при понмонщи аднренса или именни, контонрое должнно быть УизнвестнноФ аснсембнленру. Бонлее тонго, аднрес присваеваемый канжндой отндельнной стронке занвинсит от сондернжинмонго, конлинченстнва и аднренсов предншенстнвуюнщих строк. Еснли раснсматнринвать макнронопнренденленние, как единный обънект, то можнно сканзать, что стронки наншенго макнронопнренденленния не так сильнно взаинмонсвянзанны. Макнронопнренденленния не монгут ссынлатьнся на обънекнты вонвне этонго макнронопнренденленния. Преднпонлонжим, что в тенле макнронопнренденленния есть стронка INCR X, принчем пенред этой конманндой панранметр Х понлунчил знанченние 10. Макнронпронцеснсор не пронизнвондит синнтакнсинченский ананлиз, а пронизнвондит пронстую текнстонвую поднстанновнку вменсто УХФ поднставнлянетнся У10Ф. Наш алнгонритм бундет вынполннять 2 сиснтенмантинченских пронсмотнра входннонго текнста. В пернвый пронход бундут дентернминнинронванны все макнронопнренденленния, во втонрой пронход бундут отнкрынты все ссылнки на макнронсы. Так же, как и язык аснсембнленра не монжет вынполннить ссылнку на симнвол до тонго монменнта, как он встрентит этот симнвол, язык макнронконманд не монжет вынполннить расншинренние до тех пор, понка не встрентит сонотнветнстнвуюнщее макнронопнренденленние. Во вренмя пернвонго пронсмотнра пронвенрянетнся канжндый код опенранции, макнронопнренденленния занпонминнанютнся в табнлинце макнронопнренденленний, а конпия иснходннонго текнста без макнронопнренденленний занпонминнанетнся во внешнней панмянти, для иснпольнзонванния ее при втонром пронхонде. Понминмо табнлинцы макнронопнренденленний во вренмя пернвонго пронхонда бундет такнже табнлинца имен, во втонрой пронход она бундет иснпольнзонватьнся для вынденленния макнронопенранций и расншинренния их до текнста сонотнветнстнвуюнщенго макнронопнренденленния. ДАНнНЫЕ ДЛЯ ПЕРнВОнГО ПРОнСМОТнРА 1. ВХТ - Входнной текст 2. ВЫХ1 - Вынходнная конпия текнста для иснпольнзонванния во втонрой пронход. 3. МДТ - табнлинца макнронопнренденленний, в контонрой храннятнся тенла макнронопнренденленний 4. МНТ - таблица имен, ненобнхондинмая для хранненния имен макнронконманд, опнренденленнных в МНТ 5. МДТС - счетнчик для табнлинцы МДТ 6. МНТС - счетнчик для табнлинцы МНТ 7. АЛА - маснсив спинска панранметнров для поднстанновнки инндекснных марнкенров вменсто форнмальнных панранметнров, пенред занпонминнаннинем опнренденленния. ДАНнНЫЕ ДЛЯ ВТОнРОнГО ПРОнСМОТнРА 1. ВЫХ1 - Вынходнная конпия текнста понслен пернвонго пронхонда 2. ВЫХ2 - Вынходнная конпия текнста понслен второнго пронхонда 3. МДТ - табнлинца макнронопнренденленний, в контонрой храннятнся тенла макнронопнренденленний 4. МНТ - таблица имен, ненобнхондинмая для хранненния имен макнронконманд, опнренденленнных в МНТ 5. МДТС - счетнчик для табнлинцы МДТ 6. МНТС - счетнчик для табнлинцы МНТ 7. АЛА - маснсив спинска панранметнров для поднстанновнки инндекснных марнкенров вменсто форнмальнных панранметнров, пенред занпонминнаннинем опнренденленния. АЛГОРИТМ Нинже принвенденна форнмальнная занпись сонотнветнстнвуюнщих алнгонритнмов обнранботнки макнронопнренденленний двухнпронсмотнронвым спонсонбом. Канжндый из алнгонритнмов осунщенстнвнлянет понстрочнный пронсмотр входннонго текнста. ПЕРнВЫЙ ПРОнСМОТР - МАКнРОнОПнРЕнДЕнЛЕнНИЯ: Алнгонритм пернвонго пронсмотнра пронвенрянет канжндую стронку входннонго текнста. Еснли она преднставнлянет сонбой псевндонопенранцию MACRO, то все слендуюнщие за ней стронки занпонминнанютнся в блинжайнших свонбоднных ячейнках МДТ. Пернвая стронка макнронопнренденленния - это имя санмонго макнронса. Имя заннонситнся в таблицу имен МНТ с инндекнсом этой стронки в МДТ. При этом прониснхондит такнже поднстанновнка нонменров форнмальнных панранметнров, вменсто их имен. Еснли в тенченние пронсмотнра встренчанетнся конманнда 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. Многие функции не надо реализовывать дважды (например, функции ввода- вывода, проверки на тип, и.т.п.) 2. В процессе обработки отпадает необходимость создавать промежуточные файлы или массивы данных. 3. У программиста появляются дополнительные возможности по совмещению средств ассемблера (например, команды EUQ) совместно с макрокомандами. Основные недостатки: 1. Программа должна требовать больше оперативной памяти, что критично на некоторых типах ЭВМ, не имеющих много оперативной памяти. 2. Реализация подобного типа задачи может оказаться на порядок сложнее, чем отдельная реализация ассемблера и макропроцессора. Отдельно от рассмотрения реализации аппарата макросредств в ассемблер лежит рассмотрение дополнительного просмотра, используемого многими программами для выявления определенных характеристик исходной программы, таких как типы данных. Располагая таким макропроцессором, можно использовать команды условной компиляции, позволяющие поставить расширение макрокоманд в зависимость от определенных характеристик программы. ВЫВОДЫ Макроязыки и соответствующие им макропроцессоры представляют собой самостоятельную форму языков программирования. При использовании вместе с ассемблером, макропроцессор является для программиста полезным инструментом и по существу, позволяет ему самому определять свой язык УвынсонконгоФ уровня. Существуют четыре основных задачи, решаемых макропроцессором: 1. Распознавание макроопределений 2. Хранение макроопределений 3. Распознавание макрокоманд 4. Расширение макрокоманд и подстановка параметров Макропроцессор в ассемблере может быть реализован несколькими способами: 1. Независимый двухпросмотровый ассемблер 2. Независимый однопросмотровый ассемблер 3. Процессор, совмещенный с первым проходом стандартного двухпросмотрового ассемблера. ССЫЛКИ В работе над рефератом использовалась следующая литература: [1] Дж. Джорндан - УСиснтемнное пронграмнминронванниеФ [2] IBM OS/2 - УREXX ProgrammerТs ReferenceФ [3] Borland C++ - Included documentation and sources.