Генерація проміжного
Коду
На початковій стадії компіляції вихідна програма транслюється в проміжне представлення, з якого на заключній стадії генерується цільовий код. Деталі цільової мови по можливості зосереджені на заключній стадії компілятора. Хоча вихідна програма і може транслюватися безпосередньо в цільову мову, використання проміжного, що не залежить від конкретної машини представлення має визначені переваги.
Полегшується перенос на іншу цільову машину; компілятор для іншої цільової
машини може бути створений підключенням заключної стадії для нової ма
шини до наявної початковий,
До проміжного представлення можна застосувати машинно-незалежний опти-мізатор коду (такі оптимізатори докладно розглядаються в главі 10, "Оптимізація коду").
У цій главі показано, яким чином можна використовувати синтаксично керовані методи з глав 2, "Простий однопрохідний компілятор", і 5, "Синтаксично керована трансляція", для трансляції в проміжне представлення таких конструкцій мови програмування, як оголошення, чи присвоєння інструкції керування потоком. Для простоти ми вважаємо, що вихідна програма вже розібрана і всі статичні перевірки виконані, як показано на мал. 8.1. Більшість синтаксично керованих визначень у цій главі може бути реалізоване як у процесі висхідного, так і спадного розбору з використанням технологій, описаних у главі 5, "Синтаксично керована трансляція"; так що генерація проміжного коду при бажанні може бути включена в синтаксичний аналіз.
8.1. Мови проміжних представлень.
Синтаксичні дерева і постфіксний запис, введені в розділах 5.2 і 2.3, являють собою два типи проміжного представлення. У цій главі буде використовуватися третій тип - трьохадресний код. Семантичні правила генерації трьохадресного коду для основних конструкцій мов програмування схожі з правилами побудови синтаксичних дерев чи генерації постфіксного запису.
Графічне представлення
Синтаксичне дерево зображує природну ієрархічну структуру вихідної програми. Даг дає ту ж інформацію, але в більш компактному виді (однакові подвирази в ньому об'єднані). На мал. 8.2 приведені синтаксичне дерево і даг для інструкції присвоєння а:= b*-с+b*-с.