Сторінка
6
Не дивлячись на вказані недоліки, транслятори-інтерпретатори набули достатнього поширення, оскільки вони підтримують діалоговий режим, що особливо зручно при розробці і від ладці вихідних програм. Крім того, інтерпретатори легко розробляти, і вони обходяться дешевшим, ніж компілятори з тієї ж мови.
В разі багатократного рішення задачі, коли швидкодія роботи обчислювальної системи має істотне
значення, доцільно використовувати інший принцип - компіляцію.
При компіляції процеси трансляції і виконання розділені в часі: спочатку вихідна програма повністю перекладається машинною мовою (після чого наявність транслятора в оперативній пам'яті стає непотрібною), а потім програма, що від транслює, може багато разів виконуватися. Отже, для однієї і тієї ж програми трансляція методом компіляції забезпечує вищу продуктивність обчислювальної системи при скороченні необхідної оперативної пам'яті.
Велика складність в розробці компілятора в порівнянні з інтерпретатором з тієї ж самої мови пояснюється тим, що компіляція програми включає дві дії: аналіз, тобто визначення правильності запису вихідної програми відповідно до правил побудови мовних конструкцій вхідної мови, і синтез - генерування еквівалентної програми в машинних кодах. Трансляція методом компіляції вимагає неодноразового "перегляду" трансльованої програми, тобто транслятори-компілятори є багато прохідними: при першому проході вони перевіряють коректність синтаксису мовних конструкцій окремих операторів незалежно один від одного, при подальшому проході - коректність синтаксичних взаємозв'язків між операторами і так далі
Отримана в результаті трансляції методом компіляції програма називається об'єктним модулем, який є еквівалентною програмою в машинних кодах, але не "прив'язану" до конкретних адрес оперативної пам'яті. Тому перед виконання об'єктний модуль має бути оброблений спеціальною програмою операційної системи (редактором зв'язків) і перетворений в завантажувальний модуль, тобто програмний модуль з відносними адресами.
Завантажувальний модуль може мати просту, оверлейну або динамічну структуру.
Модуль простої структури складається з єдиного завантажувального модуля, сформованого редактором зв'язків. Цей модуль перед виконання цілком завантажується в оперативну пам'ять і включає всі необхідні для його роботи команди. Модулі простої структури найбільш ефективні з точки зору продуктивності, оскільки в ході виконання вимагають мінімального втручання програми ОС, що управляє.
Якщо програма функціонально досить складна або велика по розмірах, то вона реалізується у вигляді модулів (сегментів) оверлейної структури (структури "з перекриттям"). Завантажувальний модуль оверлейної структури складається з оверлейних сегментів і містить інформацію, використовувану оверлейним супервізором для завантаження окремих сегментів в основну пам'ять. При цьому різні сегменти такої програми можуть повторно використовувати одну і ту ж область оперативної пам'яті. Оверлейна організація модулів менш ефективна з точки зору часу їх виконання, оскільки вимагає більшого втручання програми ОС, що управляє.
При виконанні модулів простій і оверлейної структури програма ОС, що управляє, не здійснює виклик інших завантажувальних модулів, і в цьому вони поступаються динамічній організації модулів. При виконанні завантажувальних модулів динамічної структури можуть з'являтися запити на інші завантажувальні модулі, і програма ОС, що управляє, може почати завантаження цих модулів в оперативну пам'ять ще до завершення виконання попереднього модуля. Програмні модулі, що завдяки цьому викликаються, можуть виконуватися як послідовно, так і паралельно, що підвищує швидкодію програми.
Разом з розглянутими вище трансляторами-інтерпретаторами і трансляторами-компіляторами на практиці використовуються також транслятори інтерпретатори-компілятори, які об'єднують в собі достоїнства обох принципів трансляції: на етапі розробки і від ладки програм транслятор працює в режимі інтерпретатора, а після завершення процесу від ладки вихідна програма повторно транслюється в об'єктний модуль (тобто вже методом компіляції). Це дозволяє значно спростити і прискорити процес складання і від ладки програм, а за рахунок подальшого здобуття об'єктного модуля забезпечити ефективнішого виконання програми.
Враховуючи, що ефективність програм, що отримуються за допомогою високорівневих мов програмування, може значно поступатися аналогічним програмам, складеним на мовах низького рівня, у ряді випадків використовуються оптимізуючи транслятори (оптимайзери), які після завершення компіляції здійснюють оптимізацію об'єктного модуля.
Наприклад, хороший компілятор здатний розпізнати недбалість програміста і виключити з циклу «статичні»
обчислення. Під «статичними» обчисленнями розуміється виконання в циклі певної операції, результат якої не залежить від ітерацій циклу. Розпізнавши таку конструкцію, компілятор виводить її за рамки циклу. Цей тип оптимізації називається переміщенням виразів.
Іншим складнішим виглядом оптимізації є усунення невживаної коди. Компілятор знаходить операторів, які не виконуються ні за яких умов, і не включає їх у виконуваний код.