русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Формування проміжного коду


Дата додавання: 2014-11-28; переглядів: 1101.


Можливі різні форми внутрішнього подання синтаксичних конструкцій вихідної програми в компіляторі. Дерево граматичного розбору виявляється незручним у роботі при роботі при генерації й оптимізації об'єктного коду. Тому перед оптимізацією і безпосередньо генерацією об'єктного коду внутрішнє представлення програми перетвориться в одну з відповідних форм запису.
Прикладами таких форм запису є:
- Зворотна польський запис операцій;
- Тетради операцій;
- Тріади операцій;
- Власне команди асемблера.
Зворотний польський запис - це постфіксній запис операцій. Перевагою її є те, що всі операції записуються безпосередньо в порядку їх виконання. Вона надзвичайно ефективна в тих випадках, коли для обчислень використовується стек.
Тетради представляють собою запис операцій у формі з чотирьох складових:
<Операція> (<операнд1>, <операнд2>, <результат>).
Тетради використовуються рідко, так як вимагають більше пам'яті для свого представлення, ніж тріади, не відображають взаємозв'язку операцій і, крім того, погано відображаються в команди асемблера і машинні коди, тому що в наборах команд більшості сучасних машин не зустрічаються операції з трьома операндами.
Тріади представляють собою запис операцій у формі з трьох складових: <операція> (<операнд1>, <операнд2>), при цьому один або обидва операнди можуть бути посиланнями на іншу тріаду в тому випадку, якщо в якості операнда даної тріади виступає результат виконання іншою тріади. Тому тріади при записі послідовно номеруют для зручності вказівки посилань одних тріад на інші. Наприклад, вираз A: = B * C + D - B * 10, записане у вигляді тріад будемати вигляд:
1) * (B, C)
2) + (^ 1, D)
3) * (B, 10)
4) - (^ 2, ^ 3)
5): = (A, ^ 4)
Тут операції позначені відповідним знаком (при цьому присвоєння також є операцією), а знак ^ означає посилання операнда однієї тріади на результат інший.
Команди асемблера зручні тим, що при їх використанні внутрішнє представлення програми повністю відповідає об'єктного коду і складні перетворення не потрібні. Проте використання команд асемблера вимагає додаткових структур для відображення їх взаємозв'язку. Крім того, внутрішнє представлення програми виходить залежним від результуючого коду, а це значить, що при орієнтації компілятора на інший результуючий код потрібно перебудовувати як саме внутрішнє представлення програми, так і методи його обробки в алгоритмах оптимізації (при використанні тріад або тетрад цього не потрібно) .
Для побудови внутрішнього подання об'єктного коду (надалі - просто коду) по дереву висновку може використовуватися найпростіша рекурсивна процедура. Ця процедура перш за все повинна визначити тип вузла дерева - він відповідає типу операції, символ якої знаходиться в листі дерева для поточного вузла. Цей лист є середнім листом вузла дерева для бінарних операцій і крайнім лівим листом - для унарних операцій. Після визначення типу процедура будує код для вузла дерева відповідно до типу операції. Якщо всі вузли наступного рівня для поточного вузла є листя дерева, то в код включаються операнди, що відповідають цим листю, і код, стає результатом виконання процедури. Інакше процедура повинна рекурсивно викликати сама себе для генерації коду нижележащих вузлів дерева і результат виконання включити в свій породжений код.
Тому для побудови внутрішнього подання об'єктного коду по дереву виведення в першу чергу необхідно розробити форми подання об'єктного коду для чотирьох випадків, відповідних видів поточного вузла дерева виведення:
обидва нижележащих вузла дерева - листя (термінальні символи граматики);
тільки лівий нижележащий вузол є листом дерева;
тільки правий нижележащий вузол є листом дерева:
обидва нижележащих вузла не є листям дерева.

структурна схема компілятора.

 

7. Поняття оптимізації проміжного коду. Оптимізаційні операції.

Оптимізація проміжного коду - виділення загальних подвираженія та обчислення константних подвираженія.
Фаза оптимізації призначена для зменшення надлишковості програми за витратами часу та пам'яті. У залежності від критеріїв проектування транслятора дана фаза обробки програми може виключатися з циклу обробки програми.

Для побудови проміжного коду реальної обчислювальної системи окрім особливостей безпосереднього алгоритму слід врахувати і функціональні можливості системи , тобто виділену ОП, систему аналізу, наявність регістрів та наявність операцій. В реальних компіляторах для побудови остаточного коду враховуються всі особливості обчислювальної системи, а також відбуваються оптимізаційні перетворення на рівні елементарних команд. В загальному випадку оптимізаційні перетворення стусуються будь-якої частини алгоритму, але найбільш прості та показові є оптимізації лінійних ділянок. Блоком або лінійною ділянкою в проміжному коді називається частина алгоритма яка складається з послідовності операцій присвоєння. Нехай множина це деяка множина зміних, - множина операцій, при чому множини і - скінченні і не перетинаються. Операція здійснюється над однією або декількома змінними. Оператором присвоєння називається вираз , де -операція, А1,В1,…,Br – змінні, r – кількість зміних що беруть участь в операціях. Такий вираз означає що операція присвоює значення зміній А і посилається на змінні В1,…,Br. Процес спрощення лінійної ділянки при якому отримуються еквівалентні блоки називаються оптимізацією. Два блоки називаються еквівалентними якщо їх значення рівні на всьому періоді оцінювання відповідних паралельних кроків. З точки зору термінології оптимальним вважається найкращий за деякою ознакою зв'язок задачі. Щодо оптимізації обчислювального процесу даний термін незовсім коректний і передбачає знаходження нової послідовності дій, яка приводить до ідентичного результату за менший час, з меншими затратами, меншою кількістю операторів, та використання меншої кількості додаткових зміних. Для будь-якого блоку існує безліч інших еквівалентних блоків, серед яких є хоча б один блок з мінімальною кількістю операторів. Для отримання мінімального блоку можна застосувати наступні перетворення:

a) Перетворення вилучення безкорисних операцій присвоєння (Т1). Якщо змінна А неактивна після оператора , то

1. якщо і>0 то оператор можна вилучити з множини Р.

2. якщо і=0 то оператор можна вилучити з множини І.

Якщо змінна А належить до вхідних змінних і в блоці не використовується, змінну можна вилучити, або якщо змінній А деяким оператором присвоюється значення і дане значення не використовується можна вилучити оператор.

b) Вилучення надлишкових обчислень (Т2). Часто в програмах виникають ситуації коли ідентичні обчислення виконуються повторно. Такі обчислення називаються надлишковими.

c) Перетворення переіменування (Т3). Оскільки блок є відносно незалежним для якого фіксованим є вхідна і вихідна множина то назви внутрішніх змінних не впливають на значення блоку.

d) Перетворення перестановки (Т4).

Перетворення Т1-Т4 дозволяють зменшити кількість операцій проміжного коду з метою позбавлення безкорисних та повторних дій. В програмах де проводиться багато математичних обчислень оптимізацію коду можна отримати і за рахунок застосування алгебраїчних законів. Як правило використовуються наступні алгебраїчні перетворення:

a) Закон комутативності. Операцією називають комутативною, якщо а b=b a.

b) Операція називається асоціативною якщо (a b) c=a (b c).

c) Операція 1 називається дистрибутивною відносно операції 2 якщо a 1(b 2c)=a 1b 2a 1c

d) Операція іденпотентною якщо, а=а.

8. Графічне представлення лінійних ділянок проміжного коду. Перетворення на графах.

Для запису проміжного коду елементарної операції записується у вигляді Ө,α1,α2,αn

Ө - операція

α1,α2,αn – дії над операціями.

В більшості сучаних компютерах реалізується модель Ө α1[α2]. Будь – яку лінійну ділянку можна представити у вигляді деревовидного графа. Якщо лінійна ділянка має довжену вхідних символів І={ α1…αn } вихідних символів U={β1…βn} деяка множена операцій P=(p1…pk). З яких кожна операція задається у вигляді pi βi= Өi, αi1…αi2 котра будується за наступним принципом: виписуються зміні, а потім послідовно створюються нові вузли, які відповідають цим назвам і означають відповідну операцію. Граф будується знизу верх і накожному наступному рівні залежності від операції використовують або вихід з вхідною зміною або вихід з проміжною зміною.

 

 

 

9. Загальна модель операційної системи. Загальна та машинно-залежна складові.

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

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

Решта компонентів системи взаємодіє один з|із| одним шляхом передачі повідомлень через мікроядро.

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

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

10.Забезпечення функцій ОС. Управління пам’яттю та зовнішніми пристроями.

Операці́йна систе́ма — це базовий комплекс програмного забезпечення, що виконує управління апаратним забезпеченням комп'ютера або віртуальної машини; забезпечує керування обчислювальним процесом і організує взаємодію з користувачем.

Операційна система звичайно складається з ядра операційної системи та базового набору прикладного програмного забезпечення.

Головні функції:

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

§ Стандартизований доступ до периферійних пристроїв (пристрої введення-виведення).

§ Завантаження програм у оперативну пам'ять і їх виконання.

§ Керування оперативною пам'яттю (розподіл між процесами, організація віртуальної пам'яті).

§ Керування доступом до даних енергозалежних носіїв (твердий диск, оптичні диски тощо), організованим у тій чи іншій файловій системі.

§ Забезпечення користувацького інтерфейсу.

§ Мережеві операції, підтримка стеку мережевих протоколів.

Додаткові функції:

§ Паралельне або псевдопаралельні виконання задач (багатозадачність).

§ Розподіл ресурсів обчислювальної системи між процесами.

§ Організація надійних обчислень (неможливість впливу процесу на перебіг інших), основана на розмежуванні доступу до ресурсів.

§ Взаємодія між процесами: обмін даними, синхронізація.

§ Захист самої системи, а також користувацьких даних і програм від дій користувача або програм.

§ Багатокористувацький режим роботи та розділення прав доступу (автентифікація, авторизація).


<== попередня лекція | наступна лекція ==>
Синтаксис регулярних висловів | Классификации компьютеров


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн