- •1. Основи програмної інженерії.
- •1.1. Програмна інженерія в історичному аспекті.
- •1.2. Програмна інженерія як дисципліна.
- •1.3. Swebok: Керівництво до зводу знань з програмної інженерії.
- •1.4. Структура і зміст swebok.
- •1.4.1. Інженерія вимог
- •1.4.2. Проектування програмного забезпечення
- •1.4.3. Конструювання програмного забезпечення
- •1.4.4. Тестування програмного забезпечення
- •1.4.5. Супровід програмного забезпечення
- •1.4.6. Керування конфігурацією
- •1.4.7. Керування інженерією програмного забезпечення
- •1.4.8. Процес інженерії
- •1.4.9. Методи і інструменти інженерії
- •1.4.10. Якість програмного забезпечення
- •Контрольні питання і завдання
- •2. Характеристика життєвого циклу стандарта iso/iec 12207.
- •Контрольні питання і завдання
- •3. Формування прикладних моделей життєвого циклу
- •Контрольні питання і завдання
- •4. Вимоги до програмних систем.
- •4.1. Загальні підходи до визначення вимог
- •Контрольні питання і завдання
- •5. Методи програмування.
- •5.1. Прикладне (систематичне) програмування
- •5.1.1 Структурне програмування
- •5.1.2. Об'єкт но-орієнтоване програмування
- •5.1.4. Компонентне програмування
- •5.1.5. Аспектно-орієнтоване програмування
- •5.1.6. Генерувальне (порождувальне) програмування
- •5.1.7. Сервісно-орієнтоване програмування
- •5.1.8. Агенте програмування
- •5.2. Теоретичне програмування
- •5.3. Контрольні питання і завдання
- •6. Оптимізація програм
- •6.1 Основні поняття.
- •6.2. Призначення і цілі оптимізації
- •6.3. Проміжна мова
- •6.4. Елементи топології програми
- •6.4.1. Блок (лінійна ділянка)
- •6.4.2. Сильно зв'язана область
- •6.5. Способи оптимізації
- •6.5.1. Розвантаження ділянок повторюваності
- •6.5.2. Скорочення глибини операції
- •6.5.3. Спрощення дій
- •6.5.3.1. Видалення індуктивних змінних і виразів
- •6.5.3.2. Заміна складних операцій на більш прості
- •6.5.3.3 Виключення надлишкових виразів
- •6.5.3.4 Інші перетворення
- •6.5.4. Реалізація дій
- •6.5.5. Підстановка (згортання)
- •6.5.6. Чищення програми
- •6.5.6.1. Усунення ідентичних операторів
- •6.5.6.2. Заміна змінних в операторах умовного переходу і усунення невикористовуваних визначень.
- •6.5.6.3. Усунення марних операторів і змінних
- •6.5.7. Економія пам'яті
- •6.5.8. Скорочення програми
- •6.5.9. Вставка псевдоблоку
- •7. Навчально-методичні рекомендації до вивчення дисцілини «Основи програмної інженерії.»
- •7.1. Анотація навчальної дісциплини. Галузь знань – 0501 «Інформатика та обчислювальна техника» Напрям підготовки - 6.050103 «Програмна інженерія»
- •7.2. Необхідність та задачі навчальної дісциплини. Ії місце в учбовому процесі.
- •7.3. Тематичний план курсу.
- •7.4. Тематичний план лекцій.
- •7.5. Тематичний план лабораторних робіт.
- •7.6. Тематичний план практичних робіт.
- •7.7. Тематичний план самостійної роботи студентів.
- •7.8. Питання для підсумкового контролю.
- •7.9. Структура залікового кредиту навчальної дисципліни
- •7.3. Структура модулів дисципліни
- •7.10. Система критеріїв оцінювання знань відповідно до кожного модуля дисципліни
- •Література
- •Список літератури до розділу 2
- •Додаток 1. Термінологічний словник
- •Додаток 2. Перелік стандартів програмної інженерії
6.2. Призначення і цілі оптимізації
Завжди бажано, щоб компілятор створював об'єктні програми, які б працювали з максимальною ефективністю. Як правило, програма в кодах машини, що отримана в результаті трансляції, буде займати більше пам'яті і працювати повільніше, ніж така ж програма, що написана досвідченим програмістом. Термін "оптимізація" застосовується до поліпшення вихідної програмиз з метою зробити їх більш "ефективними", тобто швидше працюючими чи більш компактними.
У процесі оптимізації транслятор виконує наступні дії:
Усуває недоліки програми, що викликані недбалістю або низькою кваліфікацією програміста. Прикладом може бути винесення з циклу операторів, що не залежать від параметрів циклу. Таке перетворення приведе до скорочення часу виконання програми, оскільки винесені оператори будуть виконуватися тільки один раз, а не багаторазово.
Усуває зайві обчислення, що неминуче виникають у процесі трансляції навіть при найретельнішому написанні програми мовою високого рівня. Наприклад, усунення повторного обчислення індексних виразів для елементів масиву скорочує час виконання програми і її довжину.
6.3. Проміжна мова
Для підвищення ефективності програми можна виконати над нею низку перетворень у різні моменти процесу компіляції. Наприклад, можна оперувати з вхідною програмою, зі структурами, породжуваними на стадії синтаксичного аналізу, з кодом на виході фази генерації коду. Однак оптимізувати програму, що вже протранслирована в коди машини, важко з таких причин:
по-перше, одиниці дії програми в кодах команд занадто малі, що вже саме по собі утрудняє аналіз,
по-друге, при трансляції вхідної програми в коди машини можлива втрата наявної в ній інформації. Так, збереження проміжних результатів у різних робочих комірках пам'яті робить практично неможливою ідентифікацію однакових частин програми;
по-третє через нестандартність форматів різних елементів мови і рекурсивних конструкцій, широко застосовуваних у текстах програм.
Тому для оптимізації програми у процесі трансляції необхідно виконувати переворення програми з вихідної мови на проміжну. Строго сформулювати вимоги, пропоновані до проміжної мови, важко. Однак уже із самого обгрунтування необхідності проміжної мови видно, що:
а) оператори мови не повинні бути занадто дрібними;
б) символи, ідентифікатори і константи повинні мати фіксований формат;
в) в усторої операторів бажана відсутність рекурсивності;
г) повинна зберігатися вся інформація у вхідній мові, що є необхідною для оптимізації;
д) мова повинна бути пристосованою до виконання перетворень оптимізації і зручною для наступних етапів трансляції в коди обчислювальної машини.
Ці вимоги свідчать, що розробити єдину універсальну проміжну мову для трансляції з будь-якої мови програмування в коди будь-якої ЕОМ важко. Як проміжну мову можна використовувати польський запис, тетради, тріади, синтаксичні дерева.
При розгляді питань оптимізації будемо вважати, що програма протранслирована з вхідної на деяку проміжну мову, оператор якої має наступний загальний вид:
(mi) код операції аргументи оператора,
де mi - покажчик оператора, а також ідентифікатор результату команди при відсутності його присвоювання деякій змінній.
Необхідно розрізняти змінні, що введені програмістом (програмні змінні), і змінні, генеровані в процесі трансляції на проміжну мову (mi-ідентифікатори). Між визначенням програмної змінної і її використанням у якості операнда існує наступна залежність:
- якщо програмна змінна, використовувана в області, не визначена в ній, то передбачається, що вона визначена у всіх шляхах, що ведуть до області;
- якщо програмна змінна визначена і використовується в області, то усередині області існує шлях між визначенням змінної і кожним її використанням;
- якщо програмна змінна визначена в області, то, узагалі говорячи, це не виходить, що вона визначена на кожнім вихідному шляху.
Крім програми проміжною мовою, що складається з послідовності операторів, для проведення оптимізації формуються наступні таблиці:
1. Таблиці ідентифікаторів і констант зі звичайною інформацією про змінні і константах.
2. Таблиця блоків, що визначає номери блоків (блоки нумеруються в довільному порядку), їхні границі, що безпосередньо передують і випливають блоки, а також будь-яку інформацію про частоту повторення блоку.
3. Таблиця послідовності операторів, що визначає лінійну послідовність операторів у блоці. Вона містить послідовність покажчиків операторів mi. Ця таблиця необхідна, оскільки один покажчик може належати декільком операторам.
