Знаймо![]() приховати рекламу
| Цей текст може містити помилки. КомпіляторПлан:
Література Введення Ця стаття включає опис терміна "Компіляція";. Компілятор - програма або технічний засіб, що виконує компіляцію. [1] [2] [3] Компіляція - трансляція програми, складеної на вихідному мові високого рівня, в еквівалентну програму на низькорівневому мовою, близькому машинного коду ( абсолютний код, об'єктний модуль, іноді на мова асемблера). [2] [3] [4] Вхідний інформацією для компілятора ( вихідний код) є опис алгоритму або програма на проблемно-орієнтованій мові, а на виході компілятора - еквівалентне опис алгоритму на машинно-орієнтованій мові (об'єктний код). [5] Компілювати - проводити трансляцію машинної програми з проблемно-орієнтованої мови на машинно-орієнтована мова. [3] 1. Види компіляторів [2]
2. Види компіляції [2]
3. ОсновиБільшість компіляторів переводить програму з деякого високорівневого мови програмування в машинний код, який може бути безпосередньо виконаний процесором. Як правило, цей код також орієнтований на виконання в середовищі конкретної операційної системи, оскільки використовує надані нею можливості ( системні виклики, бібліотеки функцій). Архітектура (набір програмно-апаратних засобів), для якої проводиться компіляція, називається цільової машиною. Деякі компілятори переводять програму з мови високого рівня не прямо в машинний код, а на мова асемблера. Результатом роботи інших компіляторів є програма на спеціально створеному низькорівневому мовою, підметі інтерпретації віртуальною машиною. Така мова називається псевдокоду або байт-кодом. Як правило, він не є машинним кодом якогось комп'ютера і програми на ньому можуть виконуватися на різних архітектурах, де є відповідна віртуальна машина, але в деяких випадках створюються апаратні платформи, безпосередньо підтримують псевдокод-якої мови. Наприклад, псевдокод мови Java називається байт-кодом Java ( англ. Java bytecode ) І виконується в Java Virtual Machine, для його прямого виконання була створена специфікація процесора picoJava. Для платформи . NET Framework псевдокод називається Common Intermediate Language (CIL), а середа виконання - Common Language Runtime (CLR). Віртуальна машина може відразу інтерпретувати псевдокод, або транслювати його в машинний код безпосередньо перед виконанням. Останнє називається динамічною або JIT-компіляцією. CIL-код також компілюється в код цільової машини JIT-компілятором, а бібліотеки . NET Framework компілюються заздалегідь. Для кожної цільової машини ( IBM, Apple, Sun і т. д.) і кожної операційної системи або сімейства операційних систем, що працюють на цільовій машині, потрібно написання свого компілятора. Існують також так звані крос-компілятори, що дозволяють на одній машині і в середовищі однієї ОС генерувати код, призначений для виконання на інший цільовій машині і / або в середовищі іншої ОС. Крім того, компілятори можуть оптимізувати код під різні моделі з одного сімейства процесорів (шляхом підтримки специфічних для цих моделей особливостей або розширень наборів інструкцій). Наприклад, код, скомпільований під процесори сімейства Pentium, може враховувати особливості розпаралелювання інструкцій і використовувати їх специфічні розширення - MMX, SSE і т. п. Існують програми, які вирішують зворотну задачу - переклад програми з низькорівневого мови на високорівнева. Цей процес називають декомпіляцією, а такі програми - декомпіляторамі. Але оскільки компіляція - це процес з втратами, точно відновити вихідний код, скажімо, на C + +, в загальному випадку неможливо. Більш ефективно декомпіліруются програми в байт-коди - наприклад, існує досить надійний декомпілятор для Flash. Різновидом декомпіляції є дізассемблірованіе машинного коду в код на мові асемблера, який майже завжди виконується успішно (при цьому складність може представляти самомодифицирующихся код або код, в якому власне код і дані не розділені). Пов'язано це з тим, що між кодами машинних команд і командами асемблера є практично взаємно-однозначна відповідність. 4. Структура компілятораПроцес компіляції складається з наступних етапів:
У конкретних реалізаціях компіляторів ці етапи можуть бути розділені або, навпаки, поєднані в тому чи іншому вигляді. 5. Роздільна компіляціяРоздільна компіляція ( англ. separate compilation ) - Трансляція частин програми окремо з наступним об'єднанням їх компонувальником в єдиний завантажувальний модуль. [2] Історично особливістю компілятора, відображеної в його назві ( англ. compile - Збирати разом, складати), було те, що він виробляв як трансляцію, так і компоновку, при цьому компілятор міг породжувати відразу абсолютний код. Проте пізніше, із зростанням складності і розміру програм (і збільшенням часу, що витрачається на перекомпіляцію), виникла необхідність розділяти програми на частини і виділяти бібліотеки, які можна компілювати незалежно один від одного. При трансляції кожної частини програми компілятор породжує об'єктний модуль, що містить додаткову інформацію, яка потім, при компонуванні частин в здійснимих модуль, використовується для зв'язування і дозволу посилань між частинами. Поява роздільної компіляції і виділення компоновки як окремої стадії відбулося значно пізніше створення компіляторів. У зв'язку з цим замість терміна "компілятор" іноді використовують термін "транслятор" як його синонім: або в старій літературі, або коли хочуть підкреслити його здатність переводити програму в машинний код (і навпаки, використовують термін "компілятор" для підкреслення здатності збирати з багатьох файлів один). 6. Цікаві фактиНа зорі розвитку комп'ютерів перший компілятор (транслятори) називали "програмуючими програмами" [6] (так як в той момент програмою вважався тільки машинний код, а "програмує програма" була здатна з людського тексту зробити машинний код, тобто запрограмувати ЕОМ). Примітки
Література
Цей текст може містити помилки. Схожі роботи | скачати Схожі роботи: Оптимізуючий компілятор |