در برنامه نویسی کامپیوتر و **برنامه نویسی مبتنی برجریان**(به انگلیسی: Flow-Based Programming) **(FBP)** یک پارادایم برنامه نویسی است که برنامه رابه عنوان شبکه‌های فرایندهای «جعبه سیاه» تعریف می‌کند، که با انتقال پیام داده‌ها را از طریق اتصال از پیش تعریف شده رد و بدل می‌کند. در جایی که اتصالات به‌طور مستقیم به فرایندها مشخص می‌شود، این فرایندهای جعبه سیاه را می‌توان بی وقفه به برنامه‌های مختلف وصل کرد بدون اینکه در داخل تغییر کند؛ بنابراین FBP به‌طور طبیعی محور جزء است.

یک شکل خاص از برنامه نویسی جریان FBP داده‌است که براساس بافرهای محدود، بسته‌های اطلاعاتی با طول عمر تعریف شده، بنادر نام گذاری شده و تعریف جداگانه‌ای از اتصالات است.

مقدمه
-----

برنامه نویسی مبتنی بر جریان با استفاده از استعاره
یک «کارخانه داده» برنامه‌ها را تعریف می‌کند.

این یک برنامه را نه به عنوان یک فرایند متوالی واحد، که در یک نقطه از زمان شروع می‌شود، مشاهده می‌کند و سپس یک کار رابه طور همزمان انجام می‌دهد تا اینکه به پایان برسد، بلکه به عنوان شبکه ای از فرایندهای ناهمزمان که با استفاده از جریان‌های بخش‌های داده ساختاری ارتباط برقرار می‌کنند، «بسته‌های اطلاعاتی» (IP) نامیده می‌شود.

در این نمای، تمرکز برروی داده‌های برنامه و تحولات اعمال شده برروی آن برای تولید خروجی‌های مورد نظر است.

این شبکه به صورت بیرونی به فرایندها تعریف می‌شود، به عنوان لیستی از اتصالات که توسط یک قطعه نرم‌افزار تفسیر می‌شود، معمولاً به عنوان «برنامه‌ریز» نامیده می‌شود.

از آنجا که فرایندهای FBP معمولاً در مدت زمان کمتری نسبت به برنامه‌های معمولی اجرا می‌کنند، واستفاده بهینه از تمام پردازنده‌های موجود در دستگاهارا انجام می‌دهند، بدون برنامه نویسی خاص مورد نیاز است.

برای رسیدن به این هدف تعریف شبکه معمولاً دیاگرامی است ودر برخی از زبان‌ها یا نمادهای سطح پایین به لیست اتصال تبدیل می‌شود.

FBPاغلب یک زبان برنامه نویسی بصری در این سطح است.

تعاریف پیچیده‌تر شبکه دارای ساختار سلسله مراتبی است که از زیر شبکه‌هایی با اتصالات «چسبنده» ساخته می‌شود.

بسیاری از زبان‌ها زبان‌های دیگر مبتنی برجریان در اطراف زبان‌های برنامه نویسی سنتی تر ساخته شده‌اند

که قابل توجه‌ترین نمونه آن raftlib است که اپراتورهای شبیه به c++ stream برای مشخص کردن نمودار جریان استفاده می‌کند.

FBP دارای نقاط مشترک زیادی با لیندا زبان در آن است که، در Gelernter و Carriero در است اصطلاحات، "زبان هماهنگی": آن است که اساساً مستقل از زبان. در واقع، با توجه به یک برنامه ریز که به زبان کافی سطح پایین نوشته شده‌است، مؤلفه‌هایی که به زبان‌های مختلف نوشته شده‌اند می‌توانند در یک شبکه واحد به هم وصل شوند؛ بنابراین FBP خود را به مفهوم زبانهای خاص دامنه یا «مینی زبان‌ها» وام می‌دهد.

FBP نمایشگاه «اتصال داده» را دارد که در مقاله مربوط به اتصال به عنوان سست‌ترین نوع اتصال بین اجزا توضیح داده شده‌است. مفهوم اتصال سست به نوبه خود به معماری‌های سرویس گرا مربوط می‌شود و FBP با تعدادی از معیارهای چنین معماری متناسب است، البته در سطح ریزتر و ظریف تر از بسیاری از نمونه‌های این معماری.

FBP ویژگی‌های سطح بالا و عملکردی را ارائه می‌دهد که استدلال در مورد رفتار سیستم را ساده می‌کند. نمونه ای از این مدل توزیع داده‌های توزیع شده برای توصیف سازنده و تجزیه و تحلیل معنایی پروتکل‌های چند حزبی توزیع شده‌است.

تاریخ
-----

برنامه نویسی مبتنی بر جریان توسط جی پائول موریسون در اوایل دهه ۱۹۷۰ اختراع شد، و در ابتدا به صورت نرم‌افزاری برای یک بانک کانادایی اجرا شد. [4] FBP در بدو تأسیس، به شدت تحت تأثیر برخی زبانهای شبیه‌سازی IBM در دوره، به ویژه GPSS قرار داشت، اما ریشه‌های آن به‌طور کلی به مقالهٔ اصلی Conway بر روی آنچه که او کوروتین می‌نامید، بازمی‌گردد.

FBP طی سال‌ها دستخوش تغییراتی در نام‌ها شده‌است: اجرای اصلی با نام AMPS (Advanced پردازش مدولار پیشرفته) نامگذاری شده‌است. در سال ۱۹۷۵ یکی از برنامه‌های بزرگ در کانادا به‌طور زنده اجرا شد و از سال ۲۰۱۳ تقریباً ۴۰ سال است، که در حال استفاده مداوم از تولید است و روزانه در حال اجرا است. از آنجا که IBM ایده‌های پشت FBP را «خیلی شبیه به یک قانون طبیعت» می‌داند قابل ثبت است، آنها در عوض مفاهیم اصلی FBP را با استفاده از یک بولتن افشای فنی «اطلاعات پاسخگو مدولار، سیستم برنامه نویسی وظیفه بین‌المللی» در حوزه عمومی قرار می‌دهند. [۶] در سال ۱۹۷۱. [۴] مقاله ای که مفاهیم و تجربه آن را با استفاده از آن شرح می‌دهد، در سال ۱۹۷۸ در مجله IBM Research IBM Systems با نام DSLM منتشر شد. [۷] اجرای دوم به عنوان یک پروژه مشترک IBM کانادا و IBM Japan با نام Manager Development Data"(DFDM انجام شد و مدت کوتاهی در اواخر دهه۸۰ با نام «مدیر برنامه نویسی جریان داده» در ژاپن به بازار عرضه شد.

به‌طور کلی مفاهیم درون IBM به عنوان «جریان داده» نامیده می‌شدند، اما به نظر می‌رسید این اصطلاح خیلی کلی است و در نهایت نام «برنامه نویسی مبتنی بر جریان» پذیرفته شد.

از اوایل دهه ۸۰ تا ۱۹۹۳ ج. پاول موریسون و معمار IBM وین استیونس مفاهیم پشت FBP را اصلاح و تبلیغ کردند. استیونز چندین مقاله برای توصیف و پشتیبانی از مفهوم FBP نوشت، و مطالب مربوط به آن را در چندین کتاب خود درج کرد. [۸] [۹] [۱۰]. در سال ۱۹۹۴ موریسون کتابی را منتشر کرد که توصیف FBP و ارائه شواهد تجربی مبنی بر اینکه FBP منجر به کاهش زمان توسعه شده‌است.

مفاهیم
------

نمودار زیر اشخاص اصلی نمودار FBP (جدا از بسته‌های اطلاعات) را نشان می‌دهد. چنین نمودار می‌تواند به‌طور مستقیم به لیستی از اتصالات تبدیل شود، که می‌تواند توسط یک موتور مناسب (نرم‌افزار یا سخت‌افزار) اجرا شود.

 نمودار ساده FBP
A، B و C فرایندهایی هستند که اجزای کد را اجرا می‌کنند. O1، O2 و دو IN پورتهایی هستند که اتصالات M و N را به فرآیندهای مربوطه آن‌ها وصل می‌کنند. اجرای پروسه‌های B و C مجاز است که همان کد را اجرا کنند، بنابراین هر فرایند باید مجموعه ای از ذخیره‌سازی کار، بلوک‌های کنترل و غیره را داشته باشد، چه اینکه آنها دارای کد اشتراکی هستند یا نه، B و C می‌توانند از همان درگاه استفاده کنند. نام‌ها، به عنوان نام بندر فقط در اجزای ارجاع دهنده آن‌ها معنی دارند (و البته در سطح شبکه).

M و N آنهایی هستند که اغلب به آن‌ها «بافرهای محدود» گفته می‌شود و از نظر تعداد IPهایی که می‌توانند در هر نقطه از زمان داشته باشند از ظرفیت ثابت برخوردار هستند.

M و N آنهایی هستند که اغلب به آن‌ها «بافرهای محدود» گفته می‌شود و از نظر تعداد IPهایی که می‌توانند در هر نقطه از زمان داشته باشند از ظرفیت ثابت برخوردار هستند.

مفهوم پورت‌ها همان چیزی است که امکان استفاده از همان مؤلفه را در بیش از یک مکان شبکه می‌دهد. درگاه‌ها در ترکیب با توانایی پارامتریزاسیون، به نام بسته‌های اطلاعات اولیه (IIPs) , FBP را با قابلیت استفاده مجدد از کامپوننت‌ها فراهم می‌کنند و FBP را به یک معماری مبتنی بر مؤلفه تبدیل می‌کنند؛ بنابراین FBP آنچه رائول دو کامپو و نیت ادواردز از IBM Research از ماژولاریتی قابل تنظیم نام برده‌اند، نمایش می‌دهد.

M و N آنهایی هستند که اغلب به آن‌ها «بافرهای محدود» گفته می‌شود و از نظر تعداد IPهایی که می‌توانند در هر نقطه از زمان داشته باشند از ظرفیت ثابت برخوردار هستند. مفهوم پورت‌ها همان چیزی است که امکان استفاده از همان مؤلفه را در بیش از یک مکان شبکه می‌دهد. درگاه‌ها در ترکیب با توانایی پارامتریزاسیون، به نام بسته‌های اطلاعات اولیه (IIPs) , FBP را با قابلیت استفاده مجدد از کامپوننت‌ها فراهم می‌کنند و FBP را به یک معماری مبتنی بر مؤلفه تبدیل می‌کنند؛ بنابراین FBP آنچه رائول دو کامپو و نیت ادواردز از IBM Research از ماژولاریتی قابل تنظیم نام برده‌اند، نمایش می‌دهد.

IPها معمولاً تکه داده‌های ساختاری هستند - برخی IPها ممکن است دارای هیچ داده واقعی نباشند، اما فقط به عنوان سیگنال مورد استفاده قرار می‌گیرند. نمونه ای از این "IPهای براکت" است، که می‌تواند برای گروه‌بندی IP داده‌های داده‌ها به الگوهای پی در پی در یک جریان به نام "substreams" استفاده شود. substreams ممکن است به نوبه خود لانه باشد. همچنین ممکن است IPها به صورت زنجیر ساخته شوند تا "درختان IP" (IP IP) ایجاد شوند، که از طریق شبکه به عنوان اشیاء مجزا سفر می‌کنند.

سیستم اتصالات و فرآیندهای ذکر شده در بالا می‌تواند به هر اندازه «اصلاح» شود. در حین تهیه یک برنامه، فرایندهای نظارت ممکن است بین جفت فرایندها اضافه شوند، فرآیندهای ممکن است «منفجر شوند» به زیر شبکه‌ها، یا شبیه‌سازی فرایندها ممکن است با منطق فرایند واقعی جایگزین شوند؛ بنابراین FBP خود را به نمونه سازی سریع تبدیل می‌کند.

این واقعاً یک تصویر خط مونتاژ از پردازش داده‌ها است: ممکن است IPهایی که از طریق شبکه‌ای از پردازش‌ها عبور می‌کنند، به عنوان ابزارهای مسافرتی از ایستگاه به ایستگاه در یک خط مونتاژ در نظر گرفته شوند. «ماشین آلات» ممکن است به راحتی وصل شود، خط را برای تعمیر، تعویض و موارد دیگر از بین برد. به اندازه کافی عجیب و غریب، این تصویر بسیار شبیه به تجهیزات ضبط واحد است که برای پردازش داده‌ها قبل از روزهای رایانه‌ها استفاده می‌شد، به جز این که باید برگه‌های کارت از یک دستگاه به دستگاه دیگر حمل شود.

این واقعاً یک تصویر خط مونتاژ از پردازش داده‌ها است: ممکن است IPهایی که از طریق شبکه ای از پردازش‌ها عبور می‌کنند، به عنوان ابزارهای مسافرتی از ایستگاه به ایستگاه در یک خط مونتاژ در نظر گرفته شوند. «ماشین آلات» ممکن است به راحتی وصل شود، خط را برای تعمیر، تعویض و موارد دیگر از بین برد. به اندازه کافی عجیب و غریب، این تصویر بسیار شبیه به تجهیزات ضبط واحد است که برای پردازش داده‌ها قبل از روزهای رایانه‌ها استفاده می‌شد، به جز این که باید برگه‌های کارت از یک دستگاه به دستگاه دیگر حمل شود.

اجرای FBP ممکن است غیر پیشگیرانه یا پیشگیرانه باشد - اجرای‌های قبلی تمایل به پیشگیری (زبان اصلی و زبان C) ندارند، در حالی که آخرین اجرای جاوا (زیر را ببینید) از کلاس Java Thread استفاده می‌کند و پیشگیرانه است.

مثال‌ها
-------

اجزای FBP اغلب جفت‌های مکمل را تشکیل می‌دهند. در این مثال از دو جفت مشابه استفاده شده‌است. مشکلی که شرح داده شد بسیار ساده به نظر می‌رسد همان‌طور که در کلمات شرح داده شده‌است، اما در واقع تحقق آن با استفاده از منطق رویه معمولی به طرز شگفت‌آور دشوار است. وظیفه موسوم به «مسئله تلگرام» که در ابتدا توسط پیتر نئور توصیف شده‌است، نوشتن برنامه ای است که خطوط متن را می‌پذیرد و خطوط خروجی را با حداکثر کلمه تولید می‌کند، جایی که تعداد کاراکترهای هر سطر از حد خاصی تجاوز نمی‌کند. طول ممکن است کلمات تقسیم نشوند و تصور می‌کنیم هیچ کلمه‌ای بیش از اندازه خطوط خروجی نیست. این شبیه به مشکل بسته‌بندی کلمه در ویراستاران متن است.

در منطق متعارف، برنامه نویس به سرعت متوجه می‌شود که نه ورودی و نه سازه‌های خروجی نمی‌توانند برای هدایت سلسله مراتب تماس جریان کنترل استفاده شوند. در FBP، از طرف دیگر، توصیف مسئله خود یک راه حل را پیشنهاد می‌کند:

* «کلمات» به صراحت در توصیف مسئله ذکر شده‌است، بنابراین برای طراح منطقی است که کلمات را به عنوان بسته‌های اطلاعاتی (IP) رفتار کند.
* در FBP هیچ سلسله مراتبی برای تماس وجود ندارد، بنابراین برنامه نویس وسوسه نمی‌شود که یک الگوی فرعی از راه حل را وادار کند تا سطح عالی باشد.

در اینجا طبیعی‌ترین راه حل در FBP وجود دارد (هیچ راه حل تنها «صحیح» در FBP وجود ندارد، اما به نظر می‌رسد این یک مناسب طبیعی است):

 «مشکل تلگرام» پیتر نور
همان‌طور که گفته شد، بسته‌های اطلاعات اولیه (IIP) می‌توانند برای مشخص کردن اطلاعات پارامتری از قبیل طول ضبط خروجی مورد نظر (مورد نیاز توسط دو مؤلفه مناسب) یا نام پرونده‌ها استفاده شوند. IIPها بخش‌هایی از داده‌های مرتبط با یک درگاه در تعریف شبکه هستند که وقتی «دریافت» برای درگاه مربوط صادر می‌شود، IPهای «عادی» می‌شوند.

### بروزرسانی دسته ای

این نوع برنامه شامل ارسال پرونده ای از «جزئیات» (تغییر، اضافه کردن و حذف) در برابر «پرونده اصلی»، و تولید (حداقل) یک پرونده استاد به روز شده و یک یا چند گزارش است. برنامه‌های به روز رسانی با استفاده از کد همگام و رویه ای بسیار سخت است، زیرا دو جریان ورودی (گاهی اوقات بیشتر) باید همزمان شوند، حتی اگر ممکن است استادان بدون جزئیات مربوطه وجود داشته باشند، یا برعکس.

 ساختار "به روز رسانی دسته ای" متعارف
در FBP، یک جزء قابل استفاده مجدد (Collate)، بر اساس ایده ضبط واحد از یک Collator، نوشتن این نوع برنامه را بسیار آسان‌تر می‌کند زیرا Collate ادغام دو جریان را وارد می‌کند و IPهای براکت را وارد می‌کند تا سطح گروه‌بندی را نشان دهد، به‌طور قابل توجهی منطق پایین دست را ساده می‌کند. فرض کنید یک جریان ("استادان" در این حالت) از IPهایی با مقادیر اصلی ۱، ۲ و ۳ تشکیل شده و IPهای جریان دوم ("جزئیات") دارای مقادیر اصلی ۱۱، ۱۲، ۲۱، ۳۱، ۳۲، ۳۳ هستند و ۴۱، که در آن رقم اول با مقادیر اصلی کلید مطابقت دارد. با استفاده از شخصیت‌های براکت برای نشان دادن IPهای "براکت"، جریان خروجی جمع شده به شرح زیر خواهد بود:

```
 (m1 d11 d12) (m2 d21) (m3 d31 d32 d33) (d41)
```

Collate یک جعبه سیاه قابل استفاده مجدد است که فقط باید بدانید که زمینه‌های کنترل در IPهای ورودی آن (حتی این امر کاملاً ضروری نیست زیرا می‌توان فرآیندهای ترانسفورماتور را در بالادست برای قرار دادن فیلدهای کنترل در مکانهای استاندارد قرار داد) و در واقع قابل تعمیم است. به هر تعداد جریان ورودی و هر عمق لانه لنگه. Collate از یک پورت از نوع آرایه برای ورودی استفاده می‌کند و تعداد متغیر جریان ورودی را در اختیار شما قرار می‌دهد.

برنامه نویسی مبتنی بر جریان از multiplexing فرایند به روشی بسیار طبیعی پشتیبانی می‌کند. از آنجا که مؤلفه‌ها فقط خواندنی هستند، هر تعداد از اجزای معین ("فرآیندها") می‌توانند بطور غیر همزمان همزمان با یکدیگر اجرا شوند.

 نمونه ای از چند برابر
هنگامی که رایانه‌ها معمولاً دارای یک پردازنده واحد بودند، وقتی I / O زیادی در حال انجام بود، این کار مفید است. اکنون که ماشین‌ها معمولاً دارای چندین پردازنده هستند، وقتی پردازش‌ها با CPU فشرده باشند نیز شروع به کار می‌کنند. نمودار در این بخش یک فرایند "Load Balancer" را نشان می‌دهد که داده‌ها را بین ۳ فرایند، با علامت S1، S2 و S3 توزیع می‌کند، به ترتیب، که نمونه‌های یک جزء واحد هستند، که به نوبه خود به یک فرایند واحد در "اول" می‌خورند. برای اولین بار خدمت کرده‌است "اساس.

### شبکه تعاملی ساده

 شماتیک برنامه کاربردی تعاملی عمومی
در این نمودار کلی، درخواست‌ها (معاملات) که از طرف کاربران صورت می‌گیرد، در سمت چپ بالای نمودار وارد می‌شوند و پاسخ‌ها در پایین سمت چپ بازگردانده می‌شوند. «پشت به پایان می‌رسد» (در سمت راست) با سیستم‌های دیگر سایت‌ها ارتباط برقرار می‌کند، به عنوان مثال با استفاده از CORBA , MQSeries و غیره. اتصالات متقابل نشان دهنده درخواستهایی است که نیازی به مراجعه به انتهای پشتی ندارند، یا درخواستهایی که باید بیش از یک بار قبل از بازگشت به کاربر، از طریق شبکه چرخش کنند.

از آنجا که درخواست‌های مختلف ممکن است از بک‌های مختلف استفاده کند، و ممکن است برای پردازش آنها مقادیر زمانی متفاوتی برای بک گراندها (در صورت استفاده) نیاز داشته باشد، باید مقدماتی فراهم شود تا داده‌های برگشتی را با معاملات درخواست کننده مناسب، به عنوان مثال جداول هش یا انبارها مرتبط کند.

نمودار فوق بصورت شماتیک شماتیکی است به این معنی که برنامه نهایی ممکن است حاوی فرآیندهای بسیار بیشتری باشد: ممکن است فرآیندهای دیگری برای مدیریت انبارها، نمایش ترافیک اتصال، نظارت بر توان و غیره در بین فرآیندهای دیگر درج شوند. همچنین بلوک‌های موجود در نمودار ممکن است «زیر شبکه» باشد - شبکه‌های کوچک با یک یا چند اتصالات باز.

مقایسه با سایر پارادایم‌ها و روش‌ها
-----------------------------------

### برنامه نویسی ساختار یافته جکسون (JSP) و توسعه سیستم جکسون (JSD)

این روش فرض می‌کند که یک برنامه باید به عنوان یک سلسله مراتب رویه ای واحدهای فرعی ساخته شود. نقطه شروع آن توصیف برنامه به عنوان مجموعه ای از "خطوط اصلی"، بر اساس ساختار داده‌های ورودی و خروجی است. سپس یکی از این "خطوط اصلی" برای هدایت کل برنامه انتخاب می‌شود و سایر موارد برای تبدیل آنها به زیرآبی (از این رو نام "وارونگی جکسون") باید "وارونه" شوند. این بعضی اوقات منجر به آنچه که "برخورد" می‌شود، می‌شود که این برنامه به چندین برنامه یا کارنتین تقسیم شود. هنگام استفاده از FBP، این فرایند وارونگی لازم نیست، زیرا هر مؤلفه FBP را می‌توان یک "خط اصلی" جداگانه در نظر گرفت.

FBP و JSP مفهوم درمان یک برنامه (یا برخی مؤلفه‌ها) را به عنوان تجزیه کننده جریان ورودی به اشتراک می‌گذارند.

در کار بعدی جکسون، یعنی توسعه سیستم جکسون (JSD)، ایده‌ها بیشتر توسعه یافت.

در JSD، طراحی به عنوان یک طراحی شبکه تا مرحله اجرای نهایی حفظ می‌شود. سپس این مدل به تعداد پردازنده‌های متوالی به تعداد پردازنده‌های موجود تبدیل می‌شود. جکسون در بخش ۱٫۳ از کتاب خود (اجرای برنامه‌های اضافی) در مورد امکان اجرای مستقیم مدل شبکه ای که قبل از این مرحله وجود دارد بحث می‌کند:

مشخصات تولید شده در پایان مرحله سیستم زمان‌بندی، در اصل، قابلیت اجرای مستقیم را دارد. محیط لازم شامل یک پردازنده برای هر فرایند، وسیله ای معادل بافر بدون مرز برای هر جریان داده و برخی از دستگاه‌های ورودی و خروجی است که سیستم به دنیای واقعی متصل است. *مطمئناً چنین شرایطی توسط نرم‌افزار مناسبی که در حال اجرا بر روی یک دستگاه به اندازه کافی قدرتمند است فراهم می‌شود.* *گاهی اوقات، چنین اجرای مستقیم مشخصات امکان‌پذیر خواهد بود، و حتی ممکن است یک انتخاب معقول باشد.*
FBP توسط MA Jackson به عنوان رویکردی شناخته شد که از روش وی در مورد «تجزیه برنامه در فرآیندهای پی در پی که توسط یک مکانیزم شبیه به کوروتین ارتباط برقرار می‌شود» پیروی می‌کند.

WB Ackerman یک زبان کاربردی را به عنوان زبان تعریف می‌کند که تمام مراحل پردازش آن را با استفاده از اپراتورهای اعمال شده بر روی ارزش‌ها انجام می‌دهد. اولین زبان کاربردی شناخته شده LISP بود.

یک جزء FBP را می‌توان تابعی دانست که جریان (های) ورودی خود را به جریان (های) خروجی آن تبدیل می‌کند. این توابع سپس برای ایجاد تحولات پیچیده‌تر ترکیب می‌شوند، همان‌طور که در اینجا نشان داده شده‌است:

 دو عملکرد تغذیه یکی
اگر همان‌طور که نشان داده می‌شود جریان را با حروف کوچکتر نشان دهیم، نمودار فوق می‌تواند به صورت زیر به صورت زیر نشان داده شود:

```
 c = G (F (a) , F (b))؛
```

همان‌طور که در نماد عملکردی F می‌تواند دو بار استفاده شود زیرا فقط با مقادیر کار می‌کند و بنابراین عوارض جانبی ندارد، در FBP دو مورد از یک جزء خاص ممکن است همزمان با یکدیگر باشد و بنابراین اجزای FBP نباید عوارض جانبی داشته باشند. یا نماد عملکردی به وضوح می‌تواند مورد استفاده قرار گیرد تا حداقل بخشی از یک شبکه FBP را نشان دهد.

سپس این سؤال پیش می‌آید که آیا مؤلفه‌های FBP می‌توانند خودشان با استفاده از نماد عملکردی بیان شوند. WH Burge نشان داد که چگونه می‌توان با استفاده از شیوه برنامه نویسی بازگشتی، برنامه‌ها را تولید کرد، اما این اثر از نظر (جریان) مقادیر اتمی بود. در FBP، لازم است که بتوانید قطعات داده‌های ساخت یافته (IPهای FBP) را توصیف و پردازش کنید.

علاوه بر این، اکثر سیستم‌های کاربردی فرض می‌کنند که تمام داده‌ها در همان زمان در حافظه موجود هستند، در حالی که برنامه‌های FBP باید در عین حال که از منابع محدود استفاده می‌کنند قادر به پردازش جریان‌های طولانی مدت از داده‌ها باشند. فریدمن و ویز با افزودن مفهوم "منفی تنبل" به کارهای Burge راهی برای انجام این کار پیشنهاد دادند. این امر شرط حذف هر دو استدلال "منفی" را در همان لحظه زمان حذف کرد. "منفی تنبل" در واقع جریان ایجاد نمی‌کند تا هر دو استدلال آن محقق شود - قبل از آن به سادگی "وعده" ای را برای انجام این کار ثبت می‌کند. این اجازه می‌دهد تا یک جریان از جلو به صورت پویا تحقق یابد، اما با یک پایان عقب غیر واقعی. پایان جریان تا پایان فرایند غیر واقعی باقی می‌ماند، در حالی که آغاز دنباله ای طولانی مدت از موارد است.

### لیندا

به نظر می‌رسد بسیاری از مفاهیم FBP طی سالها به‌طور مستقل در سیستم‌های مختلف کشف شده‌اند. لیندا، که در بالا به آن اشاره شد، یکی از این موارد است. تفاوت بین این دو تکنیک توسط تکنیک تعادل بار "لینداً مدرسه پیراناها "نشان داده شده‌است - در FBP، این نیاز به یک مؤلفه اضافی" بالانسور بار "دارد که درخواست‌ها را به مؤلفه ای در لیستی منتقل می‌کند که کمترین تعداد IP را در انتظار دارد. پردازش می‌شود واضح است که FBP و لیندا با یکدیگر ارتباط نزدیکی دارند و می‌توان از آنها به راحتی برای شبیه‌سازی دیگری استفاده کرد.

### برنامه نویسی شی گرا

یک شیء در OOP را می‌توان به عنوان یک واحد نیمه خودمختار توصیف کرد که شامل هر دو اطلاعات و رفتار است. اشیاء با استفاده از «فراخوانی متد»، که در واقع تماسهای زیرمجموعه ای هستند، ارتباط می‌یابند که بطور غیرمستقیم از طریق کلاسی که شیء گیرنده متعلق به آن است انجام می‌شود. از طریق تماسهای متد به داده‌های داخلی این شیء دسترسی پیدا می‌کند، بنابراین این نوعی از اطلاعات پنهان یا «کپسوله سازی» است. اما محصور کردن، OOP را پیش‌بینی می‌کند - دیوید پرناس یکی از مقالات اصلی را در اوایل دهه ۷۰ نوشت: - و یک مفهوم اساسی در محاسبات است. Encapsulation همان جوهر FBP است که ممکن است بعنوان یک جعبه سیاه تصور شود و برخی از داده‌های ورودی آن را به داده‌های خروجی خود انجام می‌دهد. در FBP، بخشی از مشخصات یک جزء فرمت‌های داده و ساختارهای جریان است که می‌تواند بپذیرد و آنهایی را که تولید می‌کند. این نوعی از طراحی با قرارداد است. علاوه بر این، داده‌های موجود در IP فقط با فرایند دارایی فعلی قابل دسترسی هستند. محصور سازی نیز با داشتن فرآیندهای بیرونی از داخلی می‌تواند در سطح شبکه پیاده‌سازی شود.

مقاله ای توسط C. Ellis و S. Gibbs بین اشیاء فعال و اشیاء غیرفعال تمایز قایل است. همان‌طور که در بالا گفته شد، اشیاء غیرفعال شامل اطلاعات و رفتار هستند، اما آنها نمی‌توانند *زمان* این رفتار را تعیین کنند. اشیاء فعال از طرف دیگر می‌توانند این کار را انجام دهند. الیس و گیبز در مقاله خود اظهار داشتند که اشیاء فعال نسبت به اشیاء غیرفعال پتانسیل بسیار بیشتری برای توسعه سیستمهای نگهدارنده دارند. یک برنامه FBP را می‌توان ترکیبی از این دو نوع شیء دانست، جایی که فرآیندهای FBP با اشیاء فعال مطابقت دارند، در حالی که IPها با اشیاء غیرفعال مطابقت دارند.

### مدل بازیگر

FBP بازیگر کارل هیویت را به عنوان یک فرایند ناهمزمان با ۲ پورت در نظر می‌گیرد: یکی برای پیام‌های ورودی و دیگری برای سیگنال‌های کنترل. سیگنال کنترل پس از هر دور اجرا توسط خود بازیگر منتشر می‌شود. هدف از این سیگنال جلوگیری از اجرای موازی بدن بازیگر است و از این رو اجازه می‌دهد بدون هماهنگی به زمینه‌های موضوع بازیگر دسترسی پیدا کنید.

جستارهای وابسته
---------------

* اشیاء فعال
* مدل بازیگر
* Apache NiFi
* BMDFM
* ارتباط فرآیندهای متوالی (CSP)
* محاسبات همزمان
* گردش داده‌ها
* نمودار جریان داده
* برنامه نویسی Dataflow
* FBD - نمودارهای عملکرد عملکرد (یک زبان برنامه نویسی در استاندارد IEC 61131)
* برنامه‌ریزی واکنشی عملکردی
* لیندا (زبان هماهنگی)
* سیستم عاملهای توسعه کم کد
* MapReduce
* گره-قرمز
* برنامه نویسی خط لوله
* VRL استودیو
* وین استیونز
* XProc
* لوله‌های یاهو

منابع
-----

1. ↑  Carriero, Nicholas; Gelernter, David (1989). "Linda in context". *Communications of the ACM*. **32** (4): 444–458. doi:10.1145/63334.63337.
2. ↑  Gelernter, David; Carriero, Nicholas (1992). "Coordination languages and their significance". *Communications of the ACM*. **35** (2): 97–107. doi:10.1145/129630.129635.
3. ↑  "Archived copy". Archived from the original on 2014-09-06. Retrieved 2014-09-06.`{{cite web}}`: نگهداری یادکرد:عنوان آرشیو به جای عنوان (link)
4. ↑  "Programming" by M. A. Jackson, published in *Proceedings of Workshop on Software in High-Energy Physics, pages 1-12*, CERN, Geneva, 4–6 October 1982
5. 1 2  "A System development method بایگانی‌شده در ۲۰۱۲-۰۲-۰۶ توسط Wayback Machine" by M. A. Jackson, published in *Tools and notions for program construction: An advanced course*,
Cambridge University Press, 1982
6. ↑  "JSP In Perspective" Michael Jackson; JSP in Perspective; in Software Pioneers: Contributions to Software Engineering; Manfred Broy, Ernst Denert eds; Springer, 2002
7. ↑  W.B. Ackerman, *Data Flow Languages*, Proceedings National Computer Conference, pp. 1087-1095, 1979
8. ↑  W.H. Burge, *Recursive Programming Techniques*, Addison-Wesley, Reading, MA, 1975
9. ↑  Parnas, D. L. (1972). "On the criteria to be used in decomposing systems into modules". *Communications of the ACM*. **15** (12): 1053–1058. doi:10.1145/361598.361623.
10. ↑  C. Ellis and S. Gibbs, *Active Objects: Realities and Possibilities*, in *Object-Oriented Concepts, Databases, and Applications*, eds. W. Kim and F.H. Lochovsky, ACM Press, Addison-Wesley, 1989

پیوند به بیرون
--------------