Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
72
Добавлен:
27.03.2016
Размер:
3.38 Mб
Скачать

Висновки по виконаній роботі

В результаті лабораторної роботи № 3 побудований синтаксичний аналізатор на основі граматики операторного передування. Синтаксичний аналіз дозволяє перевіряти відповідність структури початкового тексту заданій граматиці вхідної мови. Синтаксичний аналіз дозволяє виявляти будь-які синтаксичні помилки у вхідній програмі. При наявності однієї помилки користувачеві видається повідомлення з вказівкою місцезнаходження помилки в вихіному тексті. Аналіз типу виявленої помилки не проводиться. За наявності декількох помилок в початковому тексті виявляється тільки перша з них, після чого подальший аналіз не виконується.

Результатом роботи синтаксичного аналізатора є структура даних, що представляє синтаксичне дерево. У комплексі з лексичним аналізатором, створеним при виконанні лабораторної роботи № 2, побудований синтаксичний аналізатор дозволяє виконувати підготовку даних, необхідних для виконання наступної лабораторної роботи, пов'язаної з генерацією кола.

ЛАБОРАТОРНА РОБОТА № 4

Генерація і оптимізація об'єктного коду

Мета роботи

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

Короткі теоретичні відомості

Загальні принципи генерації коду

Генерація об'єктного коду — це переклад компілятором внутрішнього представлення початкової програми в ланцюжок символів вихідної мови. Оскільки вихідною мовою компілятора (на відміну від транслятора) може бути тільки або мова «асемблер», або мова машинних кодів, то генерація коду породжує результуючу об'єктну програму на мові асемблера або безпосередньо на машинній мові (у машинних кодах).

Генерація об'єктного коду виконується після того, як виконані лексичний і синтаксичний аналіз програми і всі необхідні дії по підготовці до генерації коду: перевірені семантичні угоди вхідної мови (семамтичний аналіз), виконана ідентифікація імен змінних і функцій, розподілений адресний простір під функції і змінні.

У даній лабораторній роботі використовується гранично проста вхідна мова, тому немає необхідності виконувати всі перераховані перетворення. Вважатимемо, що всі вони вже виконані. Детальніше всі ці фази компіляції описані в (1-4,7), тут буде йти мова про самі примітивні прийоми семантичного аналізу, які будуть проілюстровані на прикладі виконання лабораторної роботи.

Внутрішнє представлення програми може мати будь-яку структуру залежно від реалізації компілятора, в той час як результуюча програма завжди є лінійною послідовністю команд. Тому генерація об'єктного кола (об'єктної програми) в любому випадку повинна виконувати дії, пов'язані з перетворенням складних синтаксичних структур в лінійні ланцюжки.

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

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

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

Сенс (семантику) кожній такій синтаксичній конструкції вхідної мови можна визначити, виходячи з її типу, а тип визначається синтаксичним аналізатором на основі граматики вхідної мови. Прикладами типів синтаксичних конструкцій можуть служити оператори циклу, умовні оператори, оператори вибору. Одні і ті ж типи синтаксичних конструкцій характерні для різних мов програмування, при цьому вони розрізняються синтаксисом (який задасться граматикою мови), але мають схожий сенс (який визначається семантикою). Залежно від типу синтаксичної конструкції виконується генерація кола результуючої програми, відповідного даній синтаксичній конструкції. Для семантично схожих конструкції різних вхідних мов програмування може породжуватися типовий результуючий код.