Page 21 - 4761
P. 21
Як зовнішня пам’ять можуть використовуватись різні носії: ОП, НМД і т.д. Сучасні
компілятори, як правило, прагнуть використовувати для збереження даних ОП, і тільки
при недостатньому об’ємі використовують дискові накопичувачі.
При виконанні кожного проходу компілятору доступна інформація, отримана в
результаті всіх попередніх проходів. Як правило, він прагне використовувати в першу
чергу інформацію, отриману на проході, безпосередньо виконану перед поточним, але
може звертатись і до даних, отриманих в більш ранніх проходах. Інформація, яку отримує
компілятор при виконанні проходів є недоступною для користувача. Вона зберігається або
в ОП, яка звільняється після завершення компіляції, або оформляється у вигляді
тимчасових файлів на диску, тому користувач не знає скільки проходів робить
компілятор. Проте кількість проходів – важлива технічна характеристика, тому
розробники компіляторів, як правило, вказують її на своїх продуктах. Ясна річ, що
розробники пропонують максимально зменшити кількість проходів, які виконує
компілятор. При цьому збільшується швидкість роботи компілятора, та зменшується
об’єм необхідної йому пам’яті. Однопрохідний компілятор – це ідеальний варіант.
Але скоротити число проходів не завжди вдається. Кількість необхідних проходів
визначається граматикою і семантичними правилами вхідної мови. Чим складніша
граматика мови, тим більше варіантів передбачають семантичні правила – тим більше
проходів буде виконувати компілятор.
Наприклад, компілятори мови Pascal працюють скоріше, ніж компілятори з мови С
– граматика мови Pascal більш проста, а семантичні правила – більш жорсткі.
Однопроходні компілятори – рідкість, вони для дуже простих мов. Реальні
-Х
-Х
-Х
-Х
компілятори виконують від 2 до 5 проходів. Найбільш поширені 2 і 3 прохідні
компілятори. Наприклад:
1. Перший прохід – лексичний аналіз.
2. Другий – синтаксичний розбір і семантичний аналіз.
3. Третій – генерація і оптимізація коду.
В сучасних системах програмування нерідко перший прохід компілятора
виконується з редагування коду вхідної програми.
2.5 Особливості побудови інтерпретаторів
Інтерпретатор – це програма, яка сприймає вхідну програму на вхідній мові і
виконує її.
Більшість інтерпретаторів виконують вхідну програму послідовно, по мірі її
поступлення на вхід інтерпретатора. Тут проявляється суттєва здатність інтерпретатора,
яка відрізняє його від компілятора, якщо інтерпретатор виконує команди по мірі їх
поступлення, то він не може виконувати оптимізацію вхідної програми. Отже, фаза
оптимізації в загальній структурі інтерпретатора буде відсутня. Правда, на останньому
етапі – генерації коду – машинні команди не записуються в об’єктний файл, а
виконуються по мірі їх надходження.
Відсутність кроку оптимізації визначає ще одну особливість, характерну для
багатьох інтерпретаторів: як внутрішнє представлення програми часто використовують
зворотній польський запис. Ця зручна форма представлення операцій має один суттєвий
недолік – вона погано піддається оптимізації. Проте в інтерпретаторах цього не потрібно.
Відсутність кроку оптимізації веде до того, що виконання програми за допомогою
інтерпретатора є менш ефективним , ніж за допомогою компілятора.
Перевагою інтерпретатора є незалежність виконання програми від архітектури
цільової обчислювальної системи.
19