
- •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. Перелік стандартів програмної інженерії
5.2. Теоретичне програмування
Разом з парадигмами прикладного програмування ПС продовжують розвиватися і теоретичне програмування, основана на фундаментальних дослідженнях, математичних теоріях і дисциплінах (логіка, алгебра, комбінаторика). Завдяки цьому забезпечується математичний аналіз й осмислення деяких завдань програмування, а також їх опису з використанням математичної символіки, відсутньої в прикладних МП. Правильність математичного аналізу треба доводити автоматизованими засобами , які розпізнають символи і забезпечують зіставлення з символікою базової мови для одержання необхідних результатів на комп'ютері.
Авторами української теоретичної школи програмування, створеної В.М. Глушковим, запропоновані нові парадигми, а саме:
- алгебраїчне та інсерційне програмування (А.А.Летичевський і ін.) [24-26];
- експлікативне та номінативне програмування (В.Н.Редько, М.С.Нікітченко), які використовують логічний і математичний апарат для абстрактного конструювання програм [27-29];
- алгебро-алгоритмічне програмування (Г.О. Цейтлін), що поєднує алгебраїчний апарат і теорію алгоритмів [30-31 ].
5.3. Контрольні питання і завдання
1. Охарактеризуйте структурні методи програмування.
2. Наведіть основні особливості і можливості об'єктно-орієнтованого програмування.
3. Які діаграми є в мові UML для візуального проектування програм?
4. Наведіть основні типи компонентів і шляхи їхнього використання.
5. Назвіть базові поняття в компонентному програмуванні.
6. Визначте основні поняття й етапи життєвого циклу у компонентному програмуванні.
7. Визначте основні елементи аспектно-орієнтованого програмування.
8. Визначте основні елементи агентного програмування.
9. Визначте об'єкти генерувального програмування і наведіть призначення.
10. Що таке простір проблем і простір рішень?
11. Наведіть теоретичні методи програмування.
12. Охарактеризуйте алгебраїчне програмування.
13. Що таке алгоритміка і її алгебра?
14. Покажіть сутність переходу до інших алгебр.
6. Оптимізація програм
6.1 Основні поняття.
Оптимізація програми - це обробка, що пов'язана з перевпорядкуванням і зміною операцій у компільованій програмі з метою одержання більш ефективної результуючої об'єктної програми. Оптимізація виконується на етапах підготовки до генерації і безпосередньо при генерації об'єктного коду.
Кращі оптимізуючі компілятори можуть одержувати об'єктні програми зі складних вихідних програм, написаних на мовах високого рівня, що майже не уступають по якості програмам мовою асемблера. Часові і трудові витрати на створення такої програми істотно менше, ніж при її реалізації на асемблері. У сучасних компіляторів існують можливості вибору тих чи інших критеріїв оптимізації, виходячи з який оцінюється ефективність об'єктної програми. Так, з одного боку, можлива оптимізація з мінімізацією розміру програми, з іншого боку - оптимізація зі збільшенням швидкості її виконання. При цьому не потрібно змінювати текст програми вихідною мовою.
Усі ці переваги свідчать на користь застосування оптимізації. Єдиним, але істотним недоліком оптимізації є необхідність ретельного її опрацювання при створенні компілятора. Використовувані методи оптимізації ні при яких умовах не повинні приводити до зміни "змісту" вихідної програми (тобто до таких ситуацій, коли результат виконання програми змінюється після її оптимізації). На жаль, не всі методи оптимізації, використовувані розробниками компіляторів, можуть бути теоретично обґрунтовані і доведені для всіх можливих видів вихідних програм. Тому більшість компіляторів передбачає можливість відключати ті чи інші з можливих методів оптимізації. (Часто при оптимізації компілятори видають попередження розробнику програми, якщо та чи інша її ділянка викликає підозри щодо правильності його "змісту"). Застосування оптимізації також є недоцільним у процесі налагодження розроблюваної програми.
Розрізняються дві основні категорії оптимізуючих перетворень:
перетворення вихідної програми (у формі її внутрішнього представлення в компіляторі), що не залежать від результуючої об'єктної мови;
перетворення результуючої об'єктної програми.
Останній тип перетворень може залежати не тільки від властивостей об'єктної мови (що є очевидним), але й від архітектури обчислювальної системи, на якій буде виконуватися результуюча програма. (Так, наприклад, при оптимізації може враховуватися обсяг кеш-пам'яті і методи організації конвеєрних операцій центрального процесора). Такі перетворення ми розглядати не будемо. Саме ці перетворення можуть вплинути на "зміст" вихідної програми. У більшості випадків вони є "ноу-хау" виробників компіляторів і строго орієнтовані на певні архітектури обчислювальної машин.
Методи перетворення програми залежать від типів синтаксичних конструкцій вихідної мови. Теоретично розроблені методи оптимізації для багатьох типових конструкцій мов програмування. Далі будуть розглянуті тільки методи оптимізації лінійних ділянок - вони зустрічаються в будь-якій програмі і складають істотну частину програмного коду.
Лінійна ділянка програми - це виконувана один по одному послідовність операцій, що має один вхід і один вихід. Найчастіше лінійна ділянка містить послідовність арифметичних операцій і операторів присвоєння значень змінним.
Перш ніж перейти до питань оптимізації лінійних ділянок розглянемо їх внутрішнє представлення в компіляторі.