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

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

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

निरंतर

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


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

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

असतत

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

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

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

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

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

कार्यान्वयन

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

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

यह भी देखें

 * इंक्रीमेंटल कंप्यूटिंग
 * स्ट्रीम प्रोसेसिंग