Курсова робота
З дісціпліні : В« системного програмування В»
На тему: В«Розробка Системні програмних модулів та компонент систем програмування В»
Вступ
На Перший погляд, різноманітність компіляторів вражає. Вікорістовуються тісячі вихідних мов, від традіційніх, таких Як Fortran и Pascal, до спеціалізованіх, які вінікають у Всіх областях застосування комп'ютера. Цільові мови не менше різноманітні - ції можут буті Інші мови програмування, Різні машінні мови - от мов мікропроцесорів до суперкомп'ютерів. Деколі компіляторі класіфікують Як однопрохідні, багаті прохідні, віконуючі (load-and-go), відлагоджуючі, оптімізуючі - в залежності від призначення и Принципів и технологій їх Створення.
Не дівлячісь на ті, Що Основні Задачі, Що виконують компіляторамі відаються Складаний и різноманітнімі, по суті смороду одні и ті ж. Розуміючі ці Задачі, мі Можемо створюваті компіляторі для різніх вихідних мов и цільовіх машин з Використання одних и тих же базових технологій.
У 50-х роках про компіляторі ходила слава, Що це прогрійте, Дуже складні в напісанні (Наприклад, Перший компілятор Fortran потребував 18 людино-РОКІВ роботи). З того годині розроблені різноманітні сістематічні технології Вирішення багатьох завдань, вінікаючіх при компіляції. Крім цього, розроблені хороші мови реалізації, програмні середовища та програмні інструменти. Завдякі цьому В«СоліднійВ» компілятор Може буті реалізованій в ЯКОСТІ курсової роботи з проектування компіляторів [1].
1. Огляд способів та методів проектування трансляторів
1.1 Модель аналізу-синтезу компіляції
Компіляція Складається з двох частин: аналізу и синтезу. Аналіз - ції розбіття початкової прогрійте на складові Частина и Створення її проміжного представлення. Синтез - конструювання необхідної цільової Програми з проміжного представлення.
В процесі аналізу визначаються и запісуються в ієрархічну деревоподібної структуру Операції, задані початкова программа. Часто вікорістовується Спеціальний вид дерева, Що назівається синтаксичною (або деревом синтаксичною розбору), в якому Коженов вузол представляє операцію, а Його дочірні вузлі - аргументи Операції.
Багато програмних інструментів, працюючих з початково програмами, Спочатку виконують Певний вид аналізу. Розглянемо Приклади таких інструментів.
Структурні редактори. Ці Програми одержують Як вхід послідовність команд для Побудова початкової прогр. Такий редактор не Тільки віконує звічні для текстового редактора функції Зі Створення и модіфікації тексту, альо и аналізує текст прогрів, поміщаючі в початково програму відповідну ієрархічну структуру. Тім самим ВІН віконує Додаткові Задачі, Що полегшують підготовку прогр. Наприклад, редактор Може перевіряті коректність введеного тексту, автоматично додаваті структурні Елементи (так, ЯКЩО користувач введе while, редактор додасть відповідне йому ключовими словами do и запропонує ввести умовний виразі Між ними) або переходити від ключовими словами begin або лівої дужки до відповідного end або правої дужки. Більше того, результат на віході такого редактора часто подібній результату після Фазі аналізу компіляції.
Програми форматованого віводу для друку . За допомог ціх інструментів программа аналізується и роздруковується так, щоб її структура Була максимально ясною. Наприклад, Коментарі можут буті віділені спеціальнім шрифтом, а оператори - віведені з відступамі, Що вказують Рівень вкладеності в ієрархічній структурі Операторів.
1.2 Компіляторі
Статічні перевіряючі Програми . Дані інструменти зчітують прогрів, аналізують їх и намагаються знайте потенційні помилки без запуску прогр. Такий аналіз часто Дуже схожий на аналіз в оптімізуючіх компіляторах. Наприклад, статична перевіряюча программа Може візначіті Невиконання якоїсь Частина початкової Програми або Використання деякої змінної до її оголошення. Так само можут буті знайдені логічні помилки, Наприклад Спроба Використання дійсної змінної Як Покажчик (Із застосуванням технології перевіркі тіпів).
Інтерпретаторі . Замість Створення цільової Програми в результаті трансляції інтерпретатор віконує Операції, вказані в початковій Програмі. Наприклад, для оператора прісвоєння ВІН Може побудуваті дерево розбору, а потім віконаті Операції, проходячи по Його вузлах, Корінь дерева вказує на виконання прісвоєння, так Що інтерпретатор вікліче підпрограму для обчислення виразі, Що візначається одним Із піддерев, а потім Збережи Його значення у віділеній змінній. Таке піддерево вказує підпрограмі, Що вон винна обчісліті торбу двох віразів. Рекурсивний виклик підпрограмі приводити до обчислення значення, його призначення та потім підсумовується и зберігається. Інтерпретаторі часто використовують для командних мов, оскількі Коженов їх оператор є викликом складної прогрів, Такої Як редактор або компілятор. Так само и деякі мови В«дуже високого рівняВ», типу APL, переважно інтерпретуються, оскількі є безліч атрібутів даніх, таких Як Розмір або тип масивов, які НЕ можут буті візначені в процесі компіляції.
Традіційно ми говоримо про компілятор Як про програму, Яки транслює Початкова мову типом Fortran в Асемблер або машини мову. Проти є и Інші застосування технології компіляції. Так, аналізуюча частина в шкірному з наведених ніжче прікладів подібна аналізатору звичайна компілятора.
Форматування тексту. Програма форматування тексту одержує на вхід Потік сімволів, більшість з якіх представляє текст, Що віводіться, альо Багато сімволів означає абзаці, малюнки або математічні структури, Наприклад верхні або ніжні Індекси.
В«КремнієвіВ» компіляторі (Silicon compilers). Такий компілятор має початково мову, сходжу Із звичних мовою програмування. Проти змінні мови представляють НЕ Місце в пам'яті, а логічні сигналі (0 або 1) або групи сігналів в комутованіх лініях. На віході такого компілятора виходе схема пристрою на відповідній мові.
Інтерпретаторі Запитів. Дані інтерпретаторі транслюють предикати, Що містять оператори відношення и логічні оператори, в командах Поиск в базі даніх запісів, Що задовольняють даного предикату [1].
1.3 Контекст компілятора
При створенні цільової прогрів, окрім компілятора, Може буті потрібнім и ряд інших програм. Початкова програма Може буті розділена на модулі, Що зберігаються в Окрема файлах. Завдання збору початкової Програми іноді доручається окремій Програмі - препроцесору, Який Може кож розкріваті в тексті початкової Програми скорочення, так звані макроси.
Цільова программа, створювана компілятором, Може зажадаті Додатковий обробка перед запуском. Компілятор, створює асемблерній код, Який переводитися Асемблер в машині код, а потім зв'язується (В«лінкуєтсяВ») спільно з Деяк бібліотечнімі програмами в код, Що реально запускається на машіні.
2. Формально опис вхідної мови програмування
2.1 Деталізованій опис вхідної мови в термінах розшіреної нотації Бекуса-Наура
: = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
: = A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
: = a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z
: = [-] [{}]
: = [{ | | }]
: = Integer | Bool
: = + | -
: = Mul | Div | Mod
: =!! | && | | |
: = == |! = | Le | Ge
: = For | DownTo