البرمجة التفاعلية الوظيفية
البرمجة التفاعلية الوظيفية ( FRP ) هي نموذج برمجي للبرمجة التفاعلية ( برمجة تدفق البيانات غير المتزامنة ) باستخدام لبنات البرمجة الوظيفية الأساسية (مثل map و reduce و filter ). وقد استُخدمت FRP في برمجة واجهات المستخدم الرسومية (GUIs) والروبوتات والألعاب والموسيقى، بهدف تبسيط هذه المشكلات من خلال نمذجة الوقت بشكل صريح.
تركيبات الألياف المقواة بالبوليمر
يمكن العثور على الصيغة الأصلية للبرمجة التفاعلية الوظيفية في ورقة ICFP 97 بعنوان Functional Reactive Animation من تأليف كونال إليوت وبول هوداك . [ 1 ]
اتخذت البرمجة التفاعلية الوظيفية (FRP) أشكالاً عديدة منذ ظهورها عام 1997. أحد محاور هذا التنوع هو الدلالات المنفصلة مقابل الدلالات المتصلة. محور آخر هو كيفية تغيير أنظمة FRP ديناميكياً. [ 2 ]
مستمر
استخدمت الصيغة الأولى لبرمجة البرمجة الوظيفية دلالات متصلة، بهدف تجريد العديد من التفاصيل التشغيلية غير المهمة لمعنى البرنامج. [ 3 ] الخصائص الرئيسية لهذه الصيغة هي:
- نمذجة القيم التي تتغير على مدار الزمن المستمر، والتي تسمى "السلوكيات" وفي وقت لاحق "الإشارات".
- نمذجة " الأحداث " التي تحدث في نقاط زمنية منفصلة.
- يمكن تغيير النظام استجابةً للأحداث، وهو ما يُطلق عليه عمومًا اسم "التبديل".
- فصل تفاصيل التقييم مثل معدل أخذ العينات عن النموذج التفاعلي.
يُصاغ هذا النموذج الدلالي لبرمجة FRP في لغات خالية من الآثار الجانبية عادةً بدلالة الدوال المستمرة، وعادةً ما يكون ذلك عبر الزمن. [ 4 ] ويُشار إلى هذه الصياغة أيضًا باسم برمجة الزمن المستمر الدلالية (DCTP). [ 5 ]
منفصلة
تتطلب صيغ مثل البرمجة التفاعلية الوظيفية القائمة على الأحداث (Event-Driven FRP) وإصدارات Elm السابقة للإصدار 0.17 أن تكون التحديثات منفصلة وقائمة على الأحداث. [ 6 ] وقد دفعت هذه الصيغ نحو البرمجة التفاعلية الوظيفية العملية، مع التركيز على الدلالات التي تتميز بواجهة برمجة تطبيقات بسيطة يمكن تنفيذها بكفاءة في بيئة مثل الروبوتات أو في متصفح الويب. [ 7 ]
في هذه الصيغ، من الشائع دمج أفكار السلوكيات والأحداث في إشارات لها قيمة حالية دائماً، ولكنها تتغير بشكل منفصل. [ 8 ]
تفاعل FRP
لقد أشير إلى أن نموذج البرمجة الوظيفية التفاعلية التقليدي، من المدخلات إلى المخرجات، غير مناسب للبرامج التفاعلية. [ 9 ] قد يعني عدم القدرة على "تشغيل" البرامج ضمن عملية ربط من المدخلات إلى المخرجات ضرورة استخدام أحد الحلول التالية:
- أنشئ بنية بيانات من الإجراءات التي تظهر كمخرجات. يجب تشغيل هذه الإجراءات بواسطة مترجم أو بيئة خارجية. يرث هذا النظام جميع صعوبات نظام الإدخال/الإخراج المتدفق الأصلي في لغة هاسكل . [ 10 ]
- استخدم البرمجة التفاعلية الوظيفية الموجهة بالأسهم وقم بتضمين أسهم قادرة على تنفيذ الإجراءات. قد تمتلك هذه الإجراءات هويات، مما يسمح لها بالاحتفاظ بمخازن بيانات قابلة للتغيير بشكل منفصل، على سبيل المثال. هذا هو النهج الذي تتبعه مكتبة Fudgets [ 11 ] ، وبشكل أعم، دوال التدفق الأحادية [ 12 ] [ 13 ] .
- يتمثل النهج الجديد في السماح بتنفيذ الإجراءات الآن (في موناد الإدخال/الإخراج) ولكن تأجيل استلام نتائجها إلى وقت لاحق. [ 14 ] يستفيد هذا النهج من التفاعل بين موناد الحدث وموناد الإدخال/الإخراج، وهو متوافق مع برمجة تفاعلية وظيفية أكثر توجهاً نحو التعبيرات.
planNow :: Event ( IO a ) -> IO ( Event a )مشاكل التنفيذ
يوجد نوعان من أنظمة البرمجة الوظيفية التفاعلية (FRP): أنظمة الدفع وأنظمة السحب. تستقبل أنظمة الدفع الأحداث وتدفعها عبر شبكة إشارات لتحقيق نتيجة. أما أنظمة السحب، فتنتظر حتى يُطلب الحصول على النتيجة، ثم تعمل بشكل عكسي عبر الشبكة لاسترجاع القيمة المطلوبة.
تستخدم بعض أنظمة البرمجة التفاعلية الوظيفية، مثل Yampa، أسلوب أخذ العينات، حيث تقوم شبكة الإشارة بسحب العينات. لكن لهذا الأسلوب عيب: إذ يتعين على الشبكة الانتظار لمدة تصل إلى مدة خطوة حسابية واحدة للتعرف على التغييرات في المدخلات. يُعد أخذ العينات مثالاً على البرمجة التفاعلية الوظيفية القائمة على السحب.
قدمت مكتبتا Reactive وEtage على منصة Hackage منهجًا يُسمى FRP الدفعي-السحبي. في هذا المنهج، لا يتم إنشاء الحدث التالي في تدفق مُحدد بدقة (مثل قائمة أحداث ثابتة مع أوقاتها) إلا عند طلبه. تعمل هذه التدفقات المُحددة بدقة كقوائم كسولة في لغة Haskell . هذا هو الجزء القائم على السحب. أما الجزء القائم على الدفع فيُستخدم عند جلب أحداث خارجية عن النظام. تُدفع هذه الأحداث الخارجية إلى المستهلكين، ليتمكنوا من معرفة الحدث فور صدوره.
التطبيقات
توجد تطبيقات للعديد من لغات البرمجة ، بما في ذلك:
- Yampa عبارة عن تطبيق Haskell نقي وفعال ومُصمم باستخدام لغة Arrow مع دعم SDL و SDL2 و OpenGL و HTML DOM .
- كانت لغة Elm تدعم البرمجة التفاعلية الوظيفية [ 15 ]، ولكنها استبدلتها منذ ذلك الحين بنمط مختلف. [ 16 ]
- reflex هو تطبيق فعال لـ FRP بتقنية الدفع والسحب في Haskell مع مضيفات لـ DOM و SDL و Gloss.
- reactive-banana هو تطبيق FRP قائم على الدفع ومستقل عن الهدف في لغة Haskell.
- netwire و varying عبارة عن تطبيقات FRP موجهة بالأسهم في Haskell.
- Flapjax هو تطبيق FRP قائم على السلوك والحدث في JavaScript .
- React هي وحدة OCaml للبرمجة التفاعلية الوظيفية.
- Sodium هو تطبيق FRP للدفع مستقل عن إطار عمل واجهة المستخدم (UI) المحدد للعديد من اللغات، مثل Java و TypeScript و C# . [ 17 ]
- Dunai هو تطبيق سريع في Haskell باستخدام وظائف التدفق الأحادي [ 13 ] التي تدعم FRP الكلاسيكية و Arrowized.
- ObservableComputations، تطبيق متعدد المنصات لـ .NET .
- ستيلا هي لغة برمجة تفاعلية قائمة على نموذج الممثل ، تُجسد نموذجًا للممثلين والمتفاعلات، بهدف تجنب مشاكل دمج التعليمات البرمجية الإجرائية مع التعليمات البرمجية التفاعلية (عن طريق فصلهما في ممثلين ومتفاعلات). [ 18 ] يُعد الممثلون مناسبين للاستخدام في الأنظمة التفاعلية الموزعة. [ 19 ]
- TidalCycles هي لغة برمجة تفاعلية بحتة خاصة بمجال الأنماط الموسيقية، مضمنة في لغة Haskell .
ReactiveX ، التي اشتهرت بفضل تطبيقها بلغة JavaScript RxJS ، هي لغة وظيفية وتفاعلية ولكنها تختلف عن البرمجة الوظيفية التفاعلية. [ 20 ]
انظر أيضاً
مراجع
- ↑ إليوت، كونال؛ هوداك، بول. "الرسوم المتحركة التفاعلية الوظيفية" . الرسوم المتحركة التفاعلية الوظيفية . المؤتمر الدولي للرسوم المتحركة التفاعلية 1997. تم الاطلاع عليه بتاريخ 14 يوليو 2018 .
- ↑ نيلسون، هنريك؛ كورتني، أنتوني؛ بيترسون، جون (فبراير 2011) [2002]، "البرمجة التفاعلية الوظيفية، متابعة"، ورشة عمل هاسكل (PDF)
- ↑ إليوت، كونال؛ هوداك، بول (1997)، "الرسوم المتحركة التفاعلية الوظيفية" ، المؤتمر الدولي للرسوم المتحركة الوظيفية
- ↑ كورتني، أنتوني؛ إليوت، كونال (فبراير 2011) [2001]، "واجهات مستخدم وظيفية حقًا" ، ورشة عمل هاسكل ، جامعة ييل
- ↑ إليوت، كونال (2014)، "التصميم الدلالي" (ملف PDF) ، لامبدا جام ، تم الاطلاع عليه في 5 مايو 2023
- ↑ طه، وليد؛ وان، زانيونغ؛ هوداك، بول (2002)، "برمجة FRP الموجهة بالأحداث"، PADL (ملف PDF) ، جامعة ييل، مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 28-09-2013 ، تم الاطلاع عليه بتاريخ 23-09-2013
- ↑ تشابليكي، إيفان؛ تشونغ، ستيفن (2013)، "البرمجة التفاعلية الوظيفية غير المتزامنة لواجهات المستخدم الرسومية" ، PLDI ، جامعة هارفارد
- ↑ وان، زان يونغ؛ طه، وليد؛ هوداك، بول (فبراير 2011)، "برمجة FRP في الوقت الحقيقي"، ICFP (ملف PDF) ، مؤرشف من النسخة الأصلية (PDF) بتاريخ 28-09-2013 ، تم الاطلاع عليه بتاريخ 23-09-2013
- ↑ إليوت، كونال (9 ديسمبر 2008). "لماذا لا يتناسب البرمجة الوظيفية التفاعلية الكلاسيكية مع السلوك التفاعلي" . مؤرشف من الأصل في 12 أكتوبر 2022.
- ↑ بورنينج، آلان. "الإدخال والإخراج في اللغات الوظيفية البحتة" (ملف PDF) . مؤرشف (ملف PDF) من الأصل بتاريخ 28-04-2022.
- ↑ كارلسون، ماغنوس؛ هالغريين، توماس (1998). "الخوارزميات - عمليات وظيفية بحتة مع تطبيقات على واجهات المستخدم الرسومية" (ملف PDF) . مؤرشف (ملف PDF) من الأصل بتاريخ 15-10-2022.
- ↑ بيريز، إيفان؛ بارينز، مانويل؛ نيلسون، هنريك (يوليو 2016)، "البرمجة التفاعلية الوظيفية، المعاد هيكلتها"، ندوة هاسكل (PDF)
- 1 2 "Data.MonadicStreamFunction" . Hackage . تم الاسترجاع في 30-08-2025 .
- ^ أتسي فان دير بلويج. كلاسين، كوين. "FRP المبدئي العملي" (PDF) . مؤرشف من الأصل (PDF) بتاريخ 2015-07-01 . تم الاسترجاع 2015/07/24 .
- ↑ تشابليكي، إيفان (أبريل 2012)، إلم: البرمجة التفاعلية الوظيفية المتزامنة لواجهات المستخدم الرسومية الوظيفية (ملف PDF) (أطروحة)، جامعة هارفارد، مؤرشفة من الأصل (ملف PDF) بتاريخ 4 يونيو 2016 ، تم الاطلاع عليها بتاريخ 17 فبراير 2015
{{citation}}: CS1 maint: موقع الناشر مفقود ( رابط ) - ↑ تشابليكي، إيفان. "وداعًا لـ FRP" . elm . تم الاسترجاع في 14 يوليو 2018 .
- ↑ "مكتبة Sodium FRP على Github" . تم الاطلاع عليها في 5 أكتوبر 2024 .
- ↑ فان دن فوندر، سام؛ رينو، تييري؛ أويين، بيارنو؛ دي كوستر، جويري؛ دي موتر، وولفغانغ (2020)، "معالجة الفريق المحرج للبرمجة التفاعلية: نموذج الممثل-المفاعل"، وقائع لايبنيز الدولية في المعلوماتية (LIPIcs) ، المجلد 166، الصفحات 19:1–19:29، doi : 10.4230/LIPIcs.ECOOP.2020.19 ، ISBN 9783959771542، S2CID 260445152
- ↑ فان دن فوندر، سام؛ رينو، تييري؛ دي موتر، وولفغانغ (2022)، "التفاعلية على مستوى الطوبولوجيا في البرامج التفاعلية الموزعة: إدارة المعارف التفاعلية باستخدام الأسراب"، فن وعلم وهندسة البرمجة ، المجلد 6، الصفحات 14:1-14:36، arXiv : 2202.09228 ، doi : 10.22152/programming-journal.org/2022/6/14 ، S2CID 246979565
- ↑ "ReactiveX" . ReactiveX.io . تم الاطلاع عليه في 3 يوليو 2022 .
- البرمجة الوظيفية
- استراتيجية التقييم
