# برمجة تدفقية

تعد برمجة تدفقية (إف بي بّي)، في برمجة الحاسوب، نمطًا برمجيًا يعرف التطبيقات على أنها شبكات من عمليات «الصندوق الأسود»، تتبادل البيانات عبر اتصالات محددة مسبقًا عن طريق تمرير الرسائل، إذ تحدد اتصالات العمليات خارجيًا. يمكن إعادة توصيل عمليات الصندوق الأسود هذه إلى ما لا نهاية لتشكيل تطبيقات مختلفة دون الحاجة إلى التغيير الداخلي. وبالتالي تعد البرمجة القائمة على التدفق موجهه بالمكونات بشكل طبيعي.
تعد البرمجة القائمة على التدفق نوع خاص من أنواع برمجة تدفق البيانات القائمة على المخازن المؤقتة المحدودة، وحزم المعلومات ذات الأعمار الافتراضية المحددة، والمنافذ المسماة والتعريف المنفصل للاتصالات.

## مفاهيم

يوضح المخطط البياني التالي الكيانات الرئيسية لمخطط البرمجة القائمة على التدفق (باستثناء حزم المعلومات). يمكن تحويل هذا المخطط البياني مباشرةً إلى قائمة اتصالات، ويمكن بعد ذلك تنفيذها بواسطة محرك مناسب (برنامج أو جهاز).
مخطط بسيط للبرمجة القائمة على التدفق
تعد A وB وC عمليات تنفذ مكونات الكود. وO1 وO2 وIN منافذ تربط الوصلات M وN بالعمليات الخاصة بكل منهما. يُسمح للعمليتان B وC بتنفيذ نفس الكود، لذلك يجب أن يكون لكل عملية مجموعتها الخاصة من مخازن العمل وكتل التحكم وغيرها. تعد العمليتان B وC حرتان في استخدام نفس أسماء المنافذ، سواء تشاركت الكود أم لا، لأن أسماء المنافذ تملك معنى داخل المكونات التي تشير إليها فقط (وعلى مستوى الشبكة طبعًا).
يشار إلى M وN غالبًا باسم «المخازن المؤقتة المحدودة»، وتملكان سعة ثابتة من حيث عدد حزم المعلومات التي يمكن أن يحتفظا بها في أي وقت.
يسمح مفهوم المنافذ باستخدام نفس المكون في أكثر من مكان في الشبكة. تزود المنافذ البرمجة القائمة على التدفق، إلى جانب قابلية وضع البارمترات، المسماة حزم المعلومات الأولية (آي آي بّي)، بإمكانية إعادة استخدام المكون، ما يجعل البرمجة القائمة على التدفق بنية قائمة على المكونات. وهكذا تظهر البرمجة القائمة على التدفق ما أطلق عليه راؤول دي كامبو ونيت إدواردز من شركة آي بي إم ريسيرش نمطية قابلة للتهيئة.
تخصص حزم المعلومات أو آي بّي في ما يمكن تسميته «مساحة آي بّي» (تمامًا كما تخصص تعديدات ليندا في «مساحة التعديد»)، ولها عمر افتراضي محدد جيدًا حتى تحذف وتستعاد مساحتها- يجب أن يكون هذا الإجراء في البرمجة القائمة على التدفق واضحًا من جانب عملية التملك. تشكل حزم المعلومات التي تنتقل عبر اتصال معين (تنتقل «معرفاتها» في الواقع) «تدفقًا»، يولد ويستهلك بشكل غير متزامن- وبالتالي يتشابه هذا المفهوم مع مفهوم التثمين الكسول الموصوف في مقالة فريدمان ووايز لعام 1976.
تكون حزم المعلومات عادةً عبارة عن أجزاء منظمة من البيانات- ومع ذلك، قد لا تحتوي بعض حزم المعلومات على أي بيانات حقيقية، ولكنها تستخدم ببساطة كإشارات. ومن الأمثلة على ذلك «حزم المعلومات ذات الأقواس»، التي يمكن استخدامها لتجميع حزم معلومات البيانات في أنماط متسلسلة داخل التدفق، تسمى «التدفقات الفرعية». قد تكون التدفقات الفرعية بدورها متداخلة. يمكن أيضًا ربط حزم المعلومات معًا لتشكيل «شجرات حزم معلومات»، والتي تنتقل عبر الشبكة ككائنات مفردة.
يمكن «تشعيب» نظام التوصيلات والعمليات الموصوفة أعلاه إلى أي حجم. ويمكن إضافة عمليات المراقبة بين أزواج من العمليات، في أثناء تطوير أحد التطبيقات، ويمكن «تجزئة» العمليات إلى شبكات فرعية، أو يمكن استبدال محاكاة العمليات بمنطق العملية الحقيقي. لذلك تفسح البرمجة القائمة على التدفق المجال للنماذج الأولية السريعة.
تعد هذه في الحقيقة صورة خط تجميع لمعالجة البيانات: يمكن اعتبار حزم المعلومات التي تنتقل عبر شبكة من العمليات على أنها أدوات تنتقل من محطة إلى محطة في خط تجميع. يمكن إعادة توصيل «الآلات» بسهولة، وفصلها عن الخط لإصلاحها، واستبدالها وغيره. ومن الغريب أن هذه الصورة تشبه جدًا صورة معدات تسجيل الوحدات المستخدمة لمعالجة البيانات قبل وقت أجهزة الحاسوب، باستثناء أنه كان يجب حمل مجموعات البطاقات يدويًا من جهاز إلى آخر.
قد تكون تطبيقات البرمجة القائمة على التدفق غير استباقية أو استباقية- إذ تميل التطبيقات السابقة إلى أن تكون غير استباقية (حاسوب فائق ولغة سي)، في حين أن تطبيقات جافا الأخيرة (انظر أدناه) تستخدم صنف خيط جافا وهي استباقية.

## أمثلة
### مسألة الإرسال

تشكل مكونات البرمجة القائمة على التدفق غالبًا أزواجًا متكاملة. يستخدم هذا المثال اثنين من هذه الأزواج. تبدو المسألة الموصوفة بسيطة للغاية عند وصفها بالكلمات، ولكن في الواقع يصعب تحقيقها للغاية باستخدام المنطق الإجرائي الاعتيادي. وظيفة هذه المهمة، المسماة «مسألة الإرسال»، التي وصفها أصلًا بيتر ناور، هي كتابة برنامج يقبل سطور النص ويولد سطور إخراج تحتوي على أكبر عدد ممكن من الكلمات، بحيث لا يتجاوز عدد الأحرف في كل سطر طولًا معينًا. لا يجوز تقسيم الكلمات ونفترض عدم وجود كلمة أطول من حجم سطور الإخراج. وهي تشابه مسألة التفاف الكلمات في برامج تحرير النصوص.
في المنطق الاعتيادي، يكتشف المبرمج بسرعة أنه لا يمكن استخدام هياكل الإدخال أو الإخراج لتوجيه التسلسل الهرمي لنداءات تدفق التحكم. ومن ناحية أخرى، يشير وصف المسألة في البرمجة القائمة على التدفق نفسه إلى حل:
* تذكر «الكلمات» صراحةً في وصف المسألة، لذا يعقل أن يتعامل المصمم مع الكلمات على أنها حزم معلومات
* لا يوجد في البرمجة القائمة على التدفق تسلسل هرمي واحد للنداءات، لذلك لا يميل المبرمج إلى فرض نمط فرعي للحل ليكون أعلى مستوى.
فيما يلي الحل الأكثر طبيعية في البرمجة القائمة على التدفق (لا يوجد حل «صحيح» واحد في البرمجة القائمة على التدفق، ولكن يبدو أن هذا مناسب بشكل طبيعي):
تشير العمليتان DC و RC إلى «التحليل» و«إعادة التركيب»، على التوالي.
كما ذكر أعلاه، يمكن استخدام حزم المعلومات الأولية لتحديد المعلومات البارامترية مثل طول سجل الإخراج المطلوب (المطلوب من المكونين في أقصى اليمين)، أو أسماء الملفات. تعد حزم المعلومات الأولية أجزاء بيانات مرتبطة بمنفذ في تعريف الشبكة والتي تصبح حزم معلومات «عادية» عند إصدار «استقبال» للمنفذ ذي الصلة.