Кіріспе
Деректер ағынын бағдарламалау парадигмасы Компьютерлік бағдарламалауда ағыны негізінде бағдарламалау (FBP) - бағдарламалау парадигмасы, ол қолданбаларды қара қорап процестерінің желілері ретінде айқындайды, олар алдын ала анықталған қосылыстар арқылы хабарламаларды өткізу арқылы деректерді алмасады, онда қосылыстар процестерге сыртқы түрде келтіріледі. Бұл қара қорап процестерін ішкі өзгерістерсіз әр түрлі қолданбаларды құру үшін шексіз қайта қосуға болады. Осылайша FBP табиғи түрде компоненттерге бағытталған. FBP - бұл шектелген буферлерге, белгілі өмір сүру мерзімі бар ақпараттық пакеттерге, атаулы порттарға және қосылымдардың жеке анықталуына негізделген деректер ағынын бағдарламалаудың ерекше түрі.
In computer programming, flow based programming (FBP) is a programming paradigm that defines applications as networks of black box processes, which exchange data across predefined connections by message passing, where the connections are specified externally to the processes. These black box processes can be reconnected endlessly to form different applications without having to be changed internally. FBP is thus naturally component oriented. FBP is a particular form of dataflow programming based on bounded buffers, information packets with defined lifetimes, named ports, and separate definition of connections.
Кіріспе
Ағымы бойынша бағдарламалау "деректер фабрикасы" метафорасын қолдана отырып, қосымшаларды анықтайды. Ол қолданбаны бір уақытта бір нәрсе жасай бастайтын, содан кейін бір уақытта бір нәрсе жасай бастайтын, бірақ "ақпараттық пакеттер" (IP) деп аталатын құрылымдалған деректер тораптарының ағыны арқылы байланысатын асинхронды процестердің желісі ретінде қарайды. Бұл тұрғыдан алғанда, назарды қажетті нәтижелерді алу үшін қолданылатын деректер мен оларға қолданылатын түрлендірулерге аудару керек. Желі процестерге сыртқы түрде, әдетте "жоспарлаушы" деп аталатын бағдарламалық жасақтамамен түсіндірілетін қосылымдар тізімі ретінде анықталады. Процестер тұрақты қуаттылық байланыстары арқылы байланысады. Процеске қосылым процесс коды мен желі анықтамасы арасында келісілген атауға ие порт арқылы қосылады. Бір ғана кодты бірнеше процесс орындай алады. Кез келген уақытта берілген ИС тек бір процеске "иесі" болуы мүмкін немесе екі процестің арасында өтуі мүмкін. Порттар қарапайым немесе массивтік болуы мүмкін, мысалы, төменде сипатталған Collate компонентінің кіріс порты үшін пайдаланылады. Бұл асинхронды процестермен порттардың үйлесімі, ол көптеген ұзақ уақыт жұмыс істейтін бастапқы деректерді өңдеу функцияларын, мысалы, сұрыптау, біріктіру, қорытындылау және т.б. бағдарламалық жасақтамалардың қара қорапшалары түрінде қолдауды қамтамасыз етеді. FBP процестері жұмыс істейтін деректері бар және олардың шығысын қоятын жері бар болғандықтан, FBP қолданбалары әдетте кәдімгі бағдарламаларға қарағанда аз уақыт ішінде жүреді және машинадағы барлық процессорларды тиімді пайдаланады, бұған қол жеткізу үшін арнайы бағдарламалау қажет емес. Желілік анықтама әдетте диаграммалық болып табылады және төменгі деңгейдегі тілде немесе белгіде байланыс тізіміне айналады. FBP көбінесе осы деңгейдегі визуалды бағдарламалау тілі болып табылады. Күрделі желілік анықтамалардың иерархиялық құрылымы бар, олар "жапсырмалы" байланыстары бар субжелілерден құрылады. Көптеген басқа ағыны негізделген тілдер / орындалу уақыты дәстүрлі бағдарламалау тілдері айналасында құрылған, ең танымал мысал - RaftLib, ол ағыс графигін анықтау үшін C ++ iostream сияқты операторларды қолданады. FBP линда тілімен көп ортақ, өйткені ол Гельернтер мен Карьеро терминологиясында "орталықтандыру тілі": ол негізінен тілге тәуелсіз. Расында да, жеткілікті төмен деңгейдегі тілде жазылған жоспарлаушыны беру арқылы әртүрлі тілдерде жазылған компоненттерді бір желіде біріктіруге болады. Осылайша FBP өзін домендік тілдер немесе "мини тілдер" ұғымына ұсынады. FBP құрауыштар арасындағы "деректер біріктіру" түріне ие, ол біріктіру туралы мақалада компоненттер арасындағы біріктірудің ең бос түрі ретінде сипатталған. Ашық біріктіру түсінігі өз кезегінде қызмет көрсетуге бағытталған архитектуралармен байланысты, ал FBP осындай архитектураның бірқатар критерийлеріне сәйкес келеді, бірақ бұл архитектураның көптеген мысалдарынан гөрі жақсы түйіршікті деңгейде. FBP жоғары деңгейдегі, функционалдық стильді ерекшеліктерді ұсынады, олар жүйелік мінез-құлық туралы ойлауды жеңілдетеді. Бұған мысал ретінде үлестірілген көп тарапты протоколдардың семантикасын конструктивті түрде анықтау және талдау үшін бөлінген дерек ағыны моделі келтіріледі.
Тарих
Ағымы бойынша бағдарламалауды 1970-ші жылдардың басында Дж. Пол Моррисон ойлап тапты және бастапқыда Канада банкі үшін бағдарламалық жасақтамада іске асырылды. FBP-ге оның басталуы кезінде сол кезеңдегі кейбір IBM симуляциялық тілдерінің, атап айтқанда GPSS-тің әсері болды, бірақ оның тамыры Конвейдің coroutines деп аталатын жұмысына барып такайды. FBP жылдар бойы бірнеше рет атауын өзгертті: бастапқы іске асыру AMPS (Advanced Modular Processing System) деп аталды. Канададағы бір ірі қолданба 1975 жылы іске қосылды және 2013 жылға дейін 40 жыл бойы күн сайын жұмыс істеп, үздіксіз өндірісте қолданылып келеді. IBM FBP идеясын "табиғат заңы сияқты" патенттеуге болатын деп санағандықтан, олар FBP-нің негізгі тұжырымдамаларын 1971 жылы "Мағлұматтарға жауап беретін модульді, аралас тапсырмаларды бағдарламалау жүйесі" техникалық жария ету бюллетені арқылы қоғамдық иелікке енгізді. Екінші іске асыру IBM Канада мен IBM Жапонияның бірлескен жобасы ретінде "Деректер ағынын дамыту менеджері" (DFDM) деген атпен жасалды және 80-жылдардың соңында Жапонияда "Деректер ағынын бағдарламалау менеджері" деген атпен қысқа уақытқа сатылды. Жалпы, бұл ұғымдар IBM-де "деректер ағыны" деп аталды, бірақ бұл термин тым жалпы деп саналды, содан кейін "Ағымына негізделген бағдарламалау" атауы қабылданды. 80-жылдардың басында 1993 жылға дейін Дж. Пол Моррисон мен IBM архитекторы Уэйн Стивенс FBP тұжырымдамаларын жетілдіріп, насихаттады. Стивенс FBP тұжырымдамасын сипаттайтын және қолдап тұратын бірнеше мақала жазды және ол туралы бірнеше кітаптарына материал енгізді 1994 жылы Моррисон FBP-ді сипаттайтын кітап жариялады және FBP-нің даму уақытын қысқартуға әкелгеніне эмпирикалық дәлелдер берді.
Тұжырымдамалар
Төмендегі диаграммада FBP диаграммасының негізгі элементтері көрсетілген (Мағлұмат пакеттерінен басқа). Мұндай диаграмманы тікелей қосылымдар тізіміне айналдыруға болады, содан кейін оны тиісті қозғалтқыш (жазбаша немесе аппараттық) орындай алады. A, B және C - код компоненттерін орындайтын процестер. O1, O2 және екі IN - бұл M және N қосылымдарын тиісті процестерге жалғайтын порттар. B және C процестерінің бірдей кодты орындауына рұқсат етіледі, сондықтан әр процестің өз жұмыс жады, басқару блоктары және т.б. болуы керек. Олар кодты бөлісе ме, жоқ па, B және C порт атауларын бірдей қолдануға еркін, өйткені порт атаулары тек оларға сілтеме жасайтын компоненттерде ғана мағыналы (әрине, желі деңгейінде). M және N - бұл "шектеулі буферлер" деп аталады және кез-келген уақытта ұстай алатын ЖБ саны бойынша тұрақты сыйымдылыққа ие. Порт тұжырымдамасы сол компоненттің желіде бірнеше жерде қолданылуына мүмкіндік береді. Бастапқы ақпараттық пакеттер (IIP) деп аталатын параметрлеу қабілетімен бірге порттар FBP-ге компоненттерді қайта пайдалану қабілетін береді, бұл FBP-ді компоненттерге негізделген архитектураға айналдырады. FBP осылайша IBM Research-тің Рауль де Кампо мен Нейт Эдвардс конфигурацияланатын модульділік деп атаған нәрсені көрсетеді. Ақпараттық пакеттер немесе IP-тер "IP кеңістігінде" (Линданың туплдары "тупль кеңістігінде" бөлінгендей) бөлінеді және олар жойылғанға дейін және FBP-де олардың кеңістігі қалпына келтірілгенге дейін жақсы анықталған өмір сүру мерзімі бар. Бұл иелік ету процесінің тарапынан нақты әрекет болуы керек. Берілген қосылым арқылы жүретін IP-тер (әрине, олардың "қалыптары" жүреді) "ағынды" құрайды, ол асинхронды түрде пайда болады және тұтынылады. Осылайша бұл ұғым Фридман мен Уайздың 1976 жылғы мақаласында сипатталған жалкоо қарсылық тұжырымдамасына ұқсас. IP-тер әдетте деректердің құрылымдалған бөліктері болып табылады, бірақ кейбір IP-терде нақты деректер болмауы мүмкін, бірақ олар жай ғана сигнал ретінде қолданылады. Бұған мысал ретінде "браккеттік IP-тер" қолданылады, олар деректерді IP-терді "қосалқы ағымдар" деп аталатын ағымның ішіндегі ретті үлгілерге топтастыру үшін пайдаланылуы мүмкін. Ішкі ағымдар өз кезегінде ұялы болуы мүмкін. IP-тер желіде жеке нысандар ретінде жүретін "IP ағаштарын" құру үшін біріктірілуі мүмкін. Жоғарыда сипатталған байланыстар мен процестер жүйесі кез келген өлшемге "ағыстырылуы" мүмкін. Қолданбаны әзірлеу кезінде бақылау процестері процестер жұбы арасында қосылуы мүмкін, процестер субжелілерге "жарылуы" мүмкін немесе процестердің симуляциялары нақты процесс логикасымен ауыстырылуы мүмкін. FBP-нің жылдам прототиптеуге мүмкіндігі бар. Бұл - деректерді өңдеудің құрастыру желісінің бейнесі: процестер желісі арқылы жүретін IP-терді құрастыру желісінің стансасынан стансаға жүретін виджеттер ретінде қарастыруға болады. "Машиналарды" қайта қосу, жөндеу үшін желіден шығару, ауыстыру және т.б. оңай. Бір қызығы, бұл сурет компьютерлер пайда болғанға дейін деректерді өңдеу үшін қолданылатын бірлік жазба жабдықтарына өте ұқсас, бірақ карталар палубасын бір машинадан екінші машинаға қолмен алып жүру керек еді. FBP-нің іске асырылуы алдын ала емес немесе алдын ала болуы мүмкін. Бұрынғы іске асырылу алдын ала емес (негізгі жүйе және C тілі), ал соңғы Java іске асырылуы (төменде қараңыз) Java Thread класын қолданады және алдын ала.
Мультиплекс процестері
Ағынды негіздегі бағдарламалау процестерді мультиплекстеуді өте табиғи жолмен қолдайды. Компоненттер тек оқу үшін ғана болғандықтан, берілген компоненттің кез келген саны ("процестер") бір-бірімен асинхронды түрде орындалуы мүмкін. Компьютерлерде әдетте бір процессор болған кезде, бұл көп I / O жүргізілген кезде пайдалы болды; енді машиналарда әдетте бірнеше процессорлар бар, бұл процестер CPU-ды қажет ететін кезде де пайдалы бола бастады. Осы бөлімдегі диаграммада S1, S2 және S3 деп белгіленген үш процеске деректерді бөлетін бір "жүк теңгергіш" процесін көрсетеді, олар бір компоненттің кейіпкерлері болып табылады, олар өз кезегінде "алғашқы келген, бірінші қызмет еткен" негізінде бір процеске беріледі.
Қарапайым интерактивті желі
Бұл жалпы схемада пайдаланушылардан келетін сұраулар (транзакциялар) диаграммаға жоғарғы сол жақта, ал жауаптар төменгі сол жақта қайтарылады. "Артқы аяқтары" (оң жақта) басқа сайттардағы жүйелермен, мысалы CORBA, MQSeries және т.б. Крос-байланыстар пайдаланушыға қайтарылу алдында желі арқылы бірнеше рет жүруге тиіс немесе арткы аяққа барудың қажеті жоқ сұрауларды білдіреді. Әр түрлі сұраулар әр түрлі соңғы бөліктерді пайдаланатындықтан және оларды өңдеу үшін соңғы бөліктерге (егер пайдаланылса) әр түрлі уақыт қажет болғандықтан, қайтарылған деректерді тиісті сұрау салу операцияларына, мысалы, хэш-кестелерге немесе кэштерге байланыстыратын ережелерді жасау керек. Жоғарыдағы диаграмма түпкілікті қосымшада көптеген процестер болуы мүмкін деген мағынада схемалық болып табылады: процестер кэштерді басқару, қосылым трафигін көрсету, өткізуді бақылау және т.б. үшін басқа процестердің арасында енгізілуі мүмкін. Диаграммадағы блоктар бір немесе бірнеше ашық қосылыстары бар шағын желілерді "кіші желілер" ретінде көрсете алады.
Джексонның құрылымдық бағдарламалау (JSP) және Джексонның жүйелік дамуы (JSD)
Бұл әдістеме бағдарламаның бір ғана процедуралық иерархиялық субпрограммалар ретінде құрылуы керек деп болжайды. Оның бастапқы нүктесі - кіріс және шығыс деректері құрылымына негізделген "негізгі желілер" жиынтығы ретінде қосымшаны сипаттау. Осы "негізгі желілердің" бірі бүкіл бағдарламаны басқару үшін таңдалады, ал қалғандары оларды қосалқы бағдарламаларға айналдыру үшін "ауыстырылуы" қажет (осыдан "Джексон инверсиясы" атауы). Бұл кейде "қозғалыс" деп аталатын, бағдарламаны бірнеше бағдарламаларға немесе coroutines-қа бөлуді талап ететін жағдайға әкеледі. FBP-ны пайдаланғанда, бұл инверсия процессі қажет емес, өйткені FBP-ның әрбір компоненті жеке "негізгі желі" деп саналуы мүмкін. FBP және JSP бағдарламаны (немесе кейбір компоненттерді) енгізу ағынының талдаушысы ретінде қарау тұжырымдамасын бөліседі. Джексонның кейінгі еңбегінде, Джексонның жүйелік дамуы (JSD) идеялары одан әрі дамыды. JSD-де жобалау желілік жобалау ретінде соңғы іске асыру кезеңіне дейін сақталады. Модель содан кейін қол жетімді процессорлардың санына сәйкес ретті процестердің жиынтығына айналады. Джексон өзінің кітабының 1.3-бөлімінде (курсивпен) осы қадамнан бұрын бар желілік модельді тікелей орындау мүмкіндігін талқылайды: Жүйелік уақыт кезеңінің соңында шығарылған спецификация, қағидаты бойынша, тікелей орындауға қабілетті. Қажетті ортада әр процесс үшін процессор, әр деректер ағыны үшін шексіз буферге тең құрылғы және жүйе нақты әлеммен байланысты болатын кейбір кіріс және шығыс құрылғылары болады. Мұндай ортаны, әрине, жеткілікті қуатты машинада жұмыс істейтін қолайлы бағдарламалық қамтамасыз ету қамтамасыз ете алады. Кейде, мұндай тікелей орындау ерекшелік мүмкін болады, және тіпті болуы мүмкін ақылға қонымды таңдау.
The specification produced at the end of the System Timing step is, in principle, capable of direct execution. The necessary environment would contain a processor for each process, a device equivalent to an unbounded buffer for each data stream, and some input and output devices where the system is connected to the real world. Such an environment could, of course, be provided by suitable software running on a sufficiently powerful machine. Sometimes, such direct execution of the specification will be possible, and may even be a reasonable choice.
Линда
FBP-дегі көптеген ұғымдар жылдар бойы әртүрлі жүйелерде өз бетінше ашылған сияқты. Жоғарыда айтылған Линда да осындай адамдардың бірі. Екі техниканың айырмашылығын ФБП-дағы Линданың "пираньялар мектебі" жүктемені теңдестіру техникасы көрсетеді, бұл қосымша "жүкті теңдестіру" компонентін қажет етеді, ол сұраныстарды өңдеуді күтіп тұрған ең аз IP саны бар тізімдегі компонентке бағыттайды. FBP мен Линданың тығыз байланысты екені анық, және бірін екіншісін симуляциялау үшін оңай қолдануға болады.
Нысанға бағдарланған бағдарламалау
ОПП-тағы объект ақпаратты да, мінез-құлықты да қамтитын жартылай автономды бірлік ретінде сипатталуы мүмкін. Объектілер "әдіс шақырулары" арқылы байланысады, олар негізінен қабылдаушы объектке жататын сынып арқылы жанама түрде жасалатын субпрограммалық шақырулар. Объектінің ішкі деректеріне тек әдіс шақырулары арқылы ғана қол жеткізуге болады, сондықтан бұл ақпаратты жасыру немесе "капсуляциялау" түрі. Алайда, инкапсуляция ООП-тан бұрын пайда болған, Дэвид Парнас 70-жылдардың басында бұл туралы алғашқы мақалалардың бірін жазды және ол есептеу техникасының негізгі тұжырымдамасы болып табылады. Инкапсуляция - бұл FBP компонентінің мәні, оны кіріс деректерін шығыс деректеріне түрлендіруді жүзеге асыратын қара қорап ретінде қарастыруға болады. FBP-де компоненттің спецификациясының бір бөлігі ол қабылдай алатын және шығаратын дерек форматтары мен ағындар құрылымы болып табылады. Бұл келісімшарт бойынша жобалаудың бір түрі. Сонымен қатар, IP-дегі деректерге тек қана қазіргі уақытта иелік ететін процесс тікелей қол жеткізе алады. Инкапсуляциялауды сыртқы процестер ішкі процестерді қорғау арқылы желі деңгейінде де іске асыруға болады. C. Эллис пен S. Гиббстің мақаласында белсенді және пассивті объектілер арасында айырмашылық көрсетілген. Пассивті объектілер жоғарыда айтылғандай, ақпарат пен мінез-құлықты қамтиды, бірақ олар осы мінез-құлықтың уақытын анықтай алмайды. Ал белсенді нысандар бұны істей алады. Эллис пен Гиббс өз мақалаларында белсенді объектілердің пассивті объектілерге қарағанда, күтіп ұсталатын жүйелерді дамыту үшін көбірек әлеуетке ие екенін айтады. FBP қолданбасын осы екі нысан түрінің комбинациясы ретінде қарастыруға болады, мұнда FBP процестері белсенді нысандарға сәйкес келеді, ал IP-лер пассивті нысандарға сәйкес келеді.
Үлгілік актер
FBP Карл Хьюиттің акторын 2 порты бар асинхронды процестер ретінде қарастырады: бірі кіріс хабарламалары үшін, екіншісі басқару сигналдары үшін. Әрбір орындаудан кейін басқару сигналын орындаушының өзі шығарады. Бұл сигналдың мақсаты актердің денесін қатар орындаудан аулақ болу және актер объектісінің өрістеріне синхрондастырусыз кіруге мүмкіндік беру.