Реактивно програмирање

С Википедије, слободне енциклопедије

У рачунарству, реактивно програмирање је парадигма програмирања оријентисана око токова података и пропагирања промена. То значи да је могуће изразити статичке или динамичке податке који теку са лакоћом у програмским језицима који се користе, а да ће основни модел извршење аутоматски пропагирати промене кроз проток података.

На пример, у императивном окружењу програмирања, а: = b + c би значило да се а додељује резултату b + c и у тренутку израза се оцењује, а касније, вредности b и c могу се мењати без ефекат на вредност а.

Међутим, у реактивном програмирању, вредност а се аутоматски ажурира на основу нове вредности, супротно од функционалног програмирања.

Модеран табеларни програм је пример реактивног програмирања. Ћелије табела могу да садрже дословне вредности, или формуле као што је "= B1 + C1" које се процењују на основу других ћелија. Кад год се вредности осталих ћелија мењају, вредност формуле се аутоматски ажурира.

Други пример је хардверски опис језика, као што је Верилог. У овом случају реактивно програмирање омогућава променама да се моделирају као што се пропагирају кроз коло.

Реактивно програмирање је пре свега било предложено као начин да се поједностави стварање интерактивних корисничких интерфејсова, анимација у реалном времену системима, али је у суштини општи парадигма програмирање.

На пример, у модел-преглед-контролору архитектуре, реактивно програмирање може дозволити промене у основном моделу да се аутоматски одражавају у погледу, и обрнуто.[1]

Концепти[уреди | уреди извор]

Степен јасноће[уреди | уреди извор]

Реактивни програмски језици могу да варирају од веома експлицитних оних где се токови података постављају користећи стрелице, имплицитно где токови података произилазе из језика конструката који личе на оне императивне или функционалног програмирања. На пример, у имплицитном подизању функционалног реактивног програмирања (ФРП) функција позива може имплицитно изазвати чвор да се изгради у графику протока података. Реактивно програмиране библиотеке за динамичке језике (као што је Лисп "ћелија" и Пајтон "треллис" Библиотеке) може конструисати график зависности за компнентне анализе чије вредности се читају током извршавања функција, омогућавајући спецификацијама протока података да буду и имплицитне и динамичне.

Понекад се термин реактивно програмирање односи на архитектонски ниво софтверског инжењерства, где поједини чворови у графику протока података су обично програми који комуницирају једни са другима.

Статика и динамиа[уреди | уреди извор]

Реактивно програмирање може бити чисто статичко где се токови података подесе статички или динамички, где се токови података могу мењати током извршења програма.

Употреба прекидача података у графику протока података може у извесној мери да статички проток података графика појавити као динамики, и замагљују малу разлику. Истина динамичко реактивно програмирање, може користити императив програмирања да реконструише график протока података.

Виши ред реактивног програмирања [уреди | уреди извор]

Реактивно програмирање може се рећи да је од вишег реда ако подржава идеју да се токови података могу користити за изградњу других токова података. То јест, добијена вредност из тока података је други ток податка графика који се извршава коришћењем истих модела процена, као прва.

Диференцијација протока података[уреди | уреди извор]

У идеалном случају све промене података се одмах пропагирају, али то не може бити сигурно у пракси. Уместо тога можда ће бити потребно да се дају различити делови различитим приоритетима евалуације протока података графика. Ово може да позево диференцирано реактивно програмирање.потребан цитат

На пример, у програму за обраду текста обележавање правописних грешака не мора бити потпуно синхронизовано са уметањем карактера. Овде диференцирано реактивно програмирање може да се потенцијално користи да би контролорисао правописа нижег приоритета, што му омогућава да буде одложен задржавајући друге податаке токова присутним.

Међутим, такво разликовање представља додатну комплексност дизајна. На пример, одлучи како дефинисати различите области протока података, и како да догађај пролази између различитих области протока података.

Процена модела реактивног програмирања[уреди | уреди извор]

Евалуација реактивних програма није нужна на основу тога како је гомила заснована на програмским језицима процењује. Уместо тога, када се промене неки подаци, промена се пропагира да свим подацима који су делимично или у потпуности изведени из података буду промењени. Ова промена простирања се може постићи на више начина, где можда најприроднији начин је поништена / лења ревалидате шема.

То може бити проблематично јер само наивно пропагира промену користећи гомилу, због потенцијалне сложености експоненцијалног ажурирања ако структура података има одређену форму. Један таква облик може се описати као "поновљен дијамант облик", и има следећу структуру: An→Bn→An+1, An→Cn→An+1, где је  n=1,2... Овај проблем би се могао превазићи размножавањем поништења само када неки подаци већ нису поништени, а касније поново потврди податаке када је то потребно помоћу лење процене.

Један својствен проблем реактивног програмирања је да већина израчунавања која ће бити вреднована и заборављена у нормалном програмском језику, треба да буду заступљени у меморији као структура података. потребан цитат То би могло потенцијално да РП сувишну меморију троши. Међутим, истраживања о томе шта се зове смањење потенцијално може превазићи овај проблем.[2]

С друге стране, реактивно програмирање је облик који би се могао описати као "експлицитни паралелизам" и стога могу бити од користи за коришћење снаге паралелног хардвера.

Сличности са узорком посматрача[уреди | уреди извор]

Реактивно програмирање има главне сличности са узорком посматрача који се уобичајено користи у објектно оријентисаном програмирању. Међутим, интегрисање концепта протока података у програмском језику ће бити лакше да се изрази, и због тога повећава грануларност графика протока података. На пример, узорак посматрача најчешће описује токове података између целих објеката / класа, док објекат оријентисан реактивним програмирањем може да циља чланове објеката / одељења.

Гомила основе процене податка заједничког објекта оријентације такође није у потпуности погодна за размножавање протока података, као појава "дрво повратних ивица" у структуре података може да направи програм лица експоненцијалне сложености. Али због релативно ограничене употребе и ниске гранулације, ово је редак проблем за узорак посматрача у пракси.

Приступи[уреди | уреди извор]

Императивно[уреди | уреди извор]

Могуће је да се споји реактивно програмирање са обичним императивним програмирањем. У таквим парадигмама, императив програми раде на реактивним структурама података.[3] Таква организација је аналогна ограничењу императивног програмирања; међутим, док ограничење императивног програмирања управља двосмерним ограничењем, реактивно императивно програмирање управља у једном правцу ограничењем тока података.

Објектно оријентисано[уреди | уреди извор]

Објектно оријентисано реактивно програмирање (ООРП) је комбинација објектно оријентисаног програмирања и реактивног програмирања. Можда је најприроднији начин да се направи таква комбинација следећи: уместо метода и поља, објекти имају реакције које аутоматски преиспитују када друге реакције од којих они зависе су измењене. [потребан цитат] Испод је илустрација A=X+Y уводни пример:[4]

function setA() { // A=X+Y као целе непознате
   var A = parseInt($('#X').text()) + parseInt($('#Y').text());
   $('#A').text(A);
}
setA(); // за почетне вредности A
$('#X,#Y').css('cursor', 'pointer').click(function () {
   // реакција на клик на X или на Y...
   var obj = $(this);
   obj.text(parseInt(obj.text()) + 1);  // ажурирање X или Y 
   setA();  // ажурирање A
});

Ако ООРП програмски језик води своје императивне методе, такође потпада под категорију императивног реактивног програмирања.

Функционалност[уреди | уреди извор]

Функционално реактивно програмирање (ФРП) је парадигма програмирања реактивног програмирања на функционалном програмирању.

Види још[уреди | уреди извор]

Референце[уреди | уреди извор]

  1. ^ Trellis, Model-view-controller and the observer pattern, Tele community, Архивирано из оригинала 03. 03. 2016. г., Приступљено 29. 11. 2015 
  2. ^ Burchett, Kimberley; Cooper, Gregory H; Krishnamurthi, Shriram, „Lowering: a static optimization technique for transparent functional reactivity”, Proceedings of the 2007 ACM SIGPLAN symposium on Partial evaluation and semantics-based program manipulation (PDF), стр. 71—80 
  3. ^ Demetrescu, Camil; Finocchi, Irene; Ribichini, Andrea (22. 10. 2011), „Reactive Imperative Programming with Dataflow Constraints”, Proceedings of the 2011 ACM international conference on Object oriented programming systems languages and applications, стр. 407—26, ISBN 9781450309400, S2CID 7285961, doi:10.1145/2048066.2048100 
  4. ^ example of A=X+Y (jQuery), JS fiddle 

Спољашње везе[уреди | уреди извор]