- •Парадигми програмування
- •8.080401: Інформаційні управляючі системи та технології
- •Тема 1. Парадигма імперативного програмування Лекція 1. Огляд парадигм програмування
- •1.1 Базові поняття і визначення
- •1.2 Класифікація парадигм програмування
- •Парадигми
- •Объектно-ориентированные возможности
- •Функциональные возможности
- •1.3 Огляд парадигми імперативного програмування
- •1.4 Програмування, кероване подіями
- •1.5 Узгоджене програмування і паралельні обчислення
- •1.6. Підтримка різних парадигм програмування в ms.Net
- •Тема 2. Парадигма об’єктно-орієнтованого програмування Лекція 2. Об'єктно-орієнтоване програмування та його реалізація в c# на платформі ms.Net
- •2.1 Основні принципи об’єктно-орієнтованого програмування
- •2.2 Чисто об'єктно-орієнтовані і гібридні мови програмування
- •2.3. Реалізація принципів ооп в мові c#
- •Тема 3. Програмування за прототипом і сценарне програмування Лекція 3. Програмування за прототипом і сценарне програмування
- •3.1 Програмування за прототипом
- •3.2 Сценарне програмування
- •Тема 4. Парадигма компонентного програмування Лекція 4. Компонентне програмування як розвиток об’єктного
- •4.1 Основні ідеї компонентної розробки
- •4.2 Компонентна об'єктна модель com (Component Object Model).
- •4.3. Технологія ActiveX – основні можливості
- •Лекція 5. Компонентне програмування в .Net
- •5.1 Основні концепції платформи ms.Net
- •5.1.1 Структура fcl
- •5.1.2 Загально мовне середовище виконання – clr – динамічна складова ms.Net Framework
- •5.1.3. Система типів даних в Microsoft .Net
- •Управління типами в cts
- •5.2. Розробка компонентів на платформі .Net
- •5.3. Поняття збірки і маніфесту в .Net
- •1. Створення dll-бібліотеки
- •2. Створення консольного проекту для тестування функції з бібліотеки.
- •3. Підключення проекту бібліотеки до консольного проекту.
- •4. Встановлення стартового проекту.
- •5. Створення Windows-проекту в тому самому рішенні.
- •6. Робимо проект стартовим і запускаємо на виконання. Результат:
- •7. Документування коду
- •Лекція 6. Візуальне програмування
- •6.1. Парадигма візуального програмування
- •1. Підключення до сервера бд
- •2. Створення власної бд і таблиць
- •3. Заповнення таблиці тестовими даними
- •4. Створення Windows-застосунку (форми)
- •5. Зв'язування елементів форми з джерелом даних
- •7. Створення запитів до даних і їх відображення на формі у вигляді таблиці (Grid)
- •Тема 5. Парадигма декларативного програмування Лекція 7. Основи парадигми декларативного програмування
- •7.1 Основи парадигми декларативного програмування
- •7.2 Основи функціонального програмування
- •Основи Лісп
- •7.3 Основи логічного програмування
- •7.4 Основи Пролог
- •Лекція 8. Основи xml
- •8.1. Визначення і структура xml-документа
- •8.2. Створення xml-документа
- •8.2.1. Структура xml-документа
- •8.3. Способи відображення xml-документа
- •8.4. Правила створення коректного xml-документа
- •8.4.1. Визначення коректного документа
- •8.4.2. Складові частини коректно сформованого хмl-документа
- •8.4.3. Додавання елементів в документ
- •8.4.4. Типи вмісту елементу
- •Лекція 9. Робота з xml в .Net
- •9.1. Класи для роботи з xml .Net
- •9.2. Читання і запис потоків даних Xml
- •9.2.1. Використання класу XmlReader
- •9.2.2. Методи читання даних
- •9.2.3. Контроль типів даних при читанні Xml-документа
- •9.3. Створення xml-документа в Visual Studio
- •Лекція 10. Створення xml-документів в .Net
- •10.1. Використання класу XmlWriter - запис потоків даних Xml
- •10.2. Використання dom в .Net
- •10.2.1. Читання xml-документа за допомогою XmlNodeList
- •10.2.2. Вставка елементів (вузлів) в xml- документ
- •10.3. Обробка атрибутів
- •10.3.1. Витягання атрибутів за допомогою XmlReader
- •10.3.2. Вставка атрибутів в документ за допомогою XmlWriter
- •Лекція 11. Елементи функціонального програмування в c#
- •11.1. Елементи функціонального програмування в c#
- •11.2. Делегати
- •11.3. Лямбда-вирази і лямбда-функції
- •Приклади
- •Лекція 12. Мова linq
- •2. Linq: узагальнення і інтерфейси
- •3. Основні операції запиту
- •4. Перетворення даних з linq
- •12.1. Основи мови linq
- •1.1 Джерело даних
- •1.2. Запит
- •1.3. Виконання запиту
- •12.2. Linq: узагальнення і інтерфейси
- •12.2.1. Змінні iEnumerable в запитах linq
- •12.3. Основні операції запиту
- •12.3.1. Визначення джерела даних
- •12.3.2. Фільтрація
- •12.3.3. Впорядкування
- •12.3.4. Угрупування
- •12.4. Перетворення даних з linq
- •12.4.1. З'єднання декількох вхідних послідовностей в одну вихідну
- •12.3.5. З'єднання
- •12.3.6. Вибір (Проектування)
- •12.4.2. Вибір підмножини кожного вихідного елементу
- •12.4.3. Перетворення об'єктів, що знаходяться в пам'яті, в xml
- •12.4.4. Виконання операцій над вихідними елементами
- •12.5. Зв'язки типів в операціях запиту
- •12.5.1. Запити, що не виконують перетворення вихідних даних
- •12.5.2. Запити, що виконують перетворення вихідних даних
- •12.5. 3. Дозвіл компілятору визначати відомості про типа
- •12.6. Синтаксис запиту або синтаксис методу
- •12.6.1. Методи розширення стандартних операторів запитів
- •12.6.2. Лямбда-вирази
- •Тема 7. Парадигма агентно-орієнтованого програмування Лекція 13. Агентно-орієнтоване програмування
- •13.1 Основні поняття агентно-орієнтованої парадигми програмування
- •1. За архітектурою побудови агентів і їх властивостями:
- •За функціональним призначенням:
- •3. За здатністю до мобільності:
- •3Адачні агенти
- •13.2 Мультиагентні інформаційні системи
- •1. Формальна мова опису системи моделей (ментальної, соціальної):
- •2. Інструменти перетворення звичайних програм у відповідні агентні програми.
- •13.3. Приклади практичного застосування агентної парадигми
- •3Асоби пошуку в Інтернет
- •Тема 8. Парадигма теоретичного програмування Лекція 14. Основні парадигми теоретичного програмування
- •Основна література
- •Додаткова література
1.5 Узгоджене програмування і паралельні обчислення
Природний резерв підвищення продуктивності комп'ютерів –розпаралелювання потоку команд або потоку даних. Розпаралелювання даних передбачає застосування однієї операції відразу до кількох елементів масиву даних, а паралелізм задач — розбиття обчислювального процесу на декілька процесів, кожний з яких виконується на своєму процесорі.
Досить швидко були розроблені супер-ЕОМ, які мали «векторну» або «матричну» архітектуру процесорів (трансп'ютери), автономних, але здатних обмінюватися між собою результатами своїх обчислень через канали зв'язку.
Хорошим наближенням до такої архітектури є мережі комп'ютерів з можливістю розподілених обчислень. Окрім цього, практично всі сучасні мікропроцесори максимально використовують у своїй архітектурі можливості паралельного виконання окремих операцій. Таким чином, паралелізм можна розбити на два рівні: паралелізм рівня мікрооперацій і паралелізм рівня процесів - простих (послати, прийняти значення або процеси обчислювальної моделі) або структурних (послідовних або паралельних). Коли процес виконує інструкцію «Прийняти значення (з каналу)», він входить у стан очікування, поки канал порожній. Як тільки в каналі з'являється значення, процес його прочитує і продовжує роботу. В системі паралельних процесів кожний окремий процес обробляє події.
Можна виділити такі основні види паралелізму:
- паралелізм багатопроцесорних систем;
- паралелізм операцій введення-виведення;
- паралелізм взаємодії з користувачем;
- паралелізм розподілених систем.
Перший з них є справжнім паралелізмом, тому що у багатопроцесорних системах інструкції виконують декілька процесорів одночасно. Інші види паралелізму можуть виникати і в однопроцесорних системах тоді, коли для продовження виконання програмного коду необхідні певні зовнішні дії (переривання).
Активне впровадження нової апаратної архітектури потребувало зміни парадигми програмування - переходу від послідовного програмування до узгодженого програмування (concurrent programming), зокрема, паралельного програмування (parallel programming або паралельних обчислень - parallel computing), пов'язаного з паралельними процесами, породженням і обробкою асинхронних подій і ін.
Узгоджене (паралельне) програмування - це програмування в термінах взаємодії деяких одночасно працюючих обчислювачів (декількох процесорів або багатоядерного процесора).
При розробці паралельних програм використовуються спеціалізовані мови, як, наприклад, мова високого рівня Occam, а також сучасні бібліотеки і системи паралельного програмування PVM, LAM, CHMP і ін.
Три основні підходи до реалізації цих систем розрізняються методами взаємодії паралельних задач.
Перший підхід базується на концепції обміну повідомленнями,
Другий — на використанні розділення пам'яті,
Третій спирається на стандарт POSIX і об'єднує обидва підходи.
Найбільш відомою реалізацією першого підходу є специфікація MPI (Message Passing Interface) для мов С і Fortran, а другого підходу - специфікація OpenMP для Fortran, С, C++. OpenMP — це набір спеціальних директив компілятору (pragma), а також бібліотечних функцій і змінних середовища. Компілятор, що підтримує OpenMP, перетворює початковий код програми - вставляє відповідні виклики функцій для паралельного виконання фрагментів коду, виділених за допомогою спеціальних директив компілятору. Підтримка специфікації OpenMP є у всіх компіляторах Intel, починаючи з шостої версії, в Microsoft С і C++, починаючи з Visual Studio 2005. В третьому підході використовується специфікація POSIX (Portable Operating System interface for unIX), введена як міжнародний стандарт ISO/IEC 9945-1:1990. В рамках POSIX можна реалізувати паралельні обчислення на основі обміну повідомленнями (аналогічно MPI), або розділення пам'яті (як в OpenMP). В POSIX допустима і будь-яка комбінація цих методів.
Можливості розподілених і паралельних обчислень є в мовах Java, C#.
На сьогодні головними елементами програм провідних компаній–розробників мікропроцесорів стали багатоядерні процесори.
Наприклад, корпорація Intel розробляє відразу 17 багатоядерних процесорів і в найближчому майбутньому зможе поставляти їх для всіх сімейств своєї продукції на різних платформах, включаючи клієнтські, серверні і комунікаційні системи. До складу багатоядерного серверного процесора входять два або більше ядра на кожний фізичний процесор, що дозволяє серверним платформам одночасно обробляти більше завдань, програмних потоків або застосувань. Очікується, що ці можливості відкриють нову еру зростання продуктивності і гнучкості серверів [3].
Двоядерні процесори Intel – лише перший крок на цьому шляху. Перший двоядерний процесор Intel для настільних ПК був випущений в квітні 2005 року; зараз корпорація Intel вже працює над багатоядерною архітектурою, яка, дозволить об'єднати десятки і навіть сотні процесорних ядер на одному кристалі. Розробляються також плани створення спеціалізованих ядер, які забезпечать оптимальну продуктивність для найважливіших задач майбутнього, таких як аналіз інформації в базі даних і вдосконалена обробка зображень і природної мови.
Сьогодні вважається, що багатоядерні процесори – цей єдиний перспективний напрям для подальшого розвитку комп'ютерної індустрії.
Провідний експерт корпорації Microsoft Херб Саттер в статті «Програмне забезпечення і революція узгодження» (ACM QUEUE, September 2005) називає те, що відбувається революцією за масштабами суттєво більш могутньою, ніж поширення об'єктно-орієнтованого програмування на початку 90-х років. Тоді причиною змін стало ускладнення програмних систем, нинішня ж революційна ситуація викликана необхідністю виконувати програми на багатоядерних процесорах».
