Потоко-орієнтоване програмування

Потоко-орієнтоване програмування — це парадигма програмування, у якій додаток (програма) визначається, як ланцюг (мережа) процесів з інкапсульованою поведінкою (“чорних скриньок” - “black boxes”), які обмінюються даними по наперед заданими з'єднаннями за допомогою передачі повідомлень. Причому, з'єднання задані у деякій зовнішній структурі, що відділена від процесів обробки. Такі мережі, складені з “чорних скриньок” можуть бути безліч разів реконфігуровані відповідно до визначеної загальної задачі, при цьому самі “чорні скриньки” зсередини не повинні модифікуватися. За таким описом можна зробити висновок, що FBP це компонентно-орієнтована парадигма.

FBP це одна з форм dataflow програмування (виконання програми контролюється не потоком інструкцій, а потоком даних), що базується на використанні обмежених буферів, інформаційних пакетах з обмеженим життєвим циклом, іменованих портах і відділеному визначенні зв'язків.

Вступ

У Flow-Based програмуванні додаток (програма) розглядається не як єдиний, послідовний, процес, який починається в деякий момент часу і потім виконує тільки одну операцію у один момент часу, а як мережа асинхронних процесів, що спілкуються між собою за допомогою потоків структурованих блоків даних, що називаються "інформаційними пакетами" (“informational packages” - IP). У даному підході, акцент робиться на початкових даних і їх перетвореннях, в результаті проведення яких отримується бажаний результат. Ланцюг (мережа) перетворень задається, як множина зв'язків між процесами (перетвореннями) і обробляється деякою зовнішньою програмою, яку, зазвичай, називають “планувальник”.

Процеси спілкуються за допомогою з'єднань, що містять буфери фіксованого розміру. З'єднання прикріплене до процесу за допомогою іменованого порту. Ім'я порту узгоджується між кодом процесів та структурою, що описує мережу. Один і той же шматок коду може виконуватись більше ніж у одному процесі. У один момент часу, інформаційний пакет (IP) може або оброблятися одним єдиним процесом, або передаватись між процесами. Порти можуть працювати як з простими типами даних, так і з масивами. Заздалегідь визначені набори портів і процесів, що асинхронно виконують елементарні базові операції (такі як сортування, злиття масивів, сумування тощо) можуть бути надані у вигляді “чорних скриньок”.

Внаслідок того, що час роботи процесів у FBP регулюється залишком необроблених даних, програми побудовані на засадах даної парадигми, зазвичай, виграють у програм написаних у імперативному стилі. До того ж, FBP програми можуть легко забезпечити оптимальне використання усіх наявних процесорів, без будь-яких зусиль з боку програміста. Як правило, мережі визначаються у вигляді схеми, яка згодом перетворюється на мову або систему позначень більш низького рівня. Таким чином FBP це парадигма візуального програмування. Складні схеми можуть бути представлені ієрархічними схемами, тобто зі схем, що побудовані з більш маленьких схем з наперед заданою структурою. FBP за своєю природою не залежить від мови реалізації. Якщо планувальник буде реалізований за допомогою деякої розповсюдженої мови (варіантів багато), що має зв'язки (bindings) з іншими мовами, то компоненти можуть бути написані на різних мовах і вони зможуть працювати у одній мережі. Таким чином FBP можна віднести до проблемно-орієнтованих мов. У FBP використовується “зв'язування за даними”, що є одним із типів систем зі слабкою (louse coupling) зв'язністю. FBP підштовхує до використання сервіс-орієнтованих архітектур. FBP сприяє програмуванню на високому рівні, пропагує функціональний стиль, який спрощує загальний опис поведінки системи.

Основні поняття

На приведеній нижче діаграмі показані основні елементі FBP (окрім інформаційних пакетів (IP)). Така діаграма може буди безпосередньо перетворена на список з'єднань, які, у свою чергу, можуть бути виконані деяким програмним або апаратним комплексом.

Приклад FBP мережі

A, B і C є процесами виконання коду компонентів. О1, О2 та два IN порти призначені для з'єднань M та N. Можлива ситуація коли процеси B і C будуть виконувати одну і ту саму ділянку коду, тому кожен з процесів повинен мати свою власну ділянку оперативної пам'яті, власні блоки управління тощо. Але у будь-якому з випадків (код B і C однаковий або ні) ці блоки можуть використовувати вхідні порти з однаковими іменами. M і N інколи називають "обмеженими буферами" оскільки у кожний момент часу вони можуть утримувати заздалегідь задану кількість інформаційних пакетів. Концепція портів дозволяє використовувати будь-який компонент у одній і тій самій мережі кілька разів. У поєднанні з можливістю параметризації за допомогою “ініціалізуючих інформаційних пакетів” (Initial Informational Packets — IIP) це робить FBP одним з різновидів компонентно-орієнтованої архітектури. Інформаційні пакети визначаються у деякому просторі, що називається “простором інформаційних пакетів” і мають чітко визначений час існування. Після використання інформаційні пакет повинен бути знищеним. Процедура знищення є явною і обов'язок її виконання покладається на процес, що прийняв пакет. Пакети переміщуються за різними зв'язками мережі (конкретніше, саме зв'язки займаються переміщенням пакетів) цілком асинхронно, починаючи свій шлях у момент генерації. Така поведінка реалізує концепцію “ледачих обчислень”. Тобто процес починає свою роботу, як тільки у нього з'являються усі необхідні для обчислень дані. Як правило, інформаційні пакети це структуровані блоки даних, але пакет може і не містити будь-якої інформації і використовуватись просто як сигнал до певної дії. Прикладом такого пакету може бути “дужковий” (“bracket IP”) пакет, тобто пакет, що вказує на початок деякої послідовності (підпослідовності). В такого пакету повинен бути відповідний пакет, що буде закривати послідовність. Можливі вкладені одна в одну послідовності. Такі послідовності можуть переміщуватись системою як один об'єкт. Система зв'язків і процесів, описаних вище, легко масштабується до будь-якого розміру. Під час розробки між реальними блоками можуть бути поміщені блоки моніторингу, для цілей моніторингу і відлагодження. Також можна використовувати блоки-заглушки, що згодом будуть змінені на реальні блоки. Всі ці можливості роблять FBP зручним інструментом для створення прототипів. Насправді FBP є метафорою промислової лінії збірки (конвеєра): інформаційні пакети переміщуються від процесу до процесу подібно до деталей, що подорожують від верстата до верстата. "Машини" (блоки) можуть бути легко підключені, зняті на ремонт, заміну тощо. Досить дивно, але це дуже схоже на обробку інформації до того, як з'явилися комп'ютери.

Реалізації

Перші реалізації було виконано на C++ за допомогою green threads (наразі ця реалізація переписується на потоки). Інша популярна реалізація здійснена на Java (основний розробник Джон Кован (John Cowan)). Ця реалізація має відкритий код і доступна у публічному репозиторії SourceForge. Також на цьому сайті доступна C# реалізація. Обидві ці реалізації використовують потоки (threads), що забезпечую оптимальне використання ресурсів системи, на якій виконується додаток.

Також створено графічний редактор схем обробки, що здатний генерувати код, який використовую можливості бібліотек реалізації.

Також створено реалізації на багатьох інших мовах, таких як PHP (PhpFlo), JavaScript (NoFlo), Python (Pypes).

Див. також