Чим інтерпретація відрізняється від трансляції

Чим інтерпретація відрізняється від трансляції



ЦП Автоматизовані системи управління та промислова безпека

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

Підготовка програми починається з редагування файлу, що містить текст програми, який має стандартне розширення для цієї мови. Потім виконується його трансляція, яка включає кілька фаз: препроцесор , лексичний, синтаксичний, семантичний аналіз , генерація коду і його оптимізація. В результаті трансляції виходить об'єктний модуль - якийсь "напівфабрикат" готової програми, який потім бере участь у її збиранні. Файл об'єктного модуля має стандартне розширення ".obj". Компонування (складання) програми полягає в об'єднанні одного або кількох об'єктних модулів програми та об'єктних модулів, взятих з бібліотечних файлів та містять стандартні функції та інші корисні речі. В результаті виходить програма, що виконується у вигляді окремого файлу (завантажувальний модуль, програмний файл) зі стандартним розширенням - ".exe", який потім завантажується в пам'ять і виконується.

Трансляція та її фази

Власне, трансляція починається з лексичного аналізу програми.ЛЕКСИКА мови програмування - це правила "правопису слів" програми, таких як ідентифікатори, константи, службові слова, коментарі. Лексичний аналіз розбиває текст програми на вказані елементи. Особливість будь-якої лексики - її елементи є регулярні лінійні послідовності символів. Наприклад, ІДЕНТИФІКАТОР - це довільна послідовність букв, цифр та символу "_", що починається з букви або "_".

СЕМАНТИКА мови програмування – це сенс, який закладається у кожну конструкцію мови. Семантичний аналіз - це перевірка смислової правильності конструкції. Наприклад, якщо ми у виразі використовуємо змінну, то вона має бути визначена раніше за текстом програми, а з цього визначення може бути отриманий тип. Виходячи з типу змінної, можна говорити про допустимість операції з цією змінною.

Модульне програмування, компонування

Отриманий в результаті трансляції ОБ'ЄКТНИЙ МОДУЛЬ включає готові до виконання коди команд, адреси і вміст пам'яті даних. Але це стосується лише власних внутрішніх об'єктів програми (функцій та змінних). Звернення до зовнішніх функцій і змінних, які відсутні в даному фрагменті програми, не може бути повністю переведено у внутрішнє уявлення і залишається в об'єктному модулі у вихідному (текстовому) вигляді. Але якщо ці функції та змінні відсутні, значить, вони мають бути якимось чином отримані в інших об'єктних модулях. Найприродніший спосіб -написати їх на тому ж самому Сі і відтранслювати. Це і є принцип модульного програмування - подання тексту програми у вигляді декількох файлів, кожен з яких транслюється окремо.З модульним програмуванням ми стикаємося у двох випадках:

- коли самі пишемо модульну програму;

- коли використовуємо стандартні бібліотечні функції.

На закінчення відзначимо, що джерелом об'єктного модуля може бути не лише Си-програма, а й програма, написана будь-якою іншою мовою програмування, наприклад, на Ассемблері. Але в цьому випадку необхідні додаткові угоди щодо "стикування" викликів функцій та звернень до даних у різних мовах.

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

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

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

- для виконання програми, написаної певною формальною мовою після її компіляції необхідний інтерпретатор, який виконує цю програму, але вже записану вихідною мовою компілятора;

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

Вихідна мова компілятора може бути машинною мовою для комп'ютера з іншою архітектурою, ніж той, у якому компілятор працює. Такий компілятор називається КРОС-КОМПІЛЯТОРОМ, а сама система програмування КРОС-СИСТЕМОЮ. Такі системи застосовуються розробки програм для архітектур, які мають власних операційних систем чи систем програмування (контролери, управляючі мікропроцесори).

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

Створення шару програмної інтерпретації для деякої проміжної мови в практиці побудови трансляторів зазвичай зустрічається при спробі забезпечити сумісність наявного різноманіття мов програмування, операційних систем, архітектур і т.д. Тобто визначається деяка внутрішня проміжна мова, досить проста, щоб для неї можна було написати інтепретатор для всієї різноманітності операційних систем або архітектур.Потім пишеться одні (або кілька) компіляторів для однієї (або кількох) вхідних мов цей проміжний рівень. Наведемо приклади такої стандартизації:

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

- мова програмування Java аналогічно було розроблено задля забезпечення переносимості різних додатків серед Internet.

Структура транслятора

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

Окремі фази трансляції можуть бути пов'язані між собою по-різному, через дані в пам'яті або через файл, що не змінює сутності процесу:

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

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

Подібні статті

Останні статті

Категорії