Передмова#

Система компіляції GNAT є повною реалізацією мови Ada95 для різних машин і операційних систем. GNAT є частиною набору компіляторів GCC, і як така вона поширюється під публічною ліцензією GNU, з відповідними модифікованими бібліотечними ліцензіями, які дозволяють її повноцінне використання у промисловому контексті.

Система GNAT була вперше розроблена як академічний проект в Нью-Йоркському університеті (спочатку це була абревіатура для GNU NYU Ada Translator, але зараз це назва без зашифрованого значення). Ada Core взяла на себе підтримку та розвиток системи з 1995 року. Одна з версій системи зараз є частиною вихідних текстів GCC, що зробило Аду 95 однією з основних мов GCC.

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

Розуміння системи компіляції вимагає опанування двох взаємодоповнюючих предметів: семантики мови програмування, що реалізується, та алгоритмів, які реалізують трансляцію і втілюють семантику часу виконання. Ми побудували цей документ таким чином, щоб він слугував сполучною ланкою між двома джерелами, які є найвищими авторитетами у кожній з цих дисциплін: довідником з Ada95 та повними вихідним кодом GNAT. Ми сподіваємося, що користувач цього документа буде використовувати ARM і GNAT, як йому підкажуть потреба і цікавість. З цієї причини у документі міститься дуже багато посилань на обидва джерела, об’єднаних у гіпертекст, який є гнучким, достатньо повним і зручним для навігації.

Генератором коду для GNAT є GCC back-end, портативність якого дозволила впровадити GNAT на багатьох платформах. Архітектура GCC була предметом багатьох публікацій, і ми не обговорюємо її тут. Тому ця книга присвячена лише зовнішньому інтерфейсу повноцінної системи компіляції. Це досить велике завдання!

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

Аудиторія#

Книга має зацікавити програмістів-практиків, які цікавляться технологією компіляторів, експертів з мови, які хочуть вивчити реалізацію складних конструкцій у сучасній мові програмування, авторів компіляторів, які шукають нові ідеї, а також інженерів-програмістів, які цікавляться мовою Ада95, паралельним, розподіленим програмуванням і системами реального часу. Нарешті, книга буде корисною для тих, хто хоче поекспериментувати з розширеннями мови і модифікувати частини GNAT для реалізації нових конструкцій в Ada95 або в майбутній версії мови Ada 2005.

В освітньому контексті інтерфейс GNAT є цікавим доповненням до курсів з мов програмування, компіляторів та операційних систем. Інтерфейс GNAT перекладає сучасну, складну імперативну мову з багатою системою типів, об’єктно-орієнтованими можливостями та універсальністю. Ці центральні аспекти сучасних мов (Ada95, C++, Java, C# і т.д.) рідко обговорюються детально у текстах, присвячених компіляторам. Користувач цієї книги знайде у ній стислий виклад основних варіантів реалізації, зроблених у GNAT, а також вказівки на детальні алгоритми у вихідних текстах.

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

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

Використання цієї книги#

Для того, щоб полегшити користування книгою, вона поширюється у кількох форматах: HyperText Markup Language (HTML), PostScript (PS) та Portable Document Format (PDF). Версія у форматі HyperText є рекомендованим форматом, оскільки вона пов’язана з джерелами GNAT, що дозволяє читачеві проаналізувати додаткові деталі, які не обговорюються в цій книзі. Інші формати полегшують її друк.

Структура книги#

Книга складається з чотирьох частин:

  • Частина I: Вступ. У трьох розділах цієї частини представлено огляд системи компіляції GNAT, архітектуру інтерфейсу, структури даних, що використовуються в абстрактному представленні програми, а також методи діагностики та виправлення помилок, реалізовані в синтаксичному та семантичному аналізаторах GNAT.

  • Частина II: Семантичний аналіз. Тут ми обговорюємо стратегії реалізації більш цікавих і складних аспектів мови, з точки зору їх перекладу в низькорівневе цільове незалежне представлення. Теми включають аналіз області дії та видимості, перевірку типу та перевантаження, дискримінатори, узагальнені модулі та правила заморожування.

  • Частина III: Розширення. У цій частині описується перший крок у синтезі об’єктної програми, а саме перетворення першого незалежного від цільової платформи представлення на більш просте, семантичний рівень якого близький до рівня мови С і яке, таким чином, легше перекласти на машинну мову. Складність цього етапу є відображенням багатства сучасних мов програмування. Конструкції, які представляють цікаві проблеми розширення і які ми детально обговорюємо, включають агрегати, тегові типи, керовані типи, захищені об’єкти, задачі і все, що пов’язано з міжзадачною взаємодією.

  • Частина IV: Час виконання. У цій частині ми обговоримо структуру виконання програми. Ми досить детально обговорюємо наступні питання: задачі (створення, активація, завершення, переривання), рандеву, захищені об’єкти, годинник і оператори затримки, винятки, переривання і, нарешті, асинхронна передача керування.

  • Частина V: Додаток. У цьому додатку описано, як модифікувати GNAT фронтенд для реалізації розширень мови. Ми описуємо методи, необхідні для додавання до мови ключових слів, прагм, атрибутів та нових конструкцій.

Як пояснювалося вище, у книзі не обговорюється реалізація сканера і синтаксичного аналізатора, які є більш традиційними частинами будь-якого компілятора. Тим не менш, зацікавлений читач знайде багато елегантних алгоритмів у цих розділах вихідних текстів. Сканер розроблено для роботи з різними кодуваннями символів, а синтаксичний аналізатор має те, що вважається найкращим набором стратегій відновлення помилок серед усіх використовуваних компіляторів Ada. Ми сподіваємося, що розробники компіляторів знайдуть у цих джерелах багато ідей.

Подяки#

Компілятор GNAT - це результат роботи багатьох людей протягом десятків років, починаючи з команди Нью-Йоркського університету, яка створила перший валідований транслятор Ada83 понад 20 років тому, і продовжуючи сьогодні відданими і сповненими ентузіазму членами Ada Core Technologies, а також незліченними користувачами GNAT, чиї пропозиції продовжують вдосконалювати систему. Неможливо згадати всіх поіменно, але ми повинні висловити особливу подяку і захоплення Роберту Дьюару (Robert Dewar), головному архітектору, керівнику команди, творцю деяких з найцікавіших алгоритмів у GNAT, невтомному прихильнику хороших практик програмування і неперевершеному прикладу того, як писати бездоганне програмне забезпечення.

Частково ця робота була підготовлена за грантом іспанського уряду, код PR2002-0290.

Коротка біографія#

Едмонд Шонберг - професор і заступник завідувача кафедри комп’ютерних наук Нью-Йоркського університету, один із засновників компанії Ada Core Technologies. Він отримав ступінь доктора філософії з фізики в Чиказькому університеті та ступінь бакалавра з фортепіанного виконавства в Національній консерваторії в Лімі, Перу. Його наукові інтереси пов’язані з мовами програмування, компіляторами та оптимізацією. Він був частиною команди, яка створила Ada/Ed, перший повний транслятор для Ada83, і був одним з керівників проекту GNAT в Нью-Йоркському університеті, який побудував перший прототип компілятора для Ada95.

Хав’єр Міранда вивчав комп’ютерну інженерію в Університеті Лас-Пальмас-де-Гран-Канарія. Він закінчив навчання у 1990 році, реалізувавши компілятор Modula-2, і вступив до Мадридського технічного університету, щоб захистити докторську дисертацію під керівництвом Анхеля Альвареса та Серхіо Аревало, присвячену розробці розширення для мови Ада для програмування розподілених систем. Експериментальна інтеграція цієї роботи в компілятор GNAT привела його до знайомства з внутрішніми деталями компілятора GNU Ada. У 2003 році він поїхав до Нью-Йорка, щоб співпрацювати з Едмондом Шонбергом над написанням цієї книги, яка підсумовує досвід, набутий за ці роки. Наразі його основним напрямком досліджень є інтеграція нових можливостей Ada 2005 у компілятор GNAT.