Смекни!
smekni.com

Структура и реализация макроязыков (стр. 1 из 4)

Московский Государственный Институт Электроники и Математики

кафедра САПР

Ре­фе­рат

Те­ма 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 яв­ля­ет­ся мак­ро­мет­ка­ми или сим­во­ла­ми сле­до­ва­ния и не по­яв­ля­ют­ся в вы­ход­ном тек­сте мак­ро­про­цес­со­ра. В мак­ро­язы­ке так­же мо­гут быть пре­ду­смот­ре­ны псев­до­ко­ман­ды ус­лов­но­го и без­ус­лов­но­го пе­ре­хо­да на псев­до-мет­ку, с ко­то­рой мак­ро­про­цес­сор про­дол­жит об­ра­бот­ку тек­ста про­грам­мы. Точ­но так же, как и в слу­чае вы­пол­не­ния про­грам­мы, опе­ра­то­ры пе­ре­хо­дов слу­жат для ука­за­ния вы­пол­не­ния опе­ра­то­ров про­грам­мы, опе­ра­то­ры мак­ро-пе­ре­хо­дов слу­жат для ука­за­ния по­ряд­ка компиляции тек­ста про­грам­мы. Это да­ет воз­мож­ность в про­цес­се рас­ши­ре­ния по­лу­чать кон­крет­ные ва­ри­ан­ты по­сле­до­ва­тель­но­стей ко­манд, со­от­вет­ст­вую­щие дан­но­му слу­чаю при­ме­не­ния мак­ро­ко­ман­ды. Вы­пол­не­ние пе­ре­хо­дов и про­ве­рок внут­ри вы­пол­няе­мо­го ко­да уве­ли­чи­ва­ет его раз­мер и вре­мя вы­пол­не­ния, в то вре­мя, как про­вер­ка и пе­ре­хо­ды в мак­ро­сах про­ис­хо­дят на ста­дии ком­пи­ля­ции и по­это­му не тре­бу­ют за­трат вре­ме­ни при вы­пол­не­нии ко­да. Эта воз­мож­ность из­би­ра­тель­ной вы­бор­ки нуж­ных час­тей тек­ста яв­ля­ет­ся од­ним из са­мых мощ­ных средств в сис­тем­ном про­грам­ми­ро­ва­нии.