Розробка системних програмних модулів та компонент систем програмування

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

икористовуються дані різних типів, то формується повідомлення про помилку.

На цьому етапі використовуються прапорці вводу/ виводу для виділення лексем, що є аргументами виводу.

При кожному знаходженні помилки лічильник помилок збільшується на одиницю.

 

3.10 Розробка генератора коду

 

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

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

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

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

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

Результатом генератора коду являється цільова програма. Подібно до проміжного коду, результат генератора коду може приймати різні види: абсолютний машинний код, переміщуваний машинний код, або асемблерна мова. Перевагою генерації абсолютної програми в машинному коді є те, що такий код поміщається у фіксоване місце памяті і негайно виконується. Невеликі програми при цьому швидко компілюються і виконуються.

Генерація переміщуваної програми у машинному коді (обєктного модуля) забезпечує можливість роздільної компіляції підпрограм. Багато переміщуваних модулів можуть бути після цього звязані в одне ціле і завантажені на виконання спеціальною програмою завантажувачем. Додаткові затрати на звязування і завантаження компенсуються можливістю роздільної компіляції підпрограм і викликом інших, раніше скомпільованих підпрограм із обєктних модулів. Якщо цільова машина не обробляє переміщення автоматично, компілятор має надати завантажувачеві явну інформацю про переміщення для звязування сегментів роздільно скомпільованиз підпрограм.

Отримання на виході генератора коду програми на мові асемблера трохи полегшує процес генерації коду; в результаті ми можемо створювати символьні інструкції і використовувати можливості макросів асемблера. Плата за цю порстоту додатковий крок в обробці асемблерної програми після генерації коду[1].

 

3.11 Розробка граф-схеми алгоритму

 

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

 

Таблиця 3.2. Блоки перевірок

Номер блокуПеревірка, що здійснюється3Код = 0 (початок програми)?5Код = 1 (початок сегменту даних)?7Код = 27 (опис цілих змінних)?9Код = 28 (опис логічних змінних)?11Код = 2 (початок блоку)?13Код =6 (опис циклу)?15Код = 3 (кінець блоку)?17Код = 13 (операція присвоєння)?19Код = 4 (ввід даних)?21Код = 5 (вивід даних)?23Код = 14 (перевірка на рівність)?25Код =15 (перевірка на нерівність)?27Код = 16 (перевірка чи менше-рівне)?29Код = 17 (перевірка чи більше-рівне)?31Остання лексема?

Після кожного такого блоку перевірки іде блок вставки відповідного коду (блоки 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30). Якщо перевірка справдилась, то вставляється код, якщо ні, то здійснюється наступна перевірка. Алгоритм закінчується, коли перебрано усі лексеми.

Граф-схема алгоритму генератора коду (2 аркуші) розроблена згідно усіх правил ЄСКД та поміщена у додатках.

 

3.12 Опис програми реалізації генератора коду

 

Генератор коду починає свою роботу, якщо після фаз лексичного, синтаксичного та семантичного аналізу лічильник помилок дорівнює нулю. Програма починає по черзі перебирати лексеми із таблиці лексем. У відповідності до коду знайденої лексеми у проміжне представлення програми буде вставлено відповідний еквівалентний асемблерний текст. Наприклад, при зустрічі ключового слова Program, в асемблерний файл вставляється текст з описом моделі та сегментів, а при зустрічі ключового слова Var, вставляється опис сегменту даних.

Реакція на лексеми розроблена так, що пустий код не буде включений в асемблерний файл. Для того щоб уникнути помилок, імена ідентифікаторів, дані у вхідній програмі користувачем, вносяться у асемблерний файл із змінами. Наприклад, невідомо, як буде працювати згенерований код, якщо у ньому будуть зустрічатись створені користувачем змінні end, loop.

Для внесення змін у асемблерний файл використовуються функції fputs та fputc із бібліотеки stdio.h. Для створення обєктного модуля та виконавчого файлу за допомогою виклику system із бібліотеки stdlib.h запускаються на виконання tasm.exe та tlink.exe із відповідними параметрами.

 

 

4. Опис інтерфейсу та інструкції користувача

 

Середовище М9 запускається за допомогою файлу М9.exe. Для того, щоб написати програму, слід натисн