Структура и реализация макроязыков
Рефераты >> Программирование и компьютеры >> Структура и реализация макроязыков

МАК­РО­ЯЗЫК И МАК­РО­ПРО­ЦЕС­СОР

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

Мак­ро­ко­ман­ды (час­то на­зы­вае­мые мак­ро или мак­рос) яв­ля­ют­ся од­но­строч­ны­ми со­кра­ще­ния­ми для груп­пы ко­манд. Ис­поль­зуя мак­ро­ко­ман­ду, про­грам­мист по су­ще­ст­ву оп­ре­де­ля­ет од­ну “ко­ман­ду” для пред­став­ле­ния не­ко­то­рой по­сле­до­ва­тель­но­сти ко­манд.

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

МАК­РО­КО­МАН­ДЫ

В сво­ей про­стей­шей фор­ме мак­ро­ко­ман­да пред­став­ля­ет со­бой со­кра­ще­ние для обо­зна­че­ния по­сле­до­ва­тель­но­сти опе­ра­ций

Рас­смот­рим сле­дую­щий на­бор ко­манд, взя­тый из мак­ро­язы­ка 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>)

-----------------


Страница: