Page 53 - 4761
P. 53
5 ГЕНЕРАЦІЯ ТА ОПТИМІЗАЦІЯ КОДУ
5.1 Загальні принципи генерації коду
Генерація об’єктивного коду – це перевід компілятором внутрішнього
представлення вхідної програми в ланцюг символів вихідної мови. Генерація об’єктивного
коду породжує результуючу об’єктну програму на мові асемблер або в машинних кодах.
Внутрішнє представлення програми може мати любу структуру залежно від
реалізації компілятора, а результуюча програма завжди представляє свою лінійну
послідовність команд. Тому генерація об’єктного коду виконує дії, пов’язані з
перетворенням складних синтаксичних структур в лінійні ланцюги.
Генерація коду можна вважати функцію, визначену на синтаксичному дереві і на
інформації, яка мінімізується в ТІ. Тому генерація об’єктивного коду виконується після
того, як виконано синтаксичний аналіз програми і всі необхідні дії по підготовці до
генерації коду: розподілений адресний простір під функції та змінні, перевірена
відповідність імен та типів змінних, констант і функцій в синтаксичних конструкціях
програми і т.д.
В ідеалі компілятор повинен виконати синтаксичний розбір всієї вхідної програми,
потім провести її синтаксичний аналіз, після чого приступити до підготовки генерації
коду і безпосередньо генерації. Але така схема роботи компілятора практично ніколи не
використовується. Справа в тому, що ні один семантичний аналізатор і ні один компілятор
не здатний проаналізувати і оцінити зміст всієї вхідної програми в цілому. Як правило,
компілятор виконує генерацію результуючого коду поетапно, на основі закінчених
синтаксичних конструкцій вхідної програми, породжує для неї фрагмент результуючого
коду і поміщає його в текст вихідної програми, до тих пір, поки не буде розібрана вхідна
програма.
Щоб компілятор міг побудувати код результуючої програми для синтаксичної
конструкції вхідної мови, часто використовують метод синтаксично керованим
перекладом-СК-переклад.
5.2 Синтаксично-керований переклад
СК-переклад – це основний метод породження коду результуючої програми на
основі результатів синтаксичного розбору (дерево розбору чи дерево операції).
Суть СК-перекладу в наступному: з кожною вершиною дерева синтаксичного
розбору N зв’язується ланцюг деякого проміжного коду C(N). Код для вершини N
будується шляхом конкатенації в фіксованому порядку послідовності коду C(N) і
послідовностей кодів, пов’язаних з усіма вершинами які є прямими нащадками вершини
N. В свою черг, для побудови послідовностей коду прямих нащадків вершини N потрібно
знайти послідовність коду для їхніх нащадків – нащадків другого рівня вершини N і т.д.
Процес переводу іде знизу вверх.
Для того щоб побудувати СК-переклад по заданому дереву синтаксичного розбору,
необхідно знайти послідовність коду для кореня дерева. Тому для кожної вершини дерева
ланцюг коду, який породжується треба вибирати таким чином, щоб код, який
приписується кореню дереву, був шуканим кодом для всього оператора, представленим
цим деревом.
В процесі СК-перекладу і СК-компіляції виробляються ланцюги тексту.
Схеми СК-перекладу
Розглянемо процедуру генерації коду по дереву операцій. Для побудови об’єктного
коду, при обході дерева необхідно дотримуватися принципу, що нижчележачі операції в
дереві завжди виконуються перед вищележачими.
51