аналіз продуктивності не-тра-ди-цій-них архітектур, наприклад, тих, що мають більше ніж два простори пам'яті.
Перевагами описаної архітектури є можливість не тільки легкої роз-бу-дови системи, але й адаптації системи до потреб користувача без необ-хід-но-с-ті зміни текстів, компіляції та скла-дан-ня системи "Святогор".
Пристосування транслятора програм мовою високого рівня
в проміжний код
В теорії компіляції [16] велика увага приділяється швидкості роботи синтаксичного та лексичного аналі-за-то-рів. Проте вже перші оптимізуючі ком-пі-лятори показали, що час, витрачений на оптимізацію, набагато більший за час, витрачений на компіляцію; час оп-ти-мізації зростає експоненціально за-леж-но від довжини оптимізованого ко-ду. Система "Святогор" створювалася з розрахунку на компіляцію вже на-ла-год-жених на персональній ЕОМ прог-рам, тому час компіляції в проміжний код не є критичним. Компілятор у про-між-ний код описується за допомогою син-таксичних діаграм [16] — цей фор-мат найбільш зрозумілий для ко-рис-ту-ва-ча. Нижче розглянемо основні об'єк-ти пристосування для транслятора в про-міжний код.
Опис вхідної мови у вигляді син--так-сичних діаграм. Наприклад, опис син-таксичної діаграми "Терм"
виглядає так:
:ргс терм 3 вузли 1 :вузол не-вираз 1 переходів роздільник
множник --- -> 2 вниз ;вузол 2 :вузол нуль 8 переходів роздільник
с-здв-лів в-сдв-лів -> 3 с-здв-прав в-здв-прав -> 3 с-множити в-множити -> 3 с-ділити в-ділити -> 3 с-ціле-ділити в-ц-ділити -> 3 с-залишок в-залишок -> 3
с-і в-і -> 3 байдуже --- -> 0 вниз
;вузол
3 :вузол не-вираз 1 переходів роздільник
множник сф-2-опер -> 2 вниз
;вузол
;ргс
Для кожної позиції в син-так-сич-ній діаграмі ("вузла") вказуються мож-ли-ві переходи з номерами позицій або вихід з діаграми, умова переходу — ря-док літер або успішно виконана діаг-ра-ма — та дія при переході.
Таблиці операторів і автомат оп-ти-мізацій. У фазі лексичного аналізу за допомогою таблиць операторів здійс-ню-ється перевірка типів та обчислення констант. Так, вираз (k?2*1024) тран-с-фор-мується в (k?2048). Автомат оп-ти-мі-за-цій робить перевірки типів і оп-ти-мі-зую-чі перетворення, а також вико-рис-то-вується в оптимізаторі та генераторі коду.
Директиви генератору коду.
У тек-с-ті програми програміст може визначати директиви, що не сприй-ма-ють-ся стандартним компілятором для пер-сональної ЕОМ. У версії для мови Pascal директивою є спеціальний ко-мен-тар, що починається з пос-лі-дов-нос-ті " $", за якою йде рядок. Кількість директив і їх дії визначаються ко-рис-ту-ва-чем. Наприклад, за допомогою ди-рек-тив "IF1" та "IF2", позначених перед оператором умовного переходу, виз-на-ча-ється номер гілки — основної траси, потім генератор коду робить "склею-ван-ня" відповідної гілки з попереднім і наступним базовими блоками.
Вказівки розмірів типів. Спе-ці-аль-на процедура обчислює розміри ба-зо-вих типів цільового процесора — вона використовується в лексичному ана-лізаторі.
Спеціальні оптимізації для МП. Для зменшення навантаження на ге-не-ра-тор коду у фазі синтаксичного ана-лі-зу спеціальна таблиця порад виконує два типи оптимізацій:
1. Підстановка команд. Наприк-лад, за наявності команди МП MEAN(a,b)?(a?b)/2 усі формули вигляду (a?b)/2, що зустрілися в програмі, за-мі-ню-ються на команду MEAN(a,b).
2. Підстановка функцій. Наприк-лад, за наявності команди процесора ABS(a)?|a| всі звертання до вбудованої функції ABS заміняються на цю ко-манду.
Після компіляції тексту МВР в про-міжний код у вигляді ієрархічного графа цей код є машинно-незалежним. Ця властивість дозволяє зберігати для наступного використання не текст прог-рами, а вже ієрархічний граф.
На етапі оптимізації виконуються класичні оптимізації над графом прог-ра-ми, в результаті яких відшукуються індексні та охоплюючі змінні [11] в циклах та оптимізуються звертання до масивів, що використовують цир-ку-ляр-ну адресацію, характерну для ПЦОС.
У випадку простого МП без цир-ку-ляр-ної адресації або відключається пошук охоплюючих змінних, або змінюється тип генерації коду. Виконуються по-шук загальних частин у виразах, ви-не-сен-ня констант за межі циклу та інші класичні оптимізації, докладно описані в [17, ].
Мови опису настроювань
і таблиць порад
При проектуванні системи "Свято-гор" передбачалася наявність знач-ної кількості відмінних один від од-ного описів процесора та різних порад: генерації коду, оптимізації, змін-них пристосування, синтаксичних діа-грам і т.п. Щоб завдання проектування компіляторів описів і настроювань у бі-нар-ний код не стало основним в роз-роб-ці системи, було зроблено вибір на користь системи програмування Форт [19], тому що всі настроювання та описи в цьому випадку інтегруються у цю систему. Так, автоматично вирі-шу-ється питання читабельності описів і пристосувань — вони виконуються в текстовому редакторі без необхідності запуску спеціальних програм-"майст-рів", тому що ці настроювання є текс-том програми або описами даних мо-вою Форт. У дуже складних випадках настроювань, де необхідний опис про-цедури, таке настроювання ви-ко-ну-єть-ся у вигляді "слова" мовою Форт. Піз-ні-ше можлива розробка спеціальних прог-рам-оболонок, що зможуть про-ду-ку-вати тексти мовою Форт з описів ко-ристувача, зроблених у візуальному се-ре-довищі.
Таким чином, настроювання й опи-си системи "Святогор" мають знач-ну гнучкість, тому що є розширенням мови Форт. Також можливе роз-ши-рен-ня системи графічними оболонками для опису процесорів і інтегрування з сис-темами, що працюють без-по-се-редньо з описами апаратних реалізацій МП мовами VHDL або Verilog.
Проблеми, що виникають
при генерації коду
При розробці генератора коду для певного МП необхідно врахувати практично всі його архітектурні особ-ли-вості. Залежно від апаратних особ-ли-востей архітектури проведення деяких оптимізацій може не давати ефекту. Обсяг пам'яті сучасних промислових комп'ютерів великий настільки, що прак-тично не потрібно проведення оп-ти-мізацій за розміром коду, основним чинником є швидкодія. Базовим інстру-ментом оптимізації є техніка аналізу по-току даних — аналіз залежностей за даними [20] ієрархічного графа прог-ра-ми, який працює з поняттям "час жит-тя змінної". Ця техніка, реалізація якої варіюється у компіляторах, формує дея-ке внутрішнє подання графа за-леж-нос-ті за даними. За його допомогою можна виділяти групи команд, що мо-жуть виконуватися паралельно, та до такого графа можна застосувати один із 17 алгоритмів генерації коду методом