फंक्शनल रिएक्टिव प्रोग्रामिंग

कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग (एफआरपी) कार्यात्मक प्रोग्रामिंग के बिल्डिंग ब्लॉक्स (जैसे मैप (उच्च-ऑर्डर फ़ंक्शन), फोल्ड (उच्च-ऑर्डर फ़ंक्शन), फ़िल्टर (उच्च-ऑर्डर फ़ंक्शन)) का उपयोग करके प्रतिक्रियाशील प्रोग्रामिंग ( अतुल्यकालिक प्रोग्रामिंग डेटाफ्लो प्रोग्रामिंग) के लिए एक प्रोग्रामिंग प्रतिमान है। एफआरपी का उपयोग  ग्राफिकल यूज़र इंटरफ़ेस  (जीयूआई), रोबोटिक्स, गेम्स और संगीत प्रोग्रामिंग के लिए किया गया है, जिसका लक्ष्य स्पष्ट रूप से मॉडलिंग समय द्वारा इन समस्याओं को सरल बनाना है।

एफआरपी का सूत्रीकरण
कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग का मूल सूत्रीकरण कॉनल इलियट और पॉल हुडक द्वारा ICFP 97 पेपर कार्यात्मक प्रतिक्रियाशील एनीमेशन में पाया जा सकता है। 1997 में अपनी शुरुआत के बाद से एफआरपी ने कई रूप ले लिए हैं। विविधता की एक धुरी असतत बनाम निरंतर शब्दार्थ है। एक अन्य धुरी यह है कि एफआरपी सिस्टम को गतिशील रूप से कैसे बदला जा सकता है।

सतत
एफआरपी के शुरुआती सूत्रीकरण में निरंतर शब्दार्थ का उपयोग किया गया था, जिसका लक्ष्य कई परिचालन विवरणों का सार निकालना था जो किसी कार्यक्रम के अर्थ के लिए महत्वपूर्ण नहीं हैं। इस फॉर्मूलेशन के प्रमुख गुण हैं:


 * मॉडलिंग मान जो निरंतर समय के साथ बदलते रहते हैं, उन्हें व्यवहार और बाद के संकेत कहा जाता है।
 * मॉडलिंग घटना (कंप्यूटिंग)  जो समय में अलग-अलग बिंदुओं पर घटित होते हैं।
 * सिस्टम को घटनाओं के जवाब में बदला जा सकता है, जिसे आम तौर पर स्विचिंग कहा जाता है।
 * प्रतिक्रियाशील मॉडल से नमूनाकरण दर जैसे मूल्यांकन विवरण को अलग करना।

साइड इफेक्ट (कंप्यूटर विज्ञान)|साइड-इफेक्ट मुक्त भाषाओं में एफआरपी का यह सिमेंटिक मॉडल आमतौर पर निरंतर कार्यों के संदर्भ में है, और आमतौर पर समय के साथ। इस फॉर्मूलेशन को डिनोटेटिव कंटीन्यूअस टाइम प्रोग्रामिंग (DCTP) भी कहा जाता है।

असतत
इवेंट-संचालित एफआरपी और 0.17 से पहले एल्म (प्रोग्रामिंग भाषा) के संस्करणों जैसे फॉर्मूलेशन के लिए आवश्यक है कि अपडेट अलग-अलग और इवेंट-संचालित हों। इन फॉर्मूलेशनों ने व्यावहारिक एफआरपी पर जोर दिया है, जिसमें शब्दार्थ पर ध्यान केंद्रित किया गया है जिसमें एक सरल एपीआई है जिसे रोबोटिक्स या वेब-ब्राउज़र जैसी सेटिंग में कुशलतापूर्वक लागू किया जा सकता है। इन फॉर्मूलेशन में, यह आम बात है कि व्यवहार और घटनाओं के विचारों को ऐसे संकेतों में संयोजित किया जाता है जिनका हमेशा एक वर्तमान मूल्य होता है, लेकिन वे अलग-अलग रूप से बदलते हैं।

इंटरैक्टिव एफआरपी
यह बताया गया है कि सामान्य एफआरपी मॉडल, इनपुट से आउटपुट तक, इंटरैक्टिव कार्यक्रमों के लिए खराब रूप से अनुकूल है। इनपुट से आउटपुट तक मैपिंग के भीतर प्रोग्राम चलाने की क्षमता में कमी का मतलब निम्नलिखित समाधानों में से एक का उपयोग करना हो सकता है:
 * क्रियाओं की एक डेटा संरचना बनाएं जो आउटपुट के रूप में दिखाई दें। क्रियाएँ किसी बाहरी दुभाषिया या परिवेश द्वारा चलायी जानी चाहिए। इसमें हास्केल की मूल स्ट्रीम I/O प्रणाली की सभी कठिनाइयाँ विरासत में मिली हैं।
 * एरोइज्ड एफआरपी और एम्बेड तीरों का उपयोग करें जो कार्य करने में सक्षम हैं। क्रियाओं में पहचान भी हो सकती है, जो उन्हें उदाहरण के लिए अलग-अलग परिवर्तनशील स्टोर बनाए रखने की अनुमति देती है। यह फ़जेट्स लाइब्रेरी द्वारा अपनाया गया दृष्टिकोण है और, अधिक सामान्यतः, मोनाडिक स्ट्रीम फ़ंक्शंस।
 * नया तरीका यह है कि कार्रवाइयों को अभी (आईओ मोनड में) चलाने की अनुमति दी जाए लेकिन उनके परिणामों की प्राप्ति को बाद तक के लिए टाल दिया जाए। यह इवेंट और IO मोनैड के बीच इंटरैक्शन का उपयोग करता है, और अधिक अभिव्यक्ति-उन्मुख FRP के साथ संगत है:

कार्यान्वयन मुद्दे
एफआरपी सिस्टम दो प्रकार के होते हैं, पुश-आधारित और पुल-आधारित। पुश-आधारित प्रणालियाँ घटनाएँ लेती हैं और परिणाम प्राप्त करने के लिए उन्हें सिग्नल नेटवर्क के माध्यम से धकेलती हैं। पुल-आधारित प्रणालियाँ परिणाम की मांग होने तक प्रतीक्षा करती हैं, और मांगे गए मूल्य को पुनः प्राप्त करने के लिए नेटवर्क के माध्यम से पीछे की ओर काम करती हैं।

कुछ एफआरपी सिस्टम जैसे कि याम्पा सैंपलिंग का उपयोग करते हैं, जहां सिग्नल नेटवर्क द्वारा नमूने खींचे जाते हैं। इस दृष्टिकोण में एक खामी है: नेटवर्क को इनपुट में परिवर्तन के बारे में पता लगाने के लिए एक गणना चरण की अवधि तक इंतजार करना पड़ता है। नमूनाकरण पुल-आधारित एफआरपी का एक उदाहरण है।

हैकेज पर रिएक्टिव और एटेज लाइब्रेरी ने पुश-पुल एफआरपी नामक एक दृष्टिकोण पेश किया। इस दृष्टिकोण में, केवल जब विशुद्ध रूप से परिभाषित स्ट्रीम पर अगली घटना (जैसे समय के साथ निश्चित घटनाओं की सूची) की मांग की जाती है, तो उस घटना का निर्माण किया जाता है। ये विशुद्ध रूप से परिभाषित धाराएँ हास्केल में आलसी सूचियों की तरह काम करती हैं। वह पुल-आधारित आधा है। पुश-आधारित आधे का उपयोग तब किया जाता है जब सिस्टम के बाहर की घटनाओं को लाया जाता है। बाहरी घटनाओं को उपभोक्ताओं तक पहुंचाया जाता है, ताकि वे किसी घटना के जारी होते ही उसके बारे में पता लगा सकें।

कार्यान्वयन

 * याम्पा एसडीएल, एसडीएल2, ओपनजीएल और एचटीएमएल डोम समर्थन के साथ एक तीरांकित, कुशल, शुद्ध हास्केल (प्रोग्रामिंग भाषा) कार्यान्वयन है।
 * प्रोग्रामिंग भाषा एल्म (प्रोग्रामिंग भाषा) का उपयोग एफआरपी का समर्थन करने के लिए किया जाता है लेकिन तब से इसे एक अलग पैटर्न से बदल दिया गया है।
 * रिफ्लेक्स वेब ब्राउज़र/ दस्तावेज़ ऑब्जेक्ट मॉडल, सरल डायरेक्टमीडिया परत  और ग्लॉस के लिए होस्ट के साथ हास्केल में एक कुशल पुश/पुल एफआरपी कार्यान्वयन है।
 * प्रतिक्रियाशील-केला हास्केल में एक लक्ष्य-अज्ञेयवादी पुश एफआरपी कार्यान्वयन है।
 * नेटवायर और वैरिंजिंग को तीरांकित किया गया है, हास्केल में एफआरपी कार्यान्वयन को खींचें।
 * फ्लैपजैक्स जावास्क्रिप्ट में एक व्यवहार/घटना एफआरपी कार्यान्वयन है।
 * रिएक्ट कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग के लिए एक OCaml मॉड्यूल है।
 * सोडियम एक पुश एफआरपी कार्यान्वयन है जो जावा, टाइपस्क्रिप्ट और सी# जैसी कई प्रोग्रामिंग भाषाओं के लिए एक विशिष्ट यूआई फ्रेमवर्क से स्वतंत्र है।
 * डुनाई मोनाडिक स्ट्रीम फ़ंक्शंस का उपयोग करके हास्केल में एक तेज़ कार्यान्वयन है जो क्लासिक और एरोवाइज़्ड एफआरपी का समर्थन करता है।
 * ऑब्जर्वेबलकंप्यूटेशंस, एक क्रॉस-प्लेटफ़ॉर्म .NET कार्यान्वयन।
 * स्टेला एक अभिनेता-आधारित प्रतिक्रियाशील प्रोग्रामिंग भाषा है जो अभिनेताओं और रिएक्टरों के एक मॉडल को प्रदर्शित करती है जिसका उद्देश्य प्रतिक्रियाशील कोड के साथ अनिवार्य कोड के संयोजन के मुद्दों से बचना है (उन्हें अभिनेताओं और रिएक्टरों में अलग करके)। अभिनेता वितरित प्रतिक्रियाशील प्रणालियों में उपयोग के लिए उपयुक्त हैं।
 * ज्वारीयचक्र संगीत पैटर्न के लिए एक शुद्ध एफआरपी डोमेन विशिष्ट भाषा है, जो हास्केल (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा में एम्बेडेड है।

यह ध्यान देने योग्य है कि रिएक्टिवएक्स, अपने जावास्क्रिप्ट कार्यान्वयन आरएक्सजेएस द्वारा लोकप्रिय है, कार्यात्मक और प्रतिक्रियाशील है लेकिन कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग से अलग है।

यह भी देखें

 * वृद्धिशील कंप्यूटिंग
 * स्ट्रीम प्रोसेसिंग