ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Розробка загального ПО
         

     

    Інформатика, програмування
    Розробка загального програмного забезпечення

    Макромова І Макропорцесори

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

    дії (часто звані макро або макрос) є однорядковим скороченнями для групи команд. Використовуючи дії, програміст по суті визначає одну "команду" для представлення деякої послідовності команд.

    Визначаючи відповідні дії, оператор може зручним для себе чином вводити свої власні кошти більш високого рівня, не піклуючись про структуру системи. Він може досягти стислості і простоти управління системою, не втрачаючи при цьому основних переваг використання вихідної системи, такої, як наприклад мову асемблера. Великі макроопераціі спрощують користування, налагодження та модифікацію програм, і полегшують стандартизацію. Багато розробник обчислювальних машин використовують дії для автоматизації складання "відповідних" операційних систем в процесі, що зветься генерацією системи

    Макрокоманда

    У своїй простій формі Макрокоманда являє собою скорочення для позначення послідовності операцій

    Розглянемо наступний набір команд, взятий з макромови IDE для Borland C + + версії 3.1 (TEMC). Розглянемо наступну програму, написану за допомогою цих операцій

    Приклад 1

    .

    .

    .

    SetPrevPos;

    FixScreenPos;

    PageScreenUp;

    FixCursorPos;

    .

    .

    .

    SetPrevPos;

    FixScreenPos;

    PageScreenUp;

    FixCursorPos;

    .

    .

    .

    У наведеній програмі послідовність команд

    SetPrevPos;

    FixScreenPos;

    PageScreenUp;

    FixCursorPos;

    зустрічається двічі.

    Апарат макрокоманд дозволяє присвоїти цій послідовності ім'я і використовувати це ім'я замість неї. Також можна визначити деякий Макромова, що дозволяє розглядати дану конструкцію, як визначення і надалі використовувати це визначення.

    Фактично, Макропорцесори являє собою окремий мовний процесор зі своєю власною мовою.

    Формати макроозначень в різних системах може відрізнятися один від одного. У даному випадку послідовність команд, що визначає дії мають такий вигляд

    MACRO

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

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

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

    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 ()

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

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

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

    END;

    де це перерахування через кому всіх операндів макросу.

    Попередня програма в такому випадку може бути переписана наступним чином:

    Оригінальний текст

    Розширення вихідного тексту

    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 (х)

    і Макропорцесори згенерує відповідну послідовність виклику функції.

    РЕАЛІЗАЦІЯ

    Таким чином, нами був описаний варіант реалізації макромови. Розглянемо метод реалізації макромови. Як приклад візьмемо класичну мову макроассемблера.

    ПОСТАНОВКА ЗАВДАННЯ

    Будь-який процесор макрокоманд має вирішувати наступні чотири основні завдання:

    Розпізнавати макровизначеннями. Процесор макрокоманд повинен розпізнавати макровизначеннями, що виділяються відповідними псевдокомандамі. У мові макроассемблера цими псевдооператорамі є псевдокоманди MACRO і MEND. Це завдання може бути ускладнена тим, що всередині макроозначень можуть зустрічатися також інші макровизначеннями. Коли макровизначеннями вкладені, як було продемонстровано вище, Макропорцесори повинен правильно розпізнавати вкладення і зіставити початок і кінець макросу. Весь вкладений текст, включаючи і інші макровизначеннями визначає окрему дії.

    Запам'ятовувати макровизначеннями. Процесор повинен запам'ятати визначення макрокоманд, які будуть згодом використовуватися для розширення макровизовов

    Розпізнавати виклики. Необхідно також і розпізнавати макровизови, представлені у вигляді мнемонічне коду операції. Це передбачає, що імена макрокоманд обробляються на тих же самих підставах, як і один з кодів операції.

    Виконувати розширення макрокоманд і підстановку фактичних параметрів. Замість формальних параметрів макровизначеннями Макропорцесори повинен підставити відповідні операнди дії. Цей текст, у свою чергу може містити як дії так і макровизначеннями.

    Таким чином, Макропорцесори повинен розпізнавати і обробляти макровизначеннями і дії.

    Що ж до формальних параметрів, то тут потрібно прийняти декілька рішень. Необхідно визначити - чи можуть вони зустрічатися в якості коду операції, який синтаксис допустимих параметрів. У різних реалізаціях макромовою можуть зустрічатися різні варіанти методи реалізації подібних ситуацій, тому можна тільки дати деякі розумні варіанти, що покривають більшу частину можливих реалізацій. Формальні параметри можуть зустрічатися в макровизначеннями де завгодно, у тому числі і в команді і в коді операції. Ми хочемо, щоб була забезпечена можливість конкатенації формальних параметрів макровизначеннями з фіксованими символьними рядками. У такому разі постає питання про якийсь розділової символі, що забезпечує конкатенацію формальних параметрів і заданих користувачем символьних послідовностей.

    Наприклад, якщо з один з параметрів має бути з'єднаний з іншим (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 кілобайт) в режимі реального часу. Таким чином, розширення вихідного макросу може бути безпосередньо вставлено в масив вихідного тексту та оброблено у розширеному вигляді. Така технологія дозволяє значно спростити алгоритм обробки макромови.

    РЕАЛІЗАЦІЯ ВСЕРЕДИНІ Асемблер

    Макропорцесори, описаний нами призначався для обробки тексту в режимі препроцесора, тобто він виконував повний перегляд вхідного тексту, до того, як передати управління асемблеру. Але Макропорцесори також може бути реалізований всередині першого проходу асемблера. Така реалізація дозволяє виключити проміжні файли, і дозволяє досягти на порядок більшої інтеграції Макропорцесори і асемблера шляхом об'єднання подібних функцій. Наприклад, можливе об'єднання таблиць імен макросів та імен коду операції; спеціальний ознака може вказувати на те макро це чи вбудована операція.

    Основні переваги включення Макропорцесори в перший перегляд полягають у наступному:

    Багато функцій не треба реалізовувати двічі (наприклад, функції введення-виведення, перевірки на тип, тощо)

    У процесі обробки відпадає необхідність створювати проміжні файли або масиви даних.

    У програміста з'являються додаткові можливості щодо суміщення коштів асемблера (наприклад, команди EUQ) спільно з макрокоманд.

    Основні недоліки:

    Програма повинна вимагати більше оперативної пам'яті, що є критичним на деяких типах ЕОМ, що не мають багато оперативної пам'яті.

    Реалізація подібного типу задачі може опинитися на порядок складніше, ніж окрема реалізація асемблера і Макропорцесори.

    Окремо від розгляду реалізації апарату макросредств в асемблер лежить розгляд додаткового перегляду, що використовується багатьма програмами для виявлення певних характеристик вихідної програми, таких як типи даних. Маючи в своєму розпорядженні таким Макропорцесори, можна використовувати команди умовної компіляції, що дозволяють поставити розширення макрокоманд в залежність від певних характеристик програми.

    ВИСНОВКИ

    Макромова і відповідні їм Макропорцесори являють собою самостійну форму мов програмування. При використанні разом з асемблером, Макропорцесори є для програміста корисним інструментом і по суті, дозволяє йому самому визначати свою мову "високого" рівня.

    Існують чотири основні завдання, що вирішуються Макропорцесори:

    Розпізнавання макроозначень

    Зберігання макроозначень

    Розпізнавання макрокоманд

    Розширення макрокоманд і підстановка параметрів

    Макропорцесори в асемблері може бути реалізований кількома способами:

    Незалежний двухпросмотровий асемблер

    Незалежний однопросмотровий асемблер

    Процесор, поєднаний з першим проходом стандартного двухпросмотрового асемблера.

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status