- •Тема 1. Програмне забезпечення системного оброблення інформації План
- •Системне програмне забезпечення.
- •Розвиток мов програмування.
- •Операційна система.
- •1 Системне програмне забезпечення
- •2 Розвиток мов програмування
- •Тема 2. Засоби створення програмних додатків
- •Тема 3. Структурована мова запитів sql для реляційних бд
- •Команда select
- •Видалення надмірних даних
- •1. Компоненти скбд.
- •2. Стандарт sql.
- •3. Команда select
- •4. Видалення надмірних даних
- •2. Перенесення додатку на інший комп'ютер.
- •Типи даних
- •3. Представлення значень у комп’ютері.
- •1. Умовні оператори Оператор if
- •Оператор switch
- •Оператор break
- •Оператор continue
- •Оператор повернення
- •Оператор goto
- •Помічений оператор
- •Порожній оператор
- •1. Структури.
- •Тема 9. Вступ до проблеми штучного інтелекту
- •Тема 10. Експертні системи як різновид систем штучного інтелекту
- •Тема 11. Методологія проектування експертних систем
- •1. Етипи проектування експертних систем.
Тема 2. Засоби створення програмних додатків
Програмування — порівняно молода галузь науки і техніки, що швидко розвивається. Досвід ведення реальних розробок і вдосконалення наявних програмних і технічних засобів постійно переосмислюється, внаслідок чого з'являються нові методи, методології і технології, які, у свою чергу, служать основою сучасніших засобів розробки програмного забезпечення. Досліджувати процеси створення нових технологій і визначати їх основні тенденції доцільно, зіставляючи ці технології з рівнем розвитку програмування і особливостями що є у розпорядженні програмістів програмних і апаратних засобів.
1.1. Технологія програмування і основні етапи її розвитку
Технологією програмування називають сукупність методів і засобів, використовуваних в процесі розробки програмного забезпечення. Як будь-яка інша технологія, технологія програмування є набором технологічних інструкцій, що включають:
• вказівка послідовності виконання технологічних операцій;
• перерахування умов, при яких виконується та або інша операція;
• описи самих операцій, де для кожної операції визначені початкові дані, результати, а також інструкції, нормативи, стандарти, критерії і методи оцінки
Окрім набору операцій і їх послідовності, технологія також визначає спосіб опису проектованої системи, точніше за модель, використовувану на конкретному етапі розробки. Розрізняють технології, використовувані на конкретних етапах розробки або для вирішення окремих завдань цих етапів, і технології, декілька етапів, що охоплюють, або весь процес розробки. У основі перших, як правило, лежить обмежено застосовний метод, що дозволяє вирішити конкретну задачу. У основі других зазвичай лежить базовий метод або підхід, що визначає сукупність методів, використовуваних на різних етапах розробки, або методологію.
Щоб розібратися в існуючих технологіях програмування і визначити основні тенденції їх розвитку, доцільно розглядати ці технології в історичному контексті, виділяючи основні етапи розвитку програмування, як науки.
Перший етап - «стихійне» програмування. Цей етап охоплює період від моменту появи перших обчислювальних машин до середини 60-і роки XX в. У цей період практично були відсутні сформульовані технології, і програмування фактично було мистецтвом. Перші програми мали просту структуру. Вони складалися з власне програми на машинній мові і оброблюваних нею даних . Складність програм в машинних кодах обмежувалася здатністю програміста одночасно в думках відстежувати послідовність виконуваних операцій і місцезнаходження даних при програмуванні.
Поява асемблерів дозволила замість двійкових або 16-ричных код використовувати символічні імена даних і мнемоніки код операцій. В результаті програми стали більш «читаними».
Створення мов програмування високого рівня, таких, як FORTRAN і ALGOL, істотно спростило програмування обчислень, понизивши рівень деталізації операцій. Це, у свою чергу, дозволило збільшити складність програм. Революційною була поява в мовах засобів, що дозволяють оперувати підпрограмами (ідея написання підпрограм з'явилася набагато раніше, але відсутність засобів підтримки по-перше мовних засобах істотно знижувало ефективність їх застосування.)
Підпрограми можна було зберігати і використовувати в інших програмах. В результаті бувальщини створені величезні бібліотеки розрахункових і службових підпрограм, які у міру потреби викликалися з програми, що розроблялася.
Типова програма того часу складалася з основної програми, області глобальних даних і набору підпрограм (в основному бібліотечних), що виконують обробку всіх даних або їх частини.
Слабким местомом такої архітектури було те, що при збільшенні кількості підпрограм зростала вірогідність спотворення частини глобальних даних якою-небудь підпрограмою. Наприклад, підпрограма пошуку коріння рівняння на заданому інтервалі по методу ділення відрізання навпіл міняє величину інтервалу. Якщо при виході з підпрограми не передбачити відновлення первинного інтервалу, то в глобальній області опиниться невірне значення інтервалу. Щоб скоротити кількість таких помилок, було запропоновано в підпрограмах розміщувати локальні дані.
Складність програмного забезпечення, що розробляється, при використанні підпрограм з локальними даними як і раніше обмежувалася можливістю програміста відстежувати процеси обробки даних, але вже на новому рівні. Проте поява засобів підтримки підпрограм дозволила здійснювати розробку програмного забезпечення декільком програмістам паралельно.
На початку 60-х років XX в. вибухнула «криза програмування». Він виражався в тому, що фірми, що узялися за розробку складного програмного забезпечення, такого, як операційні системи, зривали всі терміни завершення проектів [8]. Проект застарівав раніше, ніж був готовий до впровадження, збільшувалася його вартість, і в результаті багато проектів так ніколи і не були завершені.
Об'єктивно все це було викликано недосконалістю технології програмування. Перш за все стихійно використовувалася розробка «знизу-вгору» - підхід, при якому спочатку проектували і реалізовували порівняно прості підпрограми, з яких потім намагалися побудувати складну програму. У відсутності чітких моделей опису підпрограм і методів їх проектування створення кожної підпрограми перетворювалося на непросте завдання, інтерфейси підпрограм виходили складними, і при збірці програмного продукту виявлялася велика кількість помилок узгодження. Виправлення таких помилок, як правило, вимагало серйозної зміни вже розроблених підпрограм, що ще більш ускладнювало ситуацію, оскільки при цьому до програми часто вносилися нові помилки, які також необхідно було виправляти... Зрештою процес тестування і відладки програм займав більше 80 % часу розробки, якщо взагалі коли-небудь закінчувався. На порядку денному найсерйознішим чином стояло питання розробки технології створення складних програмних продуктів, що знижує вірогідність помилок проектування.
Аналіз причин виникнення більшості помилок дозволив сформулювати новий підхід до програмування, який був названий «структурним».
Другий етап - структурний підхід до програмування (60-70-і роки XX).
Структурний підхід до програмування є сукупністю технологічних прийомів, що рекомендуються, охоплюють виконання всіх етапів розробки програмного забезпечення. У основі структурного підходу лежить декомпозиція (розбиття на частини) складних систем з метою подальшої реалізації у вигляді окремих невеликих (до 40 - 50 операторів) підпрограм. З появою інших принципів декомпозиції (об'єктного, логічного і т. д.) даний спосіб отримав назву процедурної декомпозиції. На відміну від використовуваного раніше процедурного підходу до декомпозиції, структурний підхід вимагав представлення завдання у вигляді ієрархії підзадач простої структури. Проектування, таким чином, здійснювалося зверху «вниз» і мало на увазі реалізацію загальної ідеї, забезпечуючи опрацьовування інтерфейсів підпрограм. Одночасно вводилися обмеження на конструкції алгоритмів, рекомендувалися формальні моделі їх опису, а також спеціальний метод проектування алгоритмів - метод покрокової деталізації. Підтримка принципів структурного програмування була закладена в основу так званих процедурних мов програмування. Як правило, вони включали основних «структурних» операторів передачі управління, підтримували вкладення підпрограм, локалізацію і обмеження області «видимості» даних. Серед найбільш відомих мов цієї групи варто назвати PL/1, ALGOL-68, Pascal, С.
Одночасно із структурним програмуванням з'явилася величезна кількість мов, що базуються на інших концепціях, але більшість з них не витримала конкуренції. Какието мови були просто забуті, ідеї інших були надалі використані в наступних версіях мов, що розвивалися.
Подальше зростання складності і розмірів програмного забезпечення, що розробляється, зажадало розвитку структуризації даних. Як наслідок цього в мовах з'являється можливість визначення призначених для користувача типів даних. Одночасно посилилося прагнення розмежувати доступ до глобальних даних програми, щоб зменшити кількість помилок, що виникають при роботі з глобальними даними. В результаті з'явилася і почала розвиватися технологія модульного програмування.
Модульне програмування припускає виділення груп підпрограм, що використовують одні і ті ж глобальні дані в окремо компільовані модулі (бібліотеки підпрограм), наприклад, модуль графічних ресурсів, модуль підпрограм виводу на принтер. Зв'язки між модулями при використанні даної технології здійснюються через спеціальний
інтерфейс, тоді як доступ до реалізації модуля (тілам підпрограм і деяким «внутрішнім» змінним) заборонений. Цю технологію підтримують сучасні версії мов Pascal і З (C++), мови Пекла і Modula.
Використання модульного програмування істотно спростило розробку програмного забезпечення декількома програмістами. Тепер кожен з них міг розробляти свої модулі незалежно, забезпечуючи взаємодію модулів через спеціально обумовлені міжмодульні інтерфейси. Крім того, модулі надалі без змін можна було використовувати в інших розробках, що підвищило продуктивність праці програмістів.
Практика показала, що структурний підхід у поєднанні з модульним програмуванням дозволяє отримувати достатньо надійні програми, розмір яких не перевищує 100 000 операторів [10]. Вузьким местомом модульного програмування є те, що помилка в інтерфейсі при виклику підпрограми виявляється тільки при виконанні програми (із-за роздільної компіляції модулів виявити ці помилки раніше неможливо). При збільшенні розміру програми зазвичай зростає складність міжмодульних інтерфейсів, і з деякого моменту передбачити взаємовплив окремих частин програми стає практично неможливо. Для розробки програмного забезпечення великого об'єму було запропоновано використовувати об'єктний підхід.
Третій етап - об'єктний підхід до програмування (з середини 80-х до кінця 90-х років XX в.). Об'єктно-орієнтоване програмування визначається як технологія створення складного програмного забезпечення, заснована на представленні програми у вигляді сукупності об'єктів, кожен з яких є екземпляром певного типу (класу), а класи утворюють ієрархію із спадкоємством властивостей [10, 24, 29]. Взаємодія програмних об'єктів в такій системі здійснюється шляхом передачі повідомлень (мал. 1.6). Об'єктна структура програми вперше була використана в мові імітаційного моделювання складних систем Simula, що з'явився ще в 60-х роках XX в. Природний для мов моделювання спосіб представлення програми отримав розвиток в іншій спеціалізованій мові моделювання - мові Smalltalk (70-і роки XX в.), а потім був використаний в нових версіях універсальних мов програмування, таких, як Pascal, C++, Modula, Java.
Основною гідністю об'єктно-орієнтованого програмування в порівнянні з модульним програмуванням є «природніша» декомпозиція програмного забезпечення, яка істотно полегшує його розробку. Це приводить до повнішої локалізації даних і інтеграції їх з підпрограмами обробки, що дозволяє вести
практично незалежну розробку окремих частин (об'єктів) програми. Окрім цього, об'єктний підхід пропонує нові способи організації програм, засноване на механізмах спадкоємство, поліморфізму, композиції, наповнення. Ці механізми дозволяють конструювати складні об'єкти порівняно простих. В результаті істотного збільшується показник повторного використання код і з'являється можливість створення бібліотек класів для різних застосувань.
Бурхливий розвиток технологій програмування, заснованих на об'єктному підході, дозволив вирішити багато проблем. Так були створені середовища, що підтримують візуальне програмування, наприклад, Delphi, C++ Builder, Visual C++ і так далі При використанні візуального середовища у програміста з'являється можливість проектувати деяку частину, наприклад, інтерфейси майбутнього продукту, із застосуванням візуальних засобів додавання і настройки спеціальних бібліотечних компонентів. Результатом візуального проектування є заготівка майбутньої програми, до якої вже внесені відповідні коди. Використання об'єктного підходу має багато переваг, проте його конкретна реалізація в об'єктно-орієнтованих мовах програмування, таких, як Pascal і C++, має істотні недоліки:
• фактично відсутні стандарти компоновки двійкових результатів компіляції об'єктів в єдине ціле навіть в межах однієї мови програмування: компоновка об'єктів, отриманих різними компіляторами C++ в кращому разі проблематична, що приводить до необхідності розробки програмного забезпечення з використанням засобів і можливостей однієї мови програмування високого рівня і одного компілятора, а значить, вимагає однієї мови програмування високого рівня і одного компілятора, а значить, вимагає наявність початкових код використовуваних бібліотек класів;
• зміна реалізації одного з програмних об'єктів, як мінімум, пов'язано з перекомпіляцією відповідного модуля і перекомпонуванням всього програмного забезпечення, що використовує даний об'єкт.
Таким чином, при використанні цих мов програмування зберігається залежність модулів програмного забезпечення від адрес полів, що експортуються, і методів, а також структур і форматів даних. Ця залежність об'єктивна, оскільки модулі повинні взаємодіяти між собою, звертаючись до ресурсів один одного. Зв'язку модулів не можна розірвати, але можна спробувати стандартизувати їх взаємодію, на чому і заснований компонентний підхід до програмування.
