Міністерство освіти та науки України
НУ „Львівська політехніка”
Лекція №1
з курсу: «Застосування засобів об’єктно-орієнтованого програмування в лінгвістичних задачах»
Львів - 2010
1. Об’єктно-орієнтоване програмування, основна
методологія програмування 90 років.
ООП є продуктом 25 літньої практики і включає такі мови
програмування:
- Simula, SmallTalk, C++, Object Pascal.
ООП це стиль програмування, що фіксує поведінку реального світу
таким чином, при якому деталі його реалізації сховані. ООП – є лише
останньою ланкою і довгому ланцюгу рішень, що були запропоновані для
вирішення «кризи програмного забезпечення» - це ті задачі, які нам
необхідно вирішити випереджаючи наші можливості. ООП часто називають
новою парадигмою(para-a-digm – Список всіх варіантів закінцення мови)
програмування. Інші парадигми:
- директивне програмування (структурне програмування – Pascal, C);
- логічне (Prolog);
- функціональне (Lisp).
Парадигми в програмуванні визначають як проводити(виконувати)
обчислення, як робота, що виконується комп’ютером повинна бути
структурована і організована.
1. 1. Покоління мов програмування.
Розглядаючи історію розвитку програмування, можна виділити дві
тенденції які змінюють одна одну:
• зміщення акцентів від програмування окремих деталей до
програмування більш великих компонентів;
• розвиток та удосконалення мов програмування високого рівня.
Велика кількість сучасних комерційних програмних систем набагато
більше і суттєво складніше, ніж їх попередники декілько років тому. Це
зростання складності викликало більше число прикладних досліджень з
методології проектування, особливо, з декомпозиції, абстрагуванню та
ієрархіям. Створення більш виразних мов програмування доповнило
досягнення в цій галузі. Виникла тенденція переходу від мов, що вказують
комп’ютеру, що робити (імперативні мови), до мов, що описують ключові
абстракції проблемноїй області (декларативні мови).
Можна згрупувати деякі з найбільш відомих мов високого рівня в
чотирі покоління в залежності від того, які мовні конструкції вперше в них
з’явилися:
• Перше покоління (1954-1958)
FORTRAN I
Математичні формули
ALGOL-58
Математичні формули
Flowmatic
Математичні формули
IPL V
Математичні формули
• Друге покоління (1959-1961)
FORTRAN II
Підпрограми, роздільна компіляція
ALGOL-60
Блочна структура, типи даних
COBOL
Опис даних, робота з файлами
Lisp
Обробка списків, вказівники, збирання сміття
• Трет’е покоління (1962-1970)
PL/I
FORTRAN+ALGOL+COBOL
ALGOL-68
Спадкоємиць ALGOL-60
Pascal
Спадкоємиць ALGOL-60
Simula
Класи, абстрактні дані
• Загублене покоління (1970-1980) (Четверте покоління)
В кожному наступному поколінні мінялися механізми абстракції що
підтримуються мовами програмування. Мови першого покоління
орієнтувалися на науково-інженерне застосування, і словник цієї
предметної області бул цілком виключно математичним. Такі мови, як
FORTRAN I, були створенні для спрошення програмування математичних
формул, щоб звільнити програміста від труднощів асемблера і машиного
коду. Перше покоління мов високого рівня було кроком, що наближає
програмування до предметної області і віддаляють від конкретної машини.
В другому поколінні мов основною тенденцією стало розвиток
алгоритмічних абстракцій. В той час потужність комп’ютерів швидко
зростала, а комп’ютерна індустрія дозволила розширити області їх
використання, особливо в бізнесі. Головною задачею стало інструктувати
машину, що робити: спочатку прочитати ці анкети співробітників, потім
відсортувати їх і вивести результати на друк. Це було ше одним кроком до
предметної області і від конкретної машини. На прикінці 60-х років з
появою транзисторів, а потім інтегральных схем, вартість комп’ютерів різко
снизилась, а їх потужність зростає єкспоненціально. З’явилась можливість
вирішувати все більш складні задачи, але це вимагало вміння обрабляти
різноманітні типи даних. Такі мови як ALGOL-68 а потім Pascal стали
підтримувати абстракцію даних. Програмісти змогли описувати свої власні
типи даних. Це стало ще одним кроком до предметної області і від
прив’язки до конкретної машини.
70-і роки: було створено приблизно дві тисячі різноманітних мов та їх
діалектів. Неадекватність більш раніх мов написанню великих програмних
систем стала очевидною, тому нові мови мали механізми, що видаляли ці
обмеження. Лише небагато з цих мов змогли вижити (спробуйте знайти
новий підручникк з мов Fred, Chaos, Tranquil), однак багато їх принципів
знайшли відображення в нових версіях більш раніх мов.
Таким чином, ми отримали мови Smalltalk (новаторскі перероблена з
успадкуванням Simula), Ada (спадкоємець ALGOL-68 и Pascal з элементами
Simula, Alphard и CLU), CLOS (об’єднавший Lisp, LOOPS и Flavors), C++
(який виник з С та Simula) і Eiffel (створений від Simula і Ada).
(П’яте покоління)
Найбільший інтерес для подальшого використання став клас мов, що
називаються об’єктними або об’єктно-орієнтованими, які в найбільшій
степені відповідають задачі об’єктно-орієнтованій декомпозиції програмного
забезпечення.
1.2. Топологія мов першого і початку другого покоління.
Для пояснення вище наведеного розглянемо структури, що характерні
для кожного покоління. На рис. 1-1 показана топологія, типова для
більшості мов першого покоління і першої стадії другого покоління. Коли
кажемо "топологія", ми маємо на увазі основні єлементи мови
програмування і їх взаєїмодії. Для таких мов, як FORTRAN і COBOL,
основним будівельним блоком є підпрограма (параграф в термінах COBOL).
Програми, що реалізуються на таких мовах, мають відносно просту
структуру, що складається тільки із глобальних даних і підпрограм.
Стрілками на рисунку позначено вплив підрограм на дані. В процесі
розробки можно логічно розділити різнотипові дані, але механізми мов
практично не підтримують такого розділення. Помилка в деякій частині
програми може мати досить серьозні наслідки, в зв’язку з тим що область
даних відкрита всім підпрограммам. В більшості системах важко
гарантувати цілістність даних при внесені змін в будь-яку частину системи.
В процессі єксплуатації вже через деякий час виникає плутанина за
рахунок великої кількості перехресних зв’язків між підпрограммами,
заплутаних схем управління, незрозумілого змісту даних, що загрожують
надійності системи і знижують зрозумілість програми.
ДаніПідпрограми
Рис. 1-1. Топологія мов першого і початку другого покоління.
1.3. Топологія мов другого і ранього третього покоління.
Починаючи з середини 60-х років стали усвідомлювати роль
підпрограм як важливого проміжного ланцюга між задачею що вирішується
і комп’ютером [3].
Використання підпрограм як механізма абстрагування мало три сутєвих
наслідкі. По-перше, були розроблені мови, які підтримують різноманітні
механізми передачі параметрів. По-друге, були закладена база
структурного програмування, що визначилась в мовній підтримці механізмів
вкладенності підпрограм і в науковому дослідженні структур управління і
області видимості. По-трет’є, виникли методи структурного проектування,
що стимулювали розробників створювати велики системи, використовуючи
підпрограми як готові будівельні блоки. Архітектура мов програмування
цього періода (рис. 1-2), представляє собою варіації на теми попереднього
покоління. В неї внесенні деякі удосконалення, а саме, підсилено
управління алгоритмічними абстракціями, але залишається невирішена
проблема програмування "в великому" і проектування даних.
ДаніПідпрограми
Рис. 1-2. Топологія мов пізднього другого і ранього третього покоління.
1.4. Топологія мов кінця третього покоління.
Починаючи з FORTRAN II і далі, для рішення задач програмування "в
великому" почав розвиватися новий важливий механізм структурування.
Зростання програмних проектів означає збільшення розмірів і колективів
програмістів, і як наслідок, необхідність незалежної розробки окремих
частин проекту. Відповіддю на цю необхідність стало окремо компільований
модуль, який спочатку був випадковим набором даних і підпрограмм (рис.
1-3). В такі модулі збирали підпрограми, які, як здавалося, швидше всього
будут змінюватися разом, і мало хто розглядав їх як нову техніку
абстракції. В більшості мов цього покоління, хоча і підтримувалося
модульне програмування, але не вводилося ніяких правил, що
забезпечують узгодження інтерфейсів модулів. Програміст, що розробляє
підпрограму в одному з модулів, міг, наприклад, очікувати, що її будуть
викликати з трьома параметрами: дійсним числом, масивом з десяти
елементів і цілим числом, що означає логічне значення. Але в деякому
іншому модулі, ця підпрограма могла помилково викликатися з фактичними
параметрами у вигляді: цілого числа, масива з п’яти елементів і від’ємного
числа. Аналогично, один з модулів міг встановити спільну область даних і
зчитувати, що це його власна область, а другий модуль міг порушувати це
припущення, вільно маніпулючи з цими даними. Нажаль, оскільки більшість
мов представляло в ліпшому випадку рудиментарну підтримку абстрактних
даних і типів, такі помилки виявлялися тільки при виконанні програми.
ДаніПідпрограмиМодулі
Рис. 1-3. Топологія мов кінця третього покоління.
1.5. Топологія об’єктних і об’єктно-орієнтованих мов.
Значення абстрактних типів даних у вирішенні проблеми складності
систем. Усвідомлення цього визначає два важливих висновки. По-перше,
виникають методи проектування на основі потоків даних, які вносять
упорядкованість в абстракцію даних в мовах, орієнтованих на алгоритми.
По-друге, з’являється теорія типів, яка втілюється в таких мовах, як Pascal.
Завершенням реалізації цих ідей, що почалися з мови Simula і розвиток
в наступних мовах в 1970-1980-і роки, стала поява таких мов, як Smalltalk,
Object Pascal, C++, CLOS, Ada і Eiffel. Ці мови отримали назву об’єктних або
об’єктно-орієнтованих. На рис. 1-4 наведена (приведена) топологія таких
мов при застосуванні до задач малої і средньої ступені складності.
Основним елементом конструкції у вказаних мовах є модуль, який
складається з логічно зв’язаних класів і об’єктів, а не підпрограм, як в
мовах першого покоління.
Рис. 1-4. Топологія малих і середніх застосувань в об’єктних і об’єктно-
орієнтованих мовах.
Іншими словами: "Якщо процедури і функції - дієслова, а дані -
іменники, то процедурні програми будуються з дієслів, а об’єктно-
орієнтовані - з іменників" [6]. З тієїж причини структура програм малої і
середньої складності при об’єктно-орієнтованому підході представляється
графом, а не деревом, як у випадку алгоритмічних мов. Окрім того,
зменшена або відсутня область глобальних даних. Дані і дії
організовуються тепер таким чином, що основними логічними будівельними
блоками наших систем становляться класи і об’єкти, а не алгоритми.
Для дуже складних систем класи, об’єкти і модулі є необхідними, але
не достатніми засобами абстракції. Об’єктнийй підхід масштабується і може
бути викорастаний на все більш високих рівнях. Кластери абстракцій у
великих системах можуть представлятися у вигляді багатошарової
структури. На кожному рівні можно виділити групи об’єктів, що щільно
взаємодіють для рішення задачи більш високого рівня абстракції. В
середені кожного кластера ми знайдемо такуж множину взаємодіючих
абстракцій (рис. 1-5).
Рис. 1-5. Топологія великих застосувань в об’єктних і об’єктно-
орієнтованих мовах.
Питання:
Література:
1. Гради Буч Обьектно-ориентированный анализ и проектирование
с примерами приложений на С++. 2002 г. - 250 с.