Компіля́тор (англ. Compiler від англ. to compile — збирати в ціле) — комп'ютерна програма (або їх набір), що перетворює (компілює) вихідний код, написаний певною мовою програмування (вихідна мова, англ. source language), на семантично в іншій мові програмування (цільова мова, англ. target language), який зазвичай необхідний для виконання програми машиною, наприклад, комп'ютером. В СРСР, зокрема в УРСР, з 1952 року до середини 1960-х років використовувався термін програмувальна програма (ПП).
Коротко компілятор можна визначити як програму або технічний засіб, що виконує компіляцію.
Історично компілятором називалась програма, що зв'язувала підпрограми, чим і зумовлено походження слова. Сьогодні це завдання виконує компонувальник.
Для виконання програма не завжди повинна бути перекладена компілятором, існує також інший принцип: покрокове виконання програмних інструкцій інтерпретатором.
Історія розвитку
Термін «компілятор» вперше з'явився на початку 50-х років, коли почала формуватися потреба підвищення продуктивності програмістів шляхом запровадження високорівневих мов програмування. Від початку комп'ютерні програми писали на асемблері — низькорівневій, апаратно-залежній мові. Зі збільшенням розміру пам'яті первісних комп'ютерів виникали нові можливості для оптимізації процесу створення програм і переходу на сутності вищого рівня.
Автором першого компілятора вважається Ґрейс Гопер, яка у 1952 році створила компілятор для мови А-0 Система. Цей компілятор являв собою окремий пристрій, який при завантаженні програм до оперативної пам'яті комп'ютера, без використання процесора, перекодовував програму у мнемонічних кодах (асемблері) у двійкові програмні коди. Тому цей перший компілятор функціонував як завантажувач та компонувальник, та його складно віднести до компілятора у сучасному розумінні цього терміну.
Першими компіляторами були програмувальні програми ПП-1 (1954 рік) та ПП-2 (1955 рік), які були реалізовані на ЕОМ «Стріла» в Москві.
Перший в світі компілятор універсальної мови програмування високого рівня — Адресної мови програмування (1955 р.) з опосередкованою адресацією (вказівниками) є Програмуюча Програма Адресної мови для (ПП-АК) та ПП-2 (1955). Адресної мови програмування була реалізована під різними платформами, зокрема: комп'ютери М-20 (БЕСМ-3, БЕСМ-4), Урал, Дніпро, Мінськ тощо. Компілятори Адресної мови програмування писались на так званій ідеальній адресній обчислювальній машині (ІАОМ), яка є базовою частиною (підмножиною) Адресної мови програмування.
Оскільки Адресна мова програмування (1955 р.) мало відома закордоном, то часто помилково вважають авторами першого в світі повноцінного компілятора команду розробки мови програмування Фортран на чолі з Джоном Бакусом, яка представила винахід у 1957 році.
У 1960 році був представлений компілятор мови програмування Кобол, який теж мав можливість компілювати програми під різні платформи. Помилково вважають, що компілятор мови програмування Лісп 1962 року був першим компілятором, написаним мовою джерела компіляції, оскільки про технологію розробки компіляторів Адресної мови програмування мало кому відомо. Відтоді написання компілятора на мові, яку він компілює, стало поширеною практикою, відомими прикладами якої стали мови програмування С і Паскаль.
Процес компіляції
Процес, у якому компілятор читає записану початковою мовою програму та записує цільовою мовою, називають компіляцією (трансляцією, перекладом). Залежно від типу компілятора та налаштувань, цей процес може бути як простим однопрохідним зчитуванням і записом результату, так і розгалуженою багатокроковою ресурсомісткою обробкою й аналізом вхідного коду для численних оптимізацій та налаштувань.
Загалом компіляцію поділяють на такі послідовні та залежні кроки:
- Аналіз (front-end) — зчитування та розбиття початкової програми на складові частини для створення проміжного представлення.
- Лексичний аналіз — на цьому етапі послідовність символів сирцевого файлу перетворюється в послідовність лексем.
- Синтаксичний аналіз, під час якого послідовність лексем перетворюється в дерево розбору.
- Семантичний аналіз — перевірка відповідності правилам вхідної мови та побудова таблиці символів.
- Генератор проміжного коду будує проміжне представлення для подальших оптимізацій.
- Синтез (back-end) — побудова цільової програми на базі проміжного представлення.
- Попередній аналіз проміжного представлення на залежності, потік даних та інші контекстні властивості, важливі для оптимізації.
- Оптимізація — покращення для швидкодії, розміру, паралелізму тощо.
- Генератор цільового коду створює кінцевий результат роботи компілятора — цільову програму.
У конкретних реалізаціях компіляторів ці етапи можуть бути розділені або, навпаки, поєднані в тому чи іншому вигляді.
Початкова мова визначається її синтаксисом — описом того, з яких конструкцій складається мова, та семантикою — набором правил, що визначають суть цих конструкцій.
Аналіз (front-end)
Протягом аналізу, або початкової стадії (front-end), програму розбивають на частини, на які накладається граматична структура. Наступним кроком на базі цієї структури створюють проміжне представлення програми. Важливими елементами аналізу є виявлення синтаксичних помилок та семантичних невідповідностей, які відображає компілятор.
Також протягом фази аналізу збирається інформація до таблиці символів, ключової для фази компонування.
До фази аналізу зачислюють лексичний, синтаксичний та семантичний аналізи та фазу генерації проміжного коду.
Лексичний розбір
Лексичний розбір виділяють для спрощення побудови компілятора. Це лінійне сканування вхідної програми, при якому символи групують в токени — послідовності символів, що мають певне сукупне значення. Наступний рядок мовою Паскаль
len := 3.14 * r;
складається з таких токенів:
- Ідентифікатор len
- Символ присвоєння :=
- Числова стала 3,14
- Знак множення *
- Ідентифікатор r
- Роздільник операторів ;
Синтаксичний аналіз
Послідовність машинних символів, які утворюють токен, називають лексемою токена. Токени мають тип (наприклад, ідентифікатор, числова стала — це типи токенів). Деякі токени мають лексичне значення (наприклад, значення числової чи рядкової константи, утвореної з лексеми токена). Завдання лексичного аналізатора — виокремити лексеми токенів і повідомити синтаксичний аналізатор про тип токена та його лексичне значення.
Ієрархічний аналіз називають розбором (англ. parsing) чи синтаксичним аналізом, у ході якого відбувається групування токенів програми. В синтаксичному аналізі символом називають токени (термінали) та групи токенів, об'єднаних у логічне ціле в процесі аналізу (нетермінали).
Синтаксис звичайно визначається контекстно-незалежною граматикою, що складається з символів — терміналів і нетерміналів, стартового символу що належить множині нетерміналів, та контесктно-незалежних продукцій.
Програма є послідовністю терміналів, яку можна вивести зі стартового символу, послідовно застосовуючи правила виводу (продукції). Продукція — це заміна послідовності символів S1 на послідовність символів S2 (Позначається. S1 : S2 або S1 -> S2). Продукція називається контекстно-незалежною, якщо S1 — один символ. Зазвичай розглядають лише контекстно-незалежні продукції.
Задача синтаксичного аналізатора — встановити шлях, яким вхідна програма виводиться зі стартового символу.
Наприклад, наступна граматика із трьох продукцій описує вирази (expression), що можуть складатись з ідентифікаторів (identifier), чисел (number) і знаку додавання +
expression : identifier expression : number expression : expression + expression
Перший рядок означає, що будь-який ідентифікатор є виразом. Другий рядок означає що будь-яке число є виразом. Третій рядок означає, що будь-яка послідовність з двох виразів, розділених знаком додавання, теж є виразом.
В цій граматиці символами є expression, number, identifier та +. Expression є стартовим символом і нетерміналом, решта символів є терміналами.
Семантичний аналіз
На базі синтаксичного дерева семантичний аналізатор перевіряє вхідну програму на відповідність правилам і визначенням мови програмування. Важливою частиною цієї фази є перевірка відповідності типів даних. Саме протягом семантичного аналізу виявляють помилки приведення типів, використання неініційованих змінних, відкладеного визначення типів.
У ході аналізу будується таблиця символів — ключове джерело посилань для подальшого компонування програми.
Генератор проміжного коду
Протягом своєї роботи компілятор може мати одне, або навіть декілька проміжних представлень коду, як вхідні параметри для різних фаз компіляції. Так, синтаксичне дерево побудоване протягом синтаксичного аналізу є прикладом такої проміжної структури.
Проте типовим принципом побудови компіляторів є генерація проміжного коду у кінці фази аналізу для подальшої оптимізації та трансляції у вихідну мову. Цей проміжний код ще не є вихідним кодом, але має важливі властивості: він має досить легко генеруватися та легко транслюватися у цільову мову.
Синтез (back-end)
На базі проміжного представлення та наповненої таблиці функції конструюється вихідна програма.
Оскільки початковий вхідний код (а відповідно і проміжне представлення) може бути оптимізований як на базі високорівневих покращень, так і беручи до уваги детальне знання конкретної архітектури виходного коду, він підлягає декільком фазам аналізу. Аналізується час життя даних та їх проміжне переміщення за час роботи програми, деякі блоки коду ідентифікуються, як можливі кандидати до підстановки низькорівневим кодом. Після аналізу відбувається оптимізація та результат покращень транслюється у вихідну мову.
На цій фазі компіляції деякі фази вже є необов'язковими (аналіз, оптимізація) і можуть бути пропущені.
Попередній аналіз проміжного коду
З часів первинних компіляторів, коли проміжний код безпосередньо транслювався у вихідну мову, було розроблено велику кількість покращень, уточнень та оптимізацій в залежності від змісту вхідної програми. Сучасні компілятори можуть виконувати великий набір досліджень вхідного коду, щоб досягти переваги у продуктивності, використовуваній пам'яті, розмірі вихідного файла тощо. Приклад розповсюджених видів аналізу:
- Аналіз потоку даних (англ. data-flow analysis) — побудова ланцюга використання-визначення (англ. Use-define chain) на базі якого у подальшого виконуються численні оптимізації.
- Аналіз залежностей — пошук інструкцій та блоків коду, які не залежать від послідовності виконання в певному контексті.
- Пошук псевдонімів (англ. alias) — в залежності від того, чи вказують певні змінні у певний момент часу на один і той самий об'єкт у пам'яті (є псевдонімами), можна робити припущення щодо взаємної їх підстановки та оптимізації.
- Аналіз області видимості (англ. escape analysis) — динамічний аналіз часу життя та області видимості вказівників для ефективнішого використання пам'яті.
На цьому етапі також будується граф викликів — структура послідовності викликів функцій у вхідному коді, та граф потоку керування.
Оптимізація проміжного коду
Оптимізація є проміжним етапом перед кінцевою побудовою вихідного коду, під час якого код може бути покращений задля швидкодії, розміру результуючого файлу, ефективних обчислень на паралельних потоках виконання, об'єму використовуваній пам'яті тощо. За масштабом дії оптимізацію можна поділити на локальну, та глобальну.
Локальна оптимізація відбувається у межах базового блоку (групи послідовних команд без розґалуджень і переходів) і полягає у локальних поліпшеннях:
- видалення коду, який не використовується,
- пошук тотожних підвиразів,
- зниження складності підрахунків шляхом заміни на більш дешеві операції (як приклад, степінь замінити множенням),
- згорання констант (англ. constant folding) — підрахунок і заміна констант їх значеннями,
- поліпшення повернення значення
- локальне розподілення регістрів (англ. register allocation)
Більш просунутою та розширеною є глобальна оптимізація на рівні сутностей суцільної програми. Під час глобальних оптимізацій інтенсивно використовуються результати попередніх аналізів — потоку даних, залежностей та інших. Серед численних оптимізацій можна виділити:
- Глобальне розподілення регістрів (англ. global register allocation)
- Розмотування циклів
- Усунення загальних підвиразів
- Автоматичне розпаралелення
- Оптимізація циклів для розпаралелення
Генерація цільового коду програми
Останньою фазою компіляції є саме створення вихідного коду програми. За створення відповідає генератор цільового коду, який на базі проміжного представлення та з урахуванням оптимізацій виводить еквівалентну вихідну програму. Основними вимогами до генератора є збереження семантичного змісту вхідного коду та ефективне використання ресурсів у вихідному коді цілі.
Виділяють такі задачі, притаманні фазі генерації:
- Вибір команд — саме трансляція команд входу у код цілі.
- Впорядкування команд — визначення порядку слідування команд, місце для останніх можливих оптимізацій.
- Розподіл та призначення регістрів — вибір змінних, які будуть знаходитися у пам'яті в у кожен момент часу програми, та їх розміщення у конкретних регістрах.
- Налагоджувальна інформація (англ. debug data) додається саме на цій фінальній стадії.
Види компіляторів
За принципом роботи можна виділити такі види компіляторів:
- Однопрохідні — компіляція здійснюється в один прохід пропускаючи багато проміжних кроків оптимізацій і перевірок. Перші компілятори мови Pascal.
- Компілятори у зшитий код (англ. threaded code) — код, який повністю складається з підпрограм. По суті компілятор просто замінює кожну інструкцію вхідного коду на підпрограму вихідного — зшиває з заготівок. Такий компілятор має мова програмування Forth.
- — деякі функції можуть бути скомпільовані під час виконання інкрементально, наприклад у поєднанні з інтерпретованим виконанням. Такий тип компіляторів поширений у сімействі LISP.
- Передфінальний компілятор (англ. stage compiler), який компілює у вихідну мову теоретичної машини. Такий компілятор реалізований для мови програмування Prolog; він генерує вихідний код для (англ. Warren Abstract Machine).
- Динамічний компілятор (англ. JIT, just-in-time) — компіляція на льоту. Див. нижче.
- Компілятор зі змінними цілями (англ. retargetable), який відносно просто можна змінити для генерації цільового коду під іншу архітектуру процесору. Загалом така властивість досягається шляхом зниження якості вихідного коду (у порівнянні з цільовими компіляторами під конкретний процесор). Представником такого типу компіляторів є набір GCC.
- Компілятор розпаралелення, який генерує вихідних код для запуску на паралельній архітектурі.
- [en] — транслятор, що сприймає формальний опис мови програмування й генерує компілятор для цієї мови.[]
- Векторизувальний. Транслює вихідний код в машинний код комп'ютерів оснащених векторним процесором.
- [en].
Види компіляторів C
- Borland International
Вихід компілятора Turbo C являє собою розумний, але не дуже оптимізований код. Крім згортки констант, видалення зайвих завантажень регістрів і алгебраїчних спрощень, компілятор виконує тільки зниження потужності, видалення недосяжного коду і розміщення змінних у регістрах. Він не підтримує інші загальні методи оптимізації, такі як видалення зайвих збережень, загальних підвиразів і змінні індукції циклу, а також винесення інваріантного коду. Turbo C розумно керує прологом і епілогом функцій і використанням регістрів, засилаючи в стек і витягаючи тільки ті регістри, що явно використовуються усередині тіла функції.
- Computer Innovation Inc
Компілятор C86Plus виробляє чудовий код із середнім рівнем оптимізації. Він виконує базові прийоми оптимізації, такі як згортка констант і розмноження копій. Однак він не виконує розмноження констант для видалення зайвих збережень. Хоча компілятор успішно виконує алгебраїчні спрощення, він породжує зайві інструкції через те, що розміщає результати в регістрах, замість того, щоб поміщати їх у змінні. Цей ефект виявляється в том, що при розміщенні змінних у регістрах починаються спроби перерозміщення, тому що при виконанні декількох операторів результати в дійсності повинні бути привласнені відповідним змінним. Хоча C86Plus успішно справляється зі згорткою явних присвоювань, що дублюються, в одне присвоювання, видалення зайвих збережень він виконує хитливо. Він не виконує істотну оптимізацію циклів.
- Datalight Inc
З появою Optimum-C Datalight стала одним з перших постачальників, що запропонували оптимізований компілятор. Хоча набір тестів не підтвердив наочно претензії Datalight на глобальну оптимізацію, Optimum-C спрацював так добре в деяких фрагментах тесту, що продемонстрував слабкі фрагменти набору, які вимагають змін для удосконалення бажаної перевірки. Наприклад, у першій версії функції jump-compression не поверталося значення, що робило всі обчислення і присвоювання у функції зайвими. Optimum-C виявив це і видалив велику частину коду функції, включаючи ланцюжок переходів. У тесті розмноження констант і копій Optimum-C визначив, що присвоювання i5 в обох умовних операторах є зайвим стосовно наступних присвоювань. Компілятор видалив не тільки ці присвоювання, але й умовні оператори. Незадовільним виявилося видалення зайвих збережень значень регістрів. Optimum-C — єдиний компілятор, що намагався виконати глибоке видалення загальних виражень. Перевірка згенерованого коду показала, що загальне вираження i5+i2 було переміщено вище першого базового блоку умовного оператора, але не було вилучено з другого. Поза обмеженнями на стандартне використання регістрів, що накладаються сімейством мікропроцесорів 80x86, Optimum-C розумно використовує регістри. У функції jump-compression кожен переданий параметр був поміщений у регістр. Усередині тіла функції не було посилань у пам'ять, крім початкового засилання в регістри. Однією важливою областю, у якій компілятор Optimum-C вимагає поліпшень, є оптимізація циклів. Компілятор не намагається виконувати винесення інваріантного коду і видалення змінних індукції циклу. Тест виконання показав, що компілятор Datalight дуже ефективно керує введенням/висновком getc/putc, а інші тести виконуються в прийнятний час.
- Lattice Inc
Компілятор, що має велику історію, Lattice MS-DOS C послідовно удосконалювався з кожною новою версією. Він відомий як генератор стабільного, передбачуваного коду і виконує помірну оптимізацію. Lattice С виконує зниження потужності, стиск ланцюжка переходів і видалення загальних підвиразів. Він не видаляє присвоювання, що дублюються після тесту вбудованих функцій і зайві присвоювання у функції dead-code. Lattice C не виконує оптимізацію циклів.
- Manx Software Systems Inc
Компілятор Aztec C86 згенерував чудовий код з досить гарним рівнем оптимізації. Крім згортки констант і алгебраїчних спрощень, Aztec C86 виконав зниження потужності і видалення загальних підвиразів. Однак, він не виконав видалення зайвих присвоювань і не видаляв недосяжний код. Aztec C86 згенерував код для недосяжного оператора printf разом з безумовним переходом через нього. Оскільки будь-яка програма на Сі має значну кількість викликів функцій, заголовок кожного виклику необхідно мінімізувати. Aztec C86 використовує незвичайний, але ефективний підхід до рішення цієї проблеми. На виході компілятора виходить текст у мові асемблера, що обробляється окремим асемблером. Компілятор вставляє в текст директиви умовного асемблювання навколо коду, що встановлює стековий кадр і зберігає регістри. Після генерації коду функції, компілятор визначає символи для керування установкою стекового кадру і збереження тільки тих регістрів, що використовуються у функції. Aztec C86 не зміг вирішити задачу перетворення ланцюжка переходів в один перехід до кінцевої мети. Він також не виконував оптимізацію циклів.
- Metaware Inc
High C виробляє чудовий код із середнім рівнем оптимізації. Компілятор виконує всі базові види оптимізації, включаючи згортку констант і алгебраїчні спрощення, видалення зайвих операцій завантаження регістрів, зниження потужності і видалення загальних підвиразів. Компілятор Metaware видаляє недосяжний код, але не видаляє зайві присвоювання. High C розумно використовує машинно-залежні інструкції. Компілятор удосконалить завантаження констант із крапкою, що плаває, використовуючи команду копіювання рядків MOVS процесорів 80x86 для запису значень із крапкою, що плаває, обчислених під час компіляції. Він також генерує інструкцію LEAVE процесорів 80x86 для епілогу функцій, але встановлює адресацію стекового кадру в пролозі функції за допомогою окремих інструкцій, а не використовуючи більш тривалу інструкцію ENTER. Компілятор High C не виконує винесення інваріантного коду, важливий метод оптимізації циклів. Він також не зміг застосувати успішне видалення змінних індукції циклів. Вбудовані функції підтримуються для декількох цілочисленних і строкових операцій, таких як strlen.
- Microsoft C
У версії 5.0 свого компілятора Сі корпорація Microsoft вивела на ринок PC високий рівень оптимізації коду. Microsoft приділяє багато уваги аналізу циклів. C 5.0 — єдиний з розглянутих компіляторів, що виконує винесення інваріантного коду і сьогоденне видалення змінних індукції циклів. Компілятор Microsoft C 5.0 чудово використовує регістри, намагаючись мінімізувати звертання до пам'яті в тілі циклу . Простий приклад циклу в коді тесту демонструє ступінь оптимізації циклів, який виконує Microsoft C 5.0. Компілятор застосовує зниження потужності і цілком видаляє константне множення, виявляє кінцевий стан змінних, і поміщає в регістри всі змінні всередині циклу. C 5.0 видаляє цикл for і генерує код тільки з метою установки кінцевого стану змінної — індексу циклу й оператора, включеного в цикл. Компілятор також добре використовує регістри. Увага фірми Microsoft до оптимізації винагороджується при роботі тесту виконання. Він виконується за час, що є кращим чи близько до кращого по кожній категорії.
- WATCOM
Новітній суперник, що завойовує позиції на ринку компіляторів C — WATCOM C 6.0 (див. Product Watch, Philip N. Hisley, за цей місяць). C 6.0 виробляє компактний код, що чудово використовує трохи обмежений комплект регістрів сімейства 80x86. Крім виконання базових прийомів оптимізації, він підтримує зниження потужності і видалення недосяжного коду і загальних підвиразів. У той час, як Microsoft досягає поліпшення коду завдяки оптимізації циклів, WATCOM збільшує швидкість шляхом зменшення керуючих заголовків викликів функцій до їхнього абсолютно мінімального розміру. Він досягає цього, шляхом переважної передачі параметрів через регістри, а не через стек. WATCOM дуже добре видаляє недосяжний код. C 6.0 не тільки видалив непотрібні присвоювання і недосяжний код усередині функції, але він також видалив пролог і епілог функції і згорнув усю функцію до простого повернення, приписавши ім'я функції до інструкції повернення основної функції. На завершення всього, компілятор видалив локальний виклик функції. Наскільки C 6.0 витончений у знищенні марної функції, настільки ж він безпомічний при видаленні марного присвоювання, що дублюється. Найбільш важлива область, за яку WATCOM C 6.0, як і Optimum-C, не зміг узятися, була оптимізація циклів. Він не підтримує винесення інваріантного коду і видалення змінної індукції циклів. Хоча C 6.0 не виконує розгортання циклів в окремі команди, він (також як Datalight Optimum-C і Computer Innovations C86Plus) використовує команду REP/STOSW процесорів 80x86 для ініціалізації тестового масиву, завдяки чому видаляє цикл. Прекрасна генерація коду в WATCOM, зокрема, розумне використання регістрів, дає йому дуже важливу перевагу. Він переміг у більшості тестів, що інтенсивно використовують процесор, і при цьому виконувався для великої моделі в кращий час, ніж більшість інших компіляторів для малої моделі. До слабких сторін WATCOM можна віднести введення/виведення файлів, використання getc і putc. Тут він близький до найгірших компіляторів.
Стратегії компіляції
Компілятори слугують своїм цілям у різний спосіб для різних мов програмування та парадигм. Так, якщо історично первинні компілятори транслювали код мови у апаратно залежний асемблер, то з часом виникла потреба у додаткових методах та шарах абстракції — компіляції на льоту, транслювання більш високорівневого коду в менший за рівнем, оптимізації по використанню вже скомпільованого коду тощо.
Поширені стратегії компіляції:
- Компіляція перед виконанням (англ. AOT, ahead-of-time). Класичний принцип, коли компіляція проводиться окремо від виконання, зазвичай у відмінному від місця виконання середовищі. Компілятори мов програмування Pascal, C, , BASIC, Fortran, COBOL використовують стратегію такої попередньої компіляції.
Переваги |
---|
|
|
|
- Компіляція під час виконання (англ. JIT, just-in-time), відома також як динамічна компіляція. Суть полягає у компіляції часу виконання (англ. run time), коли текст вхідної мови перетворюється у машинний код на льоту й тут же виконується. Ця техніка поєднує у собі методи як попередньої компіляції у проміжний код так і інтерпретації цього проміжного коду під час виконання. Будучи більш продвинутою технікою, компіляція на льоту має досить суворі вимоги до простоти компіляції, і не є доцільною для певних мов програмування. Принциповим представником JIT компіляції є середовище виконання мови Java, піонером же вважається Smalltalk.
- Транскомпіляція, або компіляція з однієї високорівневої мови в іншу (англ. source-to-source). Принциповою відмінністю даної стратегії є те, що як вхідний так і вихідний код є мовами програмування високого рівня. Типовими прикладами використання є підготовка коду для паралельної оптимізації, перекомпіляція старішого коду для нової версії стандарту мови програмування, компіляція мов-надбудов у базову мову. Представниками таких мов програмування є CoffeeScript, Dart, Haxe, .
- Перекомпіляція — динамічна компіляція частин програми під час виконання (англ. dynamic recompilation). Особливість деяких серед виконання — емуляторів та віртуальних машин, перекомпільовувати деяку частину програми під час її роботи. Ця техніка використовується для переносу коду на іншу архітектуру під час його виконання, зокрема для запуску застарілих програм на сучасних операційних системах. Широко використовується Java run time та .Net Common Language Runtime, а також багатьма віртуальними машинами.
- Основними завданнями, які повинен виконувати динамічний рекомпілятор, є:
- Читання машинного коду з вихідної платформи
- Видає машинний код для цільової платформи
- Основними завданнями, які повинен виконувати динамічний рекомпілятор, є:
Відомі компілятори
- Amsterdam Compiler Kit — набір засобів для написання компіляторів для системи Minix авторства Ендрю Таненбаума та Серіла Якобса.
- GCC — відомий набір компіляторів C та пізніше , створений Річардом Столменом; широко поширений у світі Linux.
- Clang — компілятор сімейства C/, який використовує технологію LLVM — віртуальної машини на базі проміжного представлення коду.
- Turbo Pascal — видатний компілятор створений Андерсом Гейлсбергом у 1983 році.
- — компілятор мови C розроблений компанією Borland у 1987 році.
- Mono — багатоплатформовий набір засобів та компілятор мови C#, у вільному доступі.
- PyPy — JIT-компілятор мови Python написаний на мові Python.
Генератори аналізаторів
Побудовані алгоритми, що перетворюють опис вхідної мови у програму, що виконує аналіз і є велика кількість реалізацій цих алгоритмів. Є також утиліти, що автоматизують решту фаз компіляції та системи створення компіляторів у цілому
В Unix поширені генератор лексичних аналізаторів (F)Lex, та генератори синтаксичних аналізаторів Bison та Yacc.
Література
- Compilers: Principles, Techniques, and Tools [ 24 Травня 2016 у Wayback Machine.] (English) (вид. 2nd edition). Addison Wesley. 2006-09-10. .
- Engineering a Compiler, Second Edition(English) (вид. 2 edition). Morgan Kaufmann. 2011-02-21. .
- Advanced Compiler Design and Implementation (English) (вид. 1 edition). Morgan Kaufmann. 1997-08-15. .
- Compiler Design in C (English). Prentice-Hall. 1990-01-01. .
- Modern Compiler Implementation in Java [ 25 Квітня 2016 у Wayback Machine.](English) (вид. 2nd edition). Cambridge University Press. 2002-10-21. .
- Understanding and Writing Compilers: A do-it-yourself guide (English) (вид. 3rd ed. edition). Palgrave. 1979-10-01. .
- Let's Build a Compiler [ 8 Лютого 2016 у Wayback Machine.]. compilers.iecc.com. Процитовано 2016-03-27.
Посилання
- Hopper, Grace. «The Education of a Computer». Proceedings of the Association for Computing Machinery Conference 1952, reprinted Vol. 9, No. 3-4, 1952, pp. 271—281.
- Глушков, В.М.; Ющенко К.Л., К.Л. (1962). Вычислительная машина «Киев»: математическое описание (рос.). Киев: Техн. лит.
- Ющенко, Е.Л. (1963). Адресное программирование. Київ: Державне видавництво технічної літератури. с. 288.
- Principles of Compiler Design (English) (вид. 2nd edition). Addison-Wesley. 1 серпня 1977. ISBN .
- . www.williamspublishing.com. с. 705—706. Архів оригіналу за 4 Березня 2016. Процитовано 30 березня 2016.
- . www.compilers.net. Архів оригіналу за 19 Липня 2019. Процитовано 30 березня 2016.
- . www.pcengines.ch. Архів оригіналу за 13 Березня 2016. Процитовано 30 березня 2016.
- . www.complang.tuwien.ac.at. Архів оригіналу за 16 Березня 2016. Процитовано 30 березня 2016.
- Horn, Joe. . Архів оригіналу за 17 Вересня 2017.
- . wambook.sourceforge.net. Архів оригіналу за 19 Січня 2022. Процитовано 2 квітня 2016.
- Aycock, John (1 червня 2003). A Brief History of Just-in-time. ACM Comput. Surv. Т. 35, № 2. с. 97—113. doi:10.1145/857076.857077. ISSN 0360-0300. Процитовано 27 березня 2016.
- . GitHub. Архів оригіналу за 31 Січня 2020. Процитовано 27 березня 2016.
- . lwn.net. Архів оригіналу за 15 Березня 2016. Процитовано 27 березня 2016.
- . www.ibm.com (англ.). 21 грудня 2004. Архів оригіналу за 17 Березня 2016. Процитовано 27 березня 2016.
- . msdn.microsoft.com. Архів оригіналу за 16 Березня 2016. Процитовано 27 березня 2016.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Kompilya tor angl Compiler vid angl to compile zbirati v cile komp yuterna programa abo yih nabir sho peretvoryuye kompilyuye vihidnij kod napisanij pevnoyu movoyu programuvannya vihidna mova angl source language na semantichno v inshij movi programuvannya cilova mova angl target language yakij zazvichaj neobhidnij dlya vikonannya programi mashinoyu napriklad komp yuterom V SRSR zokrema v URSR z 1952 roku do seredini 1960 h rokiv vikoristovuvavsya termin programuvalna programa PP Korotko kompilyator mozhna viznachiti yak programu abo tehnichnij zasib sho vikonuye kompilyaciyu Istorichno kompilyatorom nazivalas programa sho zv yazuvala pidprogrami chim i zumovleno pohodzhennya slova Sogodni ce zavdannya vikonuye komponuvalnik Dlya vikonannya programa ne zavzhdi povinna buti perekladena kompilyatorom isnuye takozh inshij princip pokrokove vikonannya programnih instrukcij interpretatorom Istoriya rozvitkuTermin kompilyator vpershe z yavivsya na pochatku 50 h rokiv koli pochala formuvatisya potreba pidvishennya produktivnosti programistiv shlyahom zaprovadzhennya visokorivnevih mov programuvannya Vid pochatku komp yuterni programi pisali na asembleri nizkorivnevij aparatno zalezhnij movi Zi zbilshennyam rozmiru pam yati pervisnih komp yuteriv vinikali novi mozhlivosti dlya optimizaciyi procesu stvorennya program i perehodu na sutnosti vishogo rivnya Avtorom pershogo kompilyatora vvazhayetsya Grejs Goper yaka u 1952 roci stvorila kompilyator dlya movi A 0 Sistema Cej kompilyator yavlyav soboyu okremij pristrij yakij pri zavantazhenni program do operativnoyi pam yati komp yutera bez vikoristannya procesora perekodovuvav programu u mnemonichnih kodah asembleri u dvijkovi programni kodi Tomu cej pershij kompilyator funkcionuvav yak zavantazhuvach ta komponuvalnik ta jogo skladno vidnesti do kompilyatora u suchasnomu rozuminni cogo terminu Pershimi kompilyatorami buli programuvalni programi PP 1 1954 rik ta PP 2 1955 rik yaki buli realizovani na EOM Strila v Moskvi Pershij v sviti kompilyator universalnoyi movi programuvannya visokogo rivnya Adresnoyi movi programuvannya 1955 r z oposeredkovanoyu adresaciyeyu vkazivnikami ye Programuyucha Programa Adresnoyi movi dlya EOM Kiyiv PP AK ta PP 2 1955 Adresnoyi movi programuvannya bula realizovana pid riznimi platformami zokrema komp yuteri M 20 BESM 3 BESM 4 Ural Dnipro Minsk tosho Kompilyatori Adresnoyi movi programuvannya pisalis na tak zvanij idealnij adresnij obchislyuvalnij mashini IAOM yaka ye bazovoyu chastinoyu pidmnozhinoyu Adresnoyi movi programuvannya Oskilki Adresna mova programuvannya 1955 r malo vidoma zakordonom to chasto pomilkovo vvazhayut avtorami pershogo v sviti povnocinnogo kompilyatora komandu rozrobki movi programuvannya Fortran na choli z Dzhonom Bakusom yaka predstavila vinahid u 1957 roci U 1960 roci buv predstavlenij kompilyator movi programuvannya Kobol yakij tezh mav mozhlivist kompilyuvati programi pid rizni platformi Pomilkovo vvazhayut sho kompilyator movi programuvannya Lisp 1962 roku buv pershim kompilyatorom napisanim movoyu dzherela kompilyaciyi oskilki pro tehnologiyu rozrobki kompilyatoriv Adresnoyi movi programuvannya malo komu vidomo Vidtodi napisannya kompilyatora na movi yaku vin kompilyuye stalo poshirenoyu praktikoyu vidomimi prikladami yakoyi stali movi programuvannya S i Paskal Proces kompilyaciyiProces u yakomu kompilyator chitaye zapisanu pochatkovoyu movoyu programu ta zapisuye cilovoyu movoyu nazivayut kompilyaciyeyu translyaciyeyu perekladom Zalezhno vid tipu kompilyatora ta nalashtuvan cej proces mozhe buti yak prostim odnoprohidnim zchituvannyam i zapisom rezultatu tak i rozgaluzhenoyu bagatokrokovoyu resursomistkoyu obrobkoyu j analizom vhidnogo kodu dlya chislennih optimizacij ta nalashtuvan Zagalom kompilyaciyu podilyayut na taki poslidovni ta zalezhni kroki Analiz front end zchituvannya ta rozbittya pochatkovoyi programi na skladovi chastini dlya stvorennya promizhnogo predstavlennya Leksichnij analiz na comu etapi poslidovnist simvoliv sircevogo fajlu peretvoryuyetsya v poslidovnist leksem Sintaksichnij analiz pid chas yakogo poslidovnist leksem peretvoryuyetsya v derevo rozboru Semantichnij analiz perevirka vidpovidnosti pravilam vhidnoyi movi ta pobudova tablici simvoliv Generator promizhnogo kodu buduye promizhne predstavlennya dlya podalshih optimizacij Sintez back end pobudova cilovoyi programi na bazi promizhnogo predstavlennya Poperednij analiz promizhnogo predstavlennya na zalezhnosti potik danih ta inshi kontekstni vlastivosti vazhlivi dlya optimizaciyi Optimizaciya pokrashennya dlya shvidkodiyi rozmiru paralelizmu tosho Generator cilovogo kodu stvoryuye kincevij rezultat roboti kompilyatora cilovu programu U konkretnih realizaciyah kompilyatoriv ci etapi mozhut buti rozdileni abo navpaki poyednani v tomu chi inshomu viglyadi Pochatkova mova viznachayetsya yiyi sintaksisom opisom togo z yakih konstrukcij skladayetsya mova ta semantikoyu naborom pravil sho viznachayut sut cih konstrukcij Analiz front end Protyagom analizu abo pochatkovoyi stadiyi front end programu rozbivayut na chastini na yaki nakladayetsya gramatichna struktura Nastupnim krokom na bazi ciyeyi strukturi stvoryuyut promizhne predstavlennya programi Vazhlivimi elementami analizu ye viyavlennya sintaksichnih pomilok ta semantichnih nevidpovidnostej yaki vidobrazhaye kompilyator Takozh protyagom fazi analizu zbirayetsya informaciya do tablici simvoliv klyuchovoyi dlya fazi komponuvannya Do fazi analizu zachislyuyut leksichnij sintaksichnij ta semantichnij analizi ta fazu generaciyi promizhnogo kodu Leksichnij rozbir Dokladnishe Leksichnij analiz Leksichnij rozbir vidilyayut dlya sproshennya pobudovi kompilyatora Ce linijne skanuvannya vhidnoyi programi pri yakomu simvoli grupuyut v tokeni poslidovnosti simvoliv sho mayut pevne sukupne znachennya Nastupnij ryadok movoyu Paskal len 3 14 r skladayetsya z takih tokeniv Identifikator len Simvol prisvoyennya Chislova stala 3 14 Znak mnozhennya Identifikator r Rozdilnik operatoriv Sintaksichnij analiz Dokladnishe Sintaksichnij analiz Poslidovnist mashinnih simvoliv yaki utvoryuyut token nazivayut leksemoyu tokena Tokeni mayut tip napriklad identifikator chislova stala ce tipi tokeniv Deyaki tokeni mayut leksichne znachennya napriklad znachennya chislovoyi chi ryadkovoyi konstanti utvorenoyi z leksemi tokena Zavdannya leksichnogo analizatora viokremiti leksemi tokeniv i povidomiti sintaksichnij analizator pro tip tokena ta jogo leksichne znachennya Iyerarhichnij analiz nazivayut rozborom angl parsing chi sintaksichnim analizom u hodi yakogo vidbuvayetsya grupuvannya tokeniv programi V sintaksichnomu analizi simvolom nazivayut tokeni terminali ta grupi tokeniv ob yednanih u logichne cile v procesi analizu neterminali Sintaksis zvichajno viznachayetsya kontekstno nezalezhnoyu gramatikoyu sho skladayetsya z simvoliv terminaliv i neterminaliv startovogo simvolu sho nalezhit mnozhini neterminaliv ta kontesktno nezalezhnih produkcij Programa ye poslidovnistyu terminaliv yaku mozhna vivesti zi startovogo simvolu poslidovno zastosovuyuchi pravila vivodu produkciyi Produkciya ce zamina poslidovnosti simvoliv S1 na poslidovnist simvoliv S2 Poznachayetsya S1 S2 abo S1 gt S2 Produkciya nazivayetsya kontekstno nezalezhnoyu yaksho S1 odin simvol Zazvichaj rozglyadayut lishe kontekstno nezalezhni produkciyi Zadacha sintaksichnogo analizatora vstanoviti shlyah yakim vhidna programa vivoditsya zi startovogo simvolu Napriklad nastupna gramatika iz troh produkcij opisuye virazi expression sho mozhut skladatis z identifikatoriv identifier chisel number i znaku dodavannya expression identifier expression number expression expression expression Pershij ryadok oznachaye sho bud yakij identifikator ye virazom Drugij ryadok oznachaye sho bud yake chislo ye virazom Tretij ryadok oznachaye sho bud yaka poslidovnist z dvoh viraziv rozdilenih znakom dodavannya tezh ye virazom V cij gramatici simvolami ye expression number identifier ta Expression ye startovim simvolom i neterminalom reshta simvoliv ye terminalami Semantichnij analiz Na bazi sintaksichnogo dereva semantichnij analizator pereviryaye vhidnu programu na vidpovidnist pravilam i viznachennyam movi programuvannya Vazhlivoyu chastinoyu ciyeyi fazi ye perevirka vidpovidnosti tipiv danih Same protyagom semantichnogo analizu viyavlyayut pomilki privedennya tipiv vikoristannya neinicijovanih zminnih vidkladenogo viznachennya tipiv U hodi analizu buduyetsya tablicya simvoliv klyuchove dzherelo posilan dlya podalshogo komponuvannya programi Generator promizhnogo kodu Protyagom svoyeyi roboti kompilyator mozhe mati odne abo navit dekilka promizhnih predstavlen kodu yak vhidni parametri dlya riznih faz kompilyaciyi Tak sintaksichne derevo pobudovane protyagom sintaksichnogo analizu ye prikladom takoyi promizhnoyi strukturi Prote tipovim principom pobudovi kompilyatoriv ye generaciya promizhnogo kodu u kinci fazi analizu dlya podalshoyi optimizaciyi ta translyaciyi u vihidnu movu Cej promizhnij kod she ne ye vihidnim kodom ale maye vazhlivi vlastivosti vin maye dosit legko generuvatisya ta legko translyuvatisya u cilovu movu Sintez back end Na bazi promizhnogo predstavlennya ta napovnenoyi tablici funkciyi konstruyuyetsya vihidna programa Oskilki pochatkovij vhidnij kod a vidpovidno i promizhne predstavlennya mozhe buti optimizovanij yak na bazi visokorivnevih pokrashen tak i beruchi do uvagi detalne znannya konkretnoyi arhitekturi vihodnogo kodu vin pidlyagaye dekilkom fazam analizu Analizuyetsya chas zhittya danih ta yih promizhne peremishennya za chas roboti programi deyaki bloki kodu identifikuyutsya yak mozhlivi kandidati do pidstanovki nizkorivnevim kodom Pislya analizu vidbuvayetsya optimizaciya ta rezultat pokrashen translyuyetsya u vihidnu movu Na cij fazi kompilyaciyi deyaki fazi vzhe ye neobov yazkovimi analiz optimizaciya i mozhut buti propusheni Poperednij analiz promizhnogo kodu Z chasiv pervinnih kompilyatoriv koli promizhnij kod bezposeredno translyuvavsya u vihidnu movu bulo rozrobleno veliku kilkist pokrashen utochnen ta optimizacij v zalezhnosti vid zmistu vhidnoyi programi Suchasni kompilyatori mozhut vikonuvati velikij nabir doslidzhen vhidnogo kodu shob dosyagti perevagi u produktivnosti vikoristovuvanij pam yati rozmiri vihidnogo fajla tosho Priklad rozpovsyudzhenih vidiv analizu Analiz potoku danih angl data flow analysis pobudova lancyuga vikoristannya viznachennya angl Use define chain na bazi yakogo u podalshogo vikonuyutsya chislenni optimizaciyi Analiz zalezhnostej poshuk instrukcij ta blokiv kodu yaki ne zalezhat vid poslidovnosti vikonannya v pevnomu konteksti Poshuk psevdonimiv angl alias v zalezhnosti vid togo chi vkazuyut pevni zminni u pevnij moment chasu na odin i toj samij ob yekt u pam yati ye psevdonimami mozhna robiti pripushennya shodo vzayemnoyi yih pidstanovki ta optimizaciyi Analiz oblasti vidimosti angl escape analysis dinamichnij analiz chasu zhittya ta oblasti vidimosti vkazivnikiv dlya efektivnishogo vikoristannya pam yati Na comu etapi takozh buduyetsya graf viklikiv struktura poslidovnosti viklikiv funkcij u vhidnomu kodi ta graf potoku keruvannya Optimizaciya promizhnogo kodu Optimizaciya ye promizhnim etapom pered kincevoyu pobudovoyu vihidnogo kodu pid chas yakogo kod mozhe buti pokrashenij zadlya shvidkodiyi rozmiru rezultuyuchogo fajlu efektivnih obchislen na paralelnih potokah vikonannya ob yemu vikoristovuvanij pam yati tosho Za masshtabom diyi optimizaciyu mozhna podiliti na lokalnu ta globalnu Lokalna optimizaciya vidbuvayetsya u mezhah bazovogo bloku grupi poslidovnih komand bez rozgaludzhen i perehodiv i polyagaye u lokalnih polipshennyah vidalennya kodu yakij ne vikoristovuyetsya poshuk totozhnih pidviraziv znizhennya skladnosti pidrahunkiv shlyahom zamini na bilsh deshevi operaciyi yak priklad stepin zaminiti mnozhennyam zgorannya konstant angl constant folding pidrahunok i zamina konstant yih znachennyami polipshennya povernennya znachennya lokalne rozpodilennya registriv angl register allocation Bilsh prosunutoyu ta rozshirenoyu ye globalna optimizaciya na rivni sutnostej sucilnoyi programi Pid chas globalnih optimizacij intensivno vikoristovuyutsya rezultati poperednih analiziv potoku danih zalezhnostej ta inshih Sered chislennih optimizacij mozhna vidiliti Globalne rozpodilennya registriv angl global register allocation Rozmotuvannya cikliv Usunennya zagalnih pidviraziv Avtomatichne rozparalelennya Optimizaciya cikliv dlya rozparalelennyaGeneraciya cilovogo kodu programi Ostannoyu fazoyu kompilyaciyi ye same stvorennya vihidnogo kodu programi Za stvorennya vidpovidaye generator cilovogo kodu yakij na bazi promizhnogo predstavlennya ta z urahuvannyam optimizacij vivodit ekvivalentnu vihidnu programu Osnovnimi vimogami do generatora ye zberezhennya semantichnogo zmistu vhidnogo kodu ta efektivne vikoristannya resursiv u vihidnomu kodi cili Vidilyayut taki zadachi pritamanni fazi generaciyi Vibir komand same translyaciya komand vhodu u kod cili Vporyadkuvannya komand viznachennya poryadku sliduvannya komand misce dlya ostannih mozhlivih optimizacij Rozpodil ta priznachennya registriv vibir zminnih yaki budut znahoditisya u pam yati v u kozhen moment chasu programi ta yih rozmishennya u konkretnih registrah Nalagodzhuvalna informaciya angl debug data dodayetsya same na cij finalnij stadiyi Vidi kompilyatorivZa principom roboti mozhna vidiliti taki vidi kompilyatoriv Odnoprohidni kompilyaciya zdijsnyuyetsya v odin prohid propuskayuchi bagato promizhnih krokiv optimizacij i perevirok Pershi kompilyatori movi Pascal Kompilyatori u zshitij kod angl threaded code kod yakij povnistyu skladayetsya z pidprogram Po suti kompilyator prosto zaminyuye kozhnu instrukciyu vhidnogo kodu na pidprogramu vihidnogo zshivaye z zagotivok Takij kompilyator maye mova programuvannya Forth deyaki funkciyi mozhut buti skompilovani pid chas vikonannya inkrementalno napriklad u poyednanni z interpretovanim vikonannyam Takij tip kompilyatoriv poshirenij u simejstvi LISP Peredfinalnij kompilyator angl stage compiler yakij kompilyuye u vihidnu movu teoretichnoyi mashini Takij kompilyator realizovanij dlya movi programuvannya Prolog vin generuye vihidnij kod dlya angl Warren Abstract Machine Dinamichnij kompilyator angl JIT just in time kompilyaciya na lotu Div nizhche Kompilyator zi zminnimi cilyami angl retargetable yakij vidnosno prosto mozhna zminiti dlya generaciyi cilovogo kodu pid inshu arhitekturu procesoru Zagalom taka vlastivist dosyagayetsya shlyahom znizhennya yakosti vihidnogo kodu u porivnyanni z cilovimi kompilyatorami pid konkretnij procesor Predstavnikom takogo tipu kompilyatoriv ye nabir GCC Kompilyator rozparalelennya yakij generuye vihidnih kod dlya zapusku na paralelnij arhitekturi en translyator sho sprijmaye formalnij opis movi programuvannya j generuye kompilyator dlya ciyeyi movi dzherelo Vektorizuvalnij Translyuye vihidnij kod v mashinnij kod komp yuteriv osnashenih vektornim procesorom en Vidi kompilyatoriv C Borland International Vihid kompilyatora Turbo C yavlyaye soboyu rozumnij ale ne duzhe optimizovanij kod Krim zgortki konstant vidalennya zajvih zavantazhen registriv i algebrayichnih sproshen kompilyator vikonuye tilki znizhennya potuzhnosti vidalennya nedosyazhnogo kodu i rozmishennya zminnih u registrah Vin ne pidtrimuye inshi zagalni metodi optimizaciyi taki yak vidalennya zajvih zberezhen zagalnih pidviraziv i zminni indukciyi ciklu a takozh vinesennya invariantnogo kodu Turbo C rozumno keruye prologom i epilogom funkcij i vikoristannyam registriv zasilayuchi v stek i vityagayuchi tilki ti registri sho yavno vikoristovuyutsya useredini tila funkciyi Computer Innovation Inc Kompilyator C86Plus viroblyaye chudovij kod iz serednim rivnem optimizaciyi Vin vikonuye bazovi prijomi optimizaciyi taki yak zgortka konstant i rozmnozhennya kopij Odnak vin ne vikonuye rozmnozhennya konstant dlya vidalennya zajvih zberezhen Hocha kompilyator uspishno vikonuye algebrayichni sproshennya vin porodzhuye zajvi instrukciyi cherez te sho rozmishaye rezultati v registrah zamist togo shob pomishati yih u zminni Cej efekt viyavlyayetsya v tom sho pri rozmishenni zminnih u registrah pochinayutsya sprobi pererozmishennya tomu sho pri vikonanni dekilkoh operatoriv rezultati v dijsnosti povinni buti privlasneni vidpovidnim zminnim Hocha C86Plus uspishno spravlyayetsya zi zgortkoyu yavnih prisvoyuvan sho dublyuyutsya v odne prisvoyuvannya vidalennya zajvih zberezhen vin vikonuye hitlivo Vin ne vikonuye istotnu optimizaciyu cikliv Datalight Inc Z poyavoyu Optimum C Datalight stala odnim z pershih postachalnikiv sho zaproponuvali optimizovanij kompilyator Hocha nabir testiv ne pidtverdiv naochno pretenziyi Datalight na globalnu optimizaciyu Optimum C spracyuvav tak dobre v deyakih fragmentah testu sho prodemonstruvav slabki fragmenti naboru yaki vimagayut zmin dlya udoskonalennya bazhanoyi perevirki Napriklad u pershij versiyi funkciyi jump compression ne povertalosya znachennya sho robilo vsi obchislennya i prisvoyuvannya u funkciyi zajvimi Optimum C viyaviv ce i vidaliv veliku chastinu kodu funkciyi vklyuchayuchi lancyuzhok perehodiv U testi rozmnozhennya konstant i kopij Optimum C viznachiv sho prisvoyuvannya i5 v oboh umovnih operatorah ye zajvim stosovno nastupnih prisvoyuvan Kompilyator vidaliv ne tilki ci prisvoyuvannya ale j umovni operatori Nezadovilnim viyavilosya vidalennya zajvih zberezhen znachen registriv Optimum C yedinij kompilyator sho namagavsya vikonati gliboke vidalennya zagalnih virazhen Perevirka zgenerovanogo kodu pokazala sho zagalne virazhennya i5 i2 bulo peremisheno vishe pershogo bazovogo bloku umovnogo operatora ale ne bulo vilucheno z drugogo Poza obmezhennyami na standartne vikoristannya registriv sho nakladayutsya simejstvom mikroprocesoriv 80x86 Optimum C rozumno vikoristovuye registri U funkciyi jump compression kozhen peredanij parametr buv pomishenij u registr Useredini tila funkciyi ne bulo posilan u pam yat krim pochatkovogo zasilannya v registri Odniyeyu vazhlivoyu oblastyu u yakij kompilyator Optimum C vimagaye polipshen ye optimizaciya cikliv Kompilyator ne namagayetsya vikonuvati vinesennya invariantnogo kodu i vidalennya zminnih indukciyi ciklu Test vikonannya pokazav sho kompilyator Datalight duzhe efektivno keruye vvedennyam visnovkom getc putc a inshi testi vikonuyutsya v prijnyatnij chas Lattice Inc Kompilyator sho maye veliku istoriyu Lattice MS DOS C poslidovno udoskonalyuvavsya z kozhnoyu novoyu versiyeyu Vin vidomij yak generator stabilnogo peredbachuvanogo kodu i vikonuye pomirnu optimizaciyu Lattice S vikonuye znizhennya potuzhnosti stisk lancyuzhka perehodiv i vidalennya zagalnih pidviraziv Vin ne vidalyaye prisvoyuvannya sho dublyuyutsya pislya testu vbudovanih funkcij i zajvi prisvoyuvannya u funkciyi dead code Lattice C ne vikonuye optimizaciyu cikliv Manx Software Systems Inc Kompilyator Aztec C86 zgeneruvav chudovij kod z dosit garnim rivnem optimizaciyi Krim zgortki konstant i algebrayichnih sproshen Aztec C86 vikonav znizhennya potuzhnosti i vidalennya zagalnih pidviraziv Odnak vin ne vikonav vidalennya zajvih prisvoyuvan i ne vidalyav nedosyazhnij kod Aztec C86 zgeneruvav kod dlya nedosyazhnogo operatora printf razom z bezumovnim perehodom cherez nogo Oskilki bud yaka programa na Si maye znachnu kilkist viklikiv funkcij zagolovok kozhnogo vikliku neobhidno minimizuvati Aztec C86 vikoristovuye nezvichajnij ale efektivnij pidhid do rishennya ciyeyi problemi Na vihodi kompilyatora vihodit tekst u movi asemblera sho obroblyayetsya okremim asemblerom Kompilyator vstavlyaye v tekst direktivi umovnogo asemblyuvannya navkolo kodu sho vstanovlyuye stekovij kadr i zberigaye registri Pislya generaciyi kodu funkciyi kompilyator viznachaye simvoli dlya keruvannya ustanovkoyu stekovogo kadru i zberezhennya tilki tih registriv sho vikoristovuyutsya u funkciyi Aztec C86 ne zmig virishiti zadachu peretvorennya lancyuzhka perehodiv v odin perehid do kincevoyi meti Vin takozh ne vikonuvav optimizaciyu cikliv Metaware Inc High C viroblyaye chudovij kod iz serednim rivnem optimizaciyi Kompilyator vikonuye vsi bazovi vidi optimizaciyi vklyuchayuchi zgortku konstant i algebrayichni sproshennya vidalennya zajvih operacij zavantazhennya registriv znizhennya potuzhnosti i vidalennya zagalnih pidviraziv Kompilyator Metaware vidalyaye nedosyazhnij kod ale ne vidalyaye zajvi prisvoyuvannya High C rozumno vikoristovuye mashinno zalezhni instrukciyi Kompilyator udoskonalit zavantazhennya konstant iz krapkoyu sho plavaye vikoristovuyuchi komandu kopiyuvannya ryadkiv MOVS procesoriv 80x86 dlya zapisu znachen iz krapkoyu sho plavaye obchislenih pid chas kompilyaciyi Vin takozh generuye instrukciyu LEAVE procesoriv 80x86 dlya epilogu funkcij ale vstanovlyuye adresaciyu stekovogo kadru v prolozi funkciyi za dopomogoyu okremih instrukcij a ne vikoristovuyuchi bilsh trivalu instrukciyu ENTER Kompilyator High C ne vikonuye vinesennya invariantnogo kodu vazhlivij metod optimizaciyi cikliv Vin takozh ne zmig zastosuvati uspishne vidalennya zminnih indukciyi cikliv Vbudovani funkciyi pidtrimuyutsya dlya dekilkoh cilochislennih i strokovih operacij takih yak strlen Microsoft C U versiyi 5 0 svogo kompilyatora Si korporaciya Microsoft vivela na rinok PC visokij riven optimizaciyi kodu Microsoft pridilyaye bagato uvagi analizu cikliv C 5 0 yedinij z rozglyanutih kompilyatoriv sho vikonuye vinesennya invariantnogo kodu i sogodenne vidalennya zminnih indukciyi cikliv Kompilyator Microsoft C 5 0 chudovo vikoristovuye registri namagayuchis minimizuvati zvertannya do pam yati v tili ciklu Prostij priklad ciklu v kodi testu demonstruye stupin optimizaciyi cikliv yakij vikonuye Microsoft C 5 0 Kompilyator zastosovuye znizhennya potuzhnosti i cilkom vidalyaye konstantne mnozhennya viyavlyaye kincevij stan zminnih i pomishaye v registri vsi zminni vseredini ciklu C 5 0 vidalyaye cikl for i generuye kod tilki z metoyu ustanovki kincevogo stanu zminnoyi indeksu ciklu j operatora vklyuchenogo v cikl Kompilyator takozh dobre vikoristovuye registri Uvaga firmi Microsoft do optimizaciyi vinagorodzhuyetsya pri roboti testu vikonannya Vin vikonuyetsya za chas sho ye krashim chi blizko do krashogo po kozhnij kategoriyi WATCOM Novitnij supernik sho zavojovuye poziciyi na rinku kompilyatoriv C WATCOM C 6 0 div Product Watch Philip N Hisley za cej misyac C 6 0 viroblyaye kompaktnij kod sho chudovo vikoristovuye trohi obmezhenij komplekt registriv simejstva 80x86 Krim vikonannya bazovih prijomiv optimizaciyi vin pidtrimuye znizhennya potuzhnosti i vidalennya nedosyazhnogo kodu i zagalnih pidviraziv U toj chas yak Microsoft dosyagaye polipshennya kodu zavdyaki optimizaciyi cikliv WATCOM zbilshuye shvidkist shlyahom zmenshennya keruyuchih zagolovkiv viklikiv funkcij do yihnogo absolyutno minimalnogo rozmiru Vin dosyagaye cogo shlyahom perevazhnoyi peredachi parametriv cherez registri a ne cherez stek WATCOM duzhe dobre vidalyaye nedosyazhnij kod C 6 0 ne tilki vidaliv nepotribni prisvoyuvannya i nedosyazhnij kod useredini funkciyi ale vin takozh vidaliv prolog i epilog funkciyi i zgornuv usyu funkciyu do prostogo povernennya pripisavshi im ya funkciyi do instrukciyi povernennya osnovnoyi funkciyi Na zavershennya vsogo kompilyator vidaliv lokalnij viklik funkciyi Naskilki C 6 0 vitonchenij u znishenni marnoyi funkciyi nastilki zh vin bezpomichnij pri vidalenni marnogo prisvoyuvannya sho dublyuyetsya Najbilsh vazhliva oblast za yaku WATCOM C 6 0 yak i Optimum C ne zmig uzyatisya bula optimizaciya cikliv Vin ne pidtrimuye vinesennya invariantnogo kodu i vidalennya zminnoyi indukciyi cikliv Hocha C 6 0 ne vikonuye rozgortannya cikliv v okremi komandi vin takozh yak Datalight Optimum C i Computer Innovations C86Plus vikoristovuye komandu REP STOSW procesoriv 80x86 dlya inicializaciyi testovogo masivu zavdyaki chomu vidalyaye cikl Prekrasna generaciya kodu v WATCOM zokrema rozumne vikoristannya registriv daye jomu duzhe vazhlivu perevagu Vin peremig u bilshosti testiv sho intensivno vikoristovuyut procesor i pri comu vikonuvavsya dlya velikoyi modeli v krashij chas nizh bilshist inshih kompilyatoriv dlya maloyi modeli Do slabkih storin WATCOM mozhna vidnesti vvedennya vivedennya fajliv vikoristannya getc i putc Tut vin blizkij do najgirshih kompilyatoriv Strategiyi kompilyaciyiKompilyatori sluguyut svoyim cilyam u riznij sposib dlya riznih mov programuvannya ta paradigm Tak yaksho istorichno pervinni kompilyatori translyuvali kod movi u aparatno zalezhnij asembler to z chasom vinikla potreba u dodatkovih metodah ta sharah abstrakciyi kompilyaciyi na lotu translyuvannya bilsh visokorivnevogo kodu v menshij za rivnem optimizaciyi po vikoristannyu vzhe skompilovanogo kodu tosho Poshireni strategiyi kompilyaciyi Kompilyaciya pered vikonannyam angl AOT ahead of time Klasichnij princip koli kompilyaciya provoditsya okremo vid vikonannya zazvichaj u vidminnomu vid miscya vikonannya seredovishi Kompilyatori mov programuvannya Pascal C C BASIC Fortran COBOL vikoristovuyut strategiyu takoyi poperednoyi kompilyaciyi PerevagiShvidke zavantazhennya v brauzeri Vitrachayetsya menshe chasu za rahunok togo sho zastosunok kompilyuyetsya do zavantazhennya v brauzer ta kincevi fajli mayut menshij rozmir Viyavlennya pomilok pid chas zbirki Mayetsya mozhlivist vipraviti vsi pomilki do zapusku zastosunku v rezhimi ekspluataciyi Pidvishena bezpeka Kompilyaciya pid chas vikonannya angl JIT just in time vidoma takozh yak dinamichna kompilyaciya Sut polyagaye u kompilyaciyi chasu vikonannya angl run time koli tekst vhidnoyi movi peretvoryuyetsya u mashinnij kod na lotu j tut zhe vikonuyetsya Cya tehnika poyednuye u sobi metodi yak poperednoyi kompilyaciyi u promizhnij kod tak i interpretaciyi cogo promizhnogo kodu pid chas vikonannya Buduchi bilsh prodvinutoyu tehnikoyu kompilyaciya na lotu maye dosit suvori vimogi do prostoti kompilyaciyi i ne ye docilnoyu dlya pevnih mov programuvannya Principovim predstavnikom JIT kompilyaciyi ye seredovishe vikonannya movi Java pionerom zhe vvazhayetsya Smalltalk Transkompilyaciya abo kompilyaciya z odniyeyi visokorivnevoyi movi v inshu angl source to source Principovoyu vidminnistyu danoyi strategiyi ye te sho yak vhidnij tak i vihidnij kod ye movami programuvannya visokogo rivnya Tipovimi prikladami vikoristannya ye pidgotovka kodu dlya paralelnoyi optimizaciyi perekompilyaciya starishogo kodu dlya novoyi versiyi standartu movi programuvannya kompilyaciya mov nadbudov u bazovu movu Predstavnikami takih mov programuvannya ye CoffeeScript Dart Haxe Perekompilyaciya dinamichna kompilyaciya chastin programi pid chas vikonannya angl dynamic recompilation Osoblivist deyakih sered vikonannya emulyatoriv ta virtualnih mashin perekompilovuvati deyaku chastinu programi pid chas yiyi roboti Cya tehnika vikoristovuyetsya dlya perenosu kodu na inshu arhitekturu pid chas jogo vikonannya zokrema dlya zapusku zastarilih program na suchasnih operacijnih sistemah Shiroko vikoristovuyetsya Java run time ta Net Common Language Runtime a takozh bagatma virtualnimi mashinami Osnovnimi zavdannyami yaki povinen vikonuvati dinamichnij rekompilyator ye Chitannya mashinnogo kodu z vihidnoyi platformi Vidaye mashinnij kod dlya cilovoyi platformiVidomi kompilyatoriAmsterdam Compiler Kit nabir zasobiv dlya napisannya kompilyatoriv dlya sistemi Minix avtorstva Endryu Tanenbauma ta Serila Yakobsa GCC vidomij nabir kompilyatoriv C ta piznishe C stvorenij Richardom Stolmenom shiroko poshirenij u sviti Linux Clang kompilyator simejstva C C yakij vikoristovuye tehnologiyu LLVM virtualnoyi mashini na bazi promizhnogo predstavlennya kodu Turbo Pascal vidatnij kompilyator stvorenij Andersom Gejlsbergom u 1983 roci kompilyator movi C rozroblenij kompaniyeyu Borland u 1987 roci Mono bagatoplatformovij nabir zasobiv ta kompilyator movi C u vilnomu dostupi PyPy JIT kompilyator movi Python napisanij na movi Python Generatori analizatoriv Pobudovani algoritmi sho peretvoryuyut opis vhidnoyi movi u programu sho vikonuye analiz i ye velika kilkist realizacij cih algoritmiv Ye takozh utiliti sho avtomatizuyut reshtu faz kompilyaciyi ta sistemi stvorennya kompilyatoriv u cilomu V Unix poshireni generator leksichnih analizatoriv F Lex ta generatori sintaksichnih analizatoriv Bison ta Yacc LiteraturaCompilers Principles Techniques and Tools 24 Travnya 2016 u Wayback Machine English vid 2nd edition Addison Wesley 2006 09 10 ISBN 9780321486813 Engineering a Compiler Second Edition English vid 2 edition Morgan Kaufmann 2011 02 21 ISBN 9780120884780 Advanced Compiler Design and Implementation English vid 1 edition Morgan Kaufmann 1997 08 15 ISBN 9781558603202 Compiler Design in C English Prentice Hall 1990 01 01 ISBN 9780131550452 Modern Compiler Implementation in Java 25 Kvitnya 2016 u Wayback Machine English vid 2nd edition Cambridge University Press 2002 10 21 ISBN 9780521820608 Understanding and Writing Compilers A do it yourself guide English vid 3rd ed edition Palgrave 1979 10 01 ISBN 9780333217320 Let s Build a Compiler 8 Lyutogo 2016 u Wayback Machine compilers iecc com Procitovano 2016 03 27 PosilannyaHopper Grace The Education of a Computer Proceedings of the Association for Computing Machinery Conference 1952 reprinted Vol 9 No 3 4 1952 pp 271 281 Glushkov V M Yushenko K L K L 1962 Vychislitelnaya mashina Kiev matematicheskoe opisanie ros Kiev Tehn lit Yushenko E L 1963 Adresnoe programmirovanie Kiyiv Derzhavne vidavnictvo tehnichnoyi literaturi s 288 Principles of Compiler Design English vid 2nd edition Addison Wesley 1 serpnya 1977 ISBN 9780201000221 www williamspublishing com s 705 706 Arhiv originalu za 4 Bereznya 2016 Procitovano 30 bereznya 2016 www compilers net Arhiv originalu za 19 Lipnya 2019 Procitovano 30 bereznya 2016 www pcengines ch Arhiv originalu za 13 Bereznya 2016 Procitovano 30 bereznya 2016 www complang tuwien ac at Arhiv originalu za 16 Bereznya 2016 Procitovano 30 bereznya 2016 Horn Joe Arhiv originalu za 17 Veresnya 2017 wambook sourceforge net Arhiv originalu za 19 Sichnya 2022 Procitovano 2 kvitnya 2016 Aycock John 1 chervnya 2003 A Brief History of Just in time ACM Comput Surv T 35 2 s 97 113 doi 10 1145 857076 857077 ISSN 0360 0300 Procitovano 27 bereznya 2016 GitHub Arhiv originalu za 31 Sichnya 2020 Procitovano 27 bereznya 2016 lwn net Arhiv originalu za 15 Bereznya 2016 Procitovano 27 bereznya 2016 www ibm com angl 21 grudnya 2004 Arhiv originalu za 17 Bereznya 2016 Procitovano 27 bereznya 2016 msdn microsoft com Arhiv originalu za 16 Bereznya 2016 Procitovano 27 bereznya 2016